olddoc 1.5.1 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b5ed269def320cfe052cabbe1ccaf952cb67ea35f218f71c697e64602e53160a
4
- data.tar.gz: a08e13570e7b1c29314d9d9d1a84dfef34eaa3b142d770037acc92a6261e2176
3
+ metadata.gz: 1400bf9d3e94d012404961bf1f665ba6006eb0edc8bdc5e55c178ef068893828
4
+ data.tar.gz: a3c8a0d8e9642af7c00f92592c5d61e52a430a321b5e26aac604fac1f9b05b40
5
5
  SHA512:
6
- metadata.gz: 1b8668a99554c443cedf069975c1bcdec7e8ebdc56d5527f799400b93c7e27008d11c007e281fe1d5f638aff19fffbdd0b475130fa3d1b2d28a2b3153cc27b4f
7
- data.tar.gz: 23a4fa35c6a4b1f099917db814312a15af705c9f24fe5211a152ba7b72da6a66ed4111fedc1ed69735d4b564f1f62b5a700c6d9af78cb4ed9e0deaf879a3154c
6
+ metadata.gz: a48ad6a40397a4fa28eccd7c1346f7eb65d8625e73c2be73585226fe7c6acf858e6175043fe93021f05bf8a2ff3b57cd3a0c9e9db584cc046bb680b64f41ba88
7
+ data.tar.gz: 10f049dc25df53ef808a9b8afe74f80889f61f116938c0573dab427299c622608e7b7aed775ad9e530421cc465647effe39d41f4fb03658e9a2759cbaf9e32b4
@@ -1,11 +1,20 @@
1
1
  ---
2
- cgit_url: https://80x24.org/olddoc.git
3
- git_url: git://80x24.org/olddoc.git
2
+ cgit_url:
3
+ - https://80x24.org/olddoc.git
4
+ - https://ou63pmih66umazou.onion/olddoc.git
5
+ git_url: https://80x24.org/olddoc.git
4
6
  rdoc_url: https://80x24.org/olddoc/
5
- ml_url: https://80x24.org/olddoc-public/
6
- nntp_url: nntp://news.public-inbox.org/inbox.comp.lang.ruby.olddoc
7
+ ml_url:
8
+ - https://80x24.org/olddoc-public/
9
+ - http://ou63pmih66umazou.onion/olddoc-public/
10
+ nntp_url:
11
+ - nntps://news.public-inbox.org/inbox.comp.lang.ruby.olddoc
12
+ - nntp://ou63pmih66umazou.onion/inbox.comp.lang.ruby.olddoc
13
+ imap_url:
14
+ - imaps://news.public-inbox.org/inbox.comp.lang.ruby.olddoc.0
15
+ - imap://ou63pmih66umazou.onion/inbox.comp.lang.ruby.olddoc.0
7
16
  merge_html:
8
17
  olddoc_1: Documentation/olddoc.1.html
9
18
  olddoc_5: Documentation/olddoc.5.html
10
19
  public_email: olddoc-public@80x24.org
11
- source_code: git clone git://80x24.org/olddoc
20
+ source_code: git clone https://80x24.org/olddoc.git
@@ -2,3 +2,4 @@
2
2
  *.1
3
3
  *.5
4
4
  *.html
5
+ *.txt
@@ -1,26 +1,32 @@
1
- # Copyright (C) 2015-2016 all contributors <olddoc-public@80x24.org>
1
+ # Copyright (C) 2015-2019 all contributors <olddoc-public@80x24.org>
2
2
  # License: GPL-3.0+ <https://www.gnu.org/licenses/gpl-3.0.txt>
3
3
  all::
4
4
 
5
5
  INSTALL = install
6
- PANDOC = pandoc
7
- PANDOC_OPTS = -f markdown --email-obfuscation=none
8
- pandoc = $(PANDOC) $(PANDOC_OPTS)
9
- pandoc_html = $(pandoc) --toc -t html --no-wrap
6
+ POD2MAN = pod2man
7
+ -include ../GIT-VERSION-FILE
8
+ release := olddoc $(VERSION)
9
+ POD2MAN_OPTS = -v -r '$(release)' --stderr -d 1994-10-02 -c 'olddoc user manual'
10
+ pod2man = $(POD2MAN) $(POD2MAN_OPTS)
11
+ POD2TEXT = pod2text
12
+ POD2TEXT_OPTS = --stderr
13
+ pod2text = $(POD2TEXT) $(POD2TEXT_OPTS)
10
14
 
15
+ m1 =
16
+ m1 += olddoc.1
11
17
 
12
- man1 := olddoc.1
13
- man5 := olddoc.5
14
- man7 :=
18
+ m5 =
19
+ m5 += olddoc.5
15
20
 
16
- html1 := $(addsuffix .html, $(man1))
17
- html5 := $(addsuffix .html, $(man5))
18
- html7 := $(addsuffix .html, $(man7))
21
+ m7 =
22
+
23
+ man1 := $(m1)
24
+ man5 := $(m5)
25
+ man7 := $(m7)
19
26
 
20
27
  all:: man
21
28
 
22
29
  man: $(man1) $(man5) $(man7)
23
- html: $(html1) $(html5) $(html7)
24
30
 
25
31
  prefix ?= $(HOME)
26
32
  mandir ?= $(prefix)/share/man
@@ -30,24 +36,47 @@ man7dir = $(mandir)/man7
30
36
 
31
37
  gem-man: man
32
38
  $(INSTALL) -d -m 755 ../man
33
- test -z "$(man1)" || $(INSTALL) -m 644 $(man1) ../man
34
- test -z "$(man5)" || $(INSTALL) -m 644 $(man5) ../man
39
+ $(INSTALL) -m 644 $(man1) ../man
40
+ $(INSTALL) -m 644 $(man5) ../man
35
41
  test -z "$(man7)" || $(INSTALL) -m 644 $(man7) ../man
36
42
 
37
43
  install-man: man
38
- $(INSTALL) -d -m 755 $(DESTDIR)$(mandir)
39
- test -z "$(man1)" || $(INSTALL) -d -m 755 $(DESTDIR)$(man1dir)
40
- test -z "$(man5)" || $(INSTALL) -d -m 755 $(DESTDIR)$(man5dir)
44
+ $(INSTALL) -d -m 755 $(DESTDIR)$(man1dir)
45
+ $(INSTALL) -d -m 755 $(DESTDIR)$(man5dir)
41
46
  test -z "$(man7)" || $(INSTALL) -d -m 755 $(DESTDIR)$(man7dir)
42
- test -z "$(man1)" || $(INSTALL) -m 644 $(man1) $(DESTDIR)$(man1dir)
43
- test -z "$(man5)" || $(INSTALL) -m 644 $(man5) $(DESTDIR)$(man5dir)
47
+ $(INSTALL) -m 644 $(man1) $(DESTDIR)$(man1dir)
48
+ $(INSTALL) -m 644 $(man5) $(DESTDIR)$(man5dir)
44
49
  test -z "$(man7)" || $(INSTALL) -m 644 $(man7) $(DESTDIR)$(man7dir)
45
50
 
46
- %: %.txt
47
- $(pandoc) -s -t man < $< > $@+ && mv $@+ $@
51
+ %.1 : %.1.pod
52
+ $(pod2man) -s 1 $< $@+
53
+ mv $@+ $@
54
+
55
+ %.5 : %.5.pod
56
+ $(pod2man) -s 5 $< $@+
57
+ mv $@+ $@
58
+
59
+ %.7 : %.7.pod
60
+ $(pod2man) -s 7 $< $@+
61
+ mv $@+ $@
62
+
63
+ mantxt = $(addsuffix .txt, $(m1) $(m5) $(m7))
64
+
65
+ txt :: $(mantxt)
66
+
67
+ all :: txt
68
+
69
+ %.txt : %.pod
70
+ $(pod2text) $< $@+
71
+ touch -r $< $@+
72
+ mv $@+ $@
48
73
 
49
- %.html : %.txt
50
- $(pandoc_html) < $< > $@+ && mv $@+ $@
74
+ html : podtxt2html $(mantxt)
75
+ ./podtxt2html $(mantxt)
51
76
 
52
77
  clean::
53
- $(RM) $(man1) $(man5) $(man7) $(html1) $(html5) $(html7)
78
+ $(RM) $(man1) $(man5) $(man7)
79
+ $(RM) $(addsuffix .txt.gz, $(m1) $(m5) $(m7))
80
+ $(RM) $(addsuffix .txt, $(m1) $(m5) $(m7))
81
+ $(RM) $(addsuffix .html, $(subst .,_,$(m1) $(m5) $(m7)))
82
+ $(RM) $(addsuffix .html.gz, $(subst .,_,$(m1) $(m5) $(m7)))
@@ -0,0 +1,21 @@
1
+ =head1 NAME
2
+
3
+ olddoc - old-fashioned RDoc HTML generator
4
+
5
+ =head1 SYNOPSYS
6
+
7
+ olddoc prepare
8
+
9
+ rdoc -f oldweb
10
+
11
+ rdoc -f dark216
12
+
13
+ =head1 DESCRIPTION
14
+
15
+ olddoc features dark216, and old-fashioned RDoc HTML generator.
16
+ You can also use "olddoc prepare" to generate NEWS files from
17
+ git tags.
18
+
19
+ =head1 SEE ALSO
20
+
21
+ L<olddoc(5)>
@@ -1,29 +1,26 @@
1
- % olddoc(1) olddoc user manual
2
-
3
- # NAME
1
+ =head1 NAME
4
2
 
5
3
  .olddoc.yml - olddoc config file format
6
4
 
7
- # SYNOPSIS
5
+ =head1 SYNOPSIS
8
6
 
9
7
  A YAML file in the top-level project directory named ".olddoc.yml"
10
8
 
11
- # DESCRIPTION
9
+ =head1 DESCRIPTION
12
10
 
13
11
  As olddoc favors consistency over configuration, there is minimal
14
12
  configuration to deal with.
15
13
 
16
- # KEYS
14
+ =head1 KEYS
17
15
 
18
- `rdoc_url`, `cgit_url`, and `nntp_url` should be obvious
16
+ `rdoc_url`, `cgit_url`, `imap_url`, and `nntp_url` should be obvious
19
17
 
20
18
  `merge_html` is a key-value mapping of (empty) RDoc source files to an
21
19
  HTML file that will be merged into RDoc after-the-fact. It is useful
22
20
  for merging non-RDoc generated HTML into the project.
23
21
 
24
- `ml_url` is the mailing list archive location.
25
- `public_email` is the email address of a publically archived mailing list
26
- at `ml_url`
22
+ `ml_url` is the mail archive location.
23
+ `public_email` is the email address of a mail archived at `ml_url`
27
24
 
28
25
  As of olddoc 1.2.0, `ml_url` and `nntp_url` may be YAML arrays
29
26
  with multiple URLs.
@@ -33,6 +30,6 @@ commands or URLs. This allows users of arbitrary version
33
30
  control systems to specify instructions for getting the code
34
31
  and not assume users are familiar with any particular system.
35
32
 
36
- # SEE ALSO
33
+ =head1 SEE ALSO
37
34
 
38
- olddoc(1)
35
+ L<olddoc(1)>
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/ruby
2
+ # Copyright (C) 2019 all contributors <olddoc-public@80x24.org>
3
+ # License: GPL-3.0+ <https://www.gnu.org/licenses/gpl-3.0.txt>
4
+
5
+ # pod2html isn't to my liking, and we need to generate anchors
6
+ # compatible with what pandoc was generating to avoid breaking
7
+ # links. Takes pod2text-generated text and transforms it to
8
+ # an HTML fragment
9
+
10
+ txts = ARGV
11
+ links = {}
12
+ txts.each do |f|
13
+ if f =~ /(\A[\w\-]+)\.(\d)\.txt\z/
14
+ base = $1
15
+ section = $2
16
+ links["#{base}(#{section})"] = "#{base}_#{section}.html"
17
+ else
18
+ abort "#{f} is not of <BASE>.<SECTION>.txt\n"
19
+ end
20
+ end
21
+
22
+ linkre = links.keys.map { |x| Regexp.escape(x) }.join('|')
23
+
24
+ sections = '[A-Z][A-Z ]+'
25
+ txts.each do |f|
26
+ str = File.read(f)
27
+ str = str.split(/^(#{sections})$/mo)
28
+ str = str.map! do |s|
29
+ case s
30
+ when /\A(#{sections})$/o
31
+ # this is to be compatible with HTML fragments pandoc used
32
+ sec = $1
33
+ anchor = sec.downcase.tr(' ', '-')
34
+ %Q(<h1\nid=#{anchor}>#{sec}</h1>)
35
+ else
36
+ s.encode!(xml: :text)
37
+ s.gsub!(/\b(#{linkre})/mo) do |m|
38
+ manref = $1
39
+ if url = links[manref]
40
+ %Q(<a\nhref="#{url}">#{manref}</a>)
41
+ else
42
+ manref
43
+ end
44
+ end
45
+ s.rstrip!
46
+ s.empty? ? '' : "<pre>#{s}</pre>"
47
+ end # case s
48
+ end.join
49
+
50
+ html = f.sub(/.txt\z/, '.html')
51
+ tmp = html + '+'
52
+ File.open(tmp, 'w') { |f| f.write(str) }
53
+ File.rename(tmp, html)
54
+ end
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env ruby
2
- # Copyright (C) 2016 all contributors <olddoc-public@80x24.org>
2
+ # Copyright (C) 2016-2019 all contributors <olddoc-public@80x24.org>
3
3
  # License: GPL-3.0+ <https://www.gnu.org/licenses/gpl-3.0.txt>
4
4
  # frozen_string_literal: true
5
5
  CONSTANT = "Olddoc::VERSION"
6
6
  RVF = "lib/olddoc/version.rb"
7
7
  GVF = "GIT-VERSION-FILE"
8
- DEF_VER = "v1.5.1"
8
+ DEF_VER = "v1.9.0"
9
9
  vn = DEF_VER.dup
10
10
 
11
11
  # First see if there is a version file (included in release tarballs),
@@ -41,7 +41,7 @@ doc: $(placeholders)
41
41
  $(MAKE) -C Documentation html
42
42
  rm -rf doc
43
43
  olddoc prepare
44
- rdoc --debug -f oldweb
44
+ rdoc --debug -f dark216
45
45
  olddoc merge
46
46
  ln NEWS.atom.xml doc/
47
47
 
data/README CHANGED
@@ -3,15 +3,17 @@
3
3
  olddoc contains old-fashioned document generators for those who do not
4
4
  wish to impose bloated, new-fangled web cruft on their readers.
5
5
 
6
- olddoc contains oldweb, an HTML generator without any images, frames,
7
- CSS, or JavaScript. It is designed for users of text-based browsers
8
- and/or low-bandwidth connections. oldweb focuses on text as it is
9
- the lowest common denominator for accessibility and compatibility
6
+ olddoc contains dark216, a HTML generator without any images, frames,
7
+ or JavaScript. It is designed for users of text-based browsers
8
+ and/or low-bandwidth connections; yet respects user preference for
9
+ light color schemes in new CSS browsers while favoring darkness for
10
+ power savings on OLED and CRT displays. dark216 focuses on text as
11
+ it is the lowest common denominator for accessibility and compatibility
10
12
  with people and hardware.
11
13
 
12
14
  == Reasons
13
15
 
14
- * No CSS. Encouraging users to use CSS leads to problems like
16
+ * No CSS required. Encouraging users to use CSS leads to problems like
15
17
  copy-paste hijacking: https://thejh.net/misc/website-terminal-copy-paste
16
18
  External CSS also increases page load time as it often blocks page
17
19
  rendering. Asynchronous loading of CSS also causes accessibility
@@ -38,7 +40,7 @@ missing out!
38
40
 
39
41
  gem install olddoc
40
42
  cd $ANY_RDOC_USING_RUBY_PROJECT
41
- rdoc -f oldweb
43
+ rdoc -f dark216
42
44
 
43
45
  You can also use olddoc to generate NEWS entries
44
46
  assuming you have git tags, a README file and .olddoc.yml
@@ -52,7 +54,7 @@ such as pandoc(1). This requries an appropriately configured
52
54
 
53
55
  == Source code
54
56
 
55
- git clone git://80x24.org/olddoc
57
+ git clone https://80x24.org/olddoc.git
56
58
 
57
59
  Please use git-format-patch(1) and git-send-email(1) distributed with
58
60
  the git(7) suite for generating and sending patches. Please format
@@ -62,14 +64,15 @@ with git(7)) and send them via email to <olddoc-public@80x24.org>
62
64
  == Contact
63
65
 
64
66
  All feedback (comments, results, feature requests, bug reports, patches,
65
- pull-requests) via plain-text mail to the mailing list is very much
66
- appreciated.
67
+ pull-requests) via plain-text email is very much appreciated.
67
68
 
68
- Please send plain-text mail to the list at <olddoc-public@80x24.org>
69
+ Please send plain-text email to us at <olddoc-public@80x24.org>
70
+ Use reply-to-all as we do not require any sort of subscription.
69
71
  HTML will not be read. olddoc is for GUI-phobes, by GUI-phobes.
70
- Mailing list archives available at https://80x24.org/olddoc-public/
71
- and nntp://news.public-inbox.org/inbox.comp.lang.ruby.olddoc
72
- No subscription will ever be necessary to post to the mailing list.
72
+ We archive all of our mail publically at:
73
+
74
+ https://80x24.org/olddoc-public/
75
+ nntp://news.public-inbox.org/inbox.comp.lang.ruby.olddoc
73
76
 
74
77
  == License
75
78
 
data/Rakefile CHANGED
@@ -21,7 +21,7 @@ task :rsync_docs do
21
21
  gz
22
22
  end
23
23
 
24
- files = `git ls-files Documentation/*.txt`.split(/\n/)
24
+ files = `git ls-files -o Documentation/*.txt`.split(/\n/)
25
25
  files.concat(top)
26
26
  files.concat(%w(NEWS NEWS.atom.xml))
27
27
  files.concat(Dir["doc/*.html"].to_a)
data/bin/olddoc CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- # Copyright (C) 2015, all contributors <olddoc-public@80x24.org>
2
+ # Copyright (C) 2015,2019 all contributors <olddoc-public@80x24.org>
3
3
  $stderr.sync = $stdout.sync = true
4
4
  tasks = %w(prepare merge)
5
5
  usage = "Usage: #{File.basename($0)} [#{tasks.join('|')}]"
@@ -10,6 +10,8 @@ when "prepare"
10
10
  Olddoc::Prepare.new(opts).run
11
11
  when "merge"
12
12
  Olddoc::Merge.new(opts).run
13
+ when "man2html"
14
+ Olddoc::Man2HTML.new(opts).run(ARGV[1..-1])
13
15
  else
14
16
  warn "#{$0.inspect} #{ARGV.inspect} not understood"
15
17
  abort usage
@@ -0,0 +1,41 @@
1
+ # Copyright (C) 2019 all contributors <olddoc-public@80x24.org>
2
+ # License: GPL-3.0+ <https://www.gnu.org/licenses/gpl-3.0.txt>
3
+
4
+ # Loosely derived from Darkfish in the main rdoc distribution
5
+ require_relative 'oldweb'
6
+
7
+ # dark216 is an \RDoc template and not intended as a programming API.
8
+ # It respect prefers-color-scheme:light on newer browsers with CSS
9
+ # support, but favors darkness for power-savings.
10
+ # You may specify it as an \RDoc formatter:
11
+ #
12
+ # rdoc -f dark216 ...
13
+ class Dark216 < Oldweb
14
+ RDoc::RDoc.add_generator(self) # :nodoc:
15
+ include ERB::Util # :nodoc:
16
+
17
+ # description of the generator
18
+ DESCRIPTION = 'minimal dark HTML generator'
19
+
20
+ # default to a dark, web-safe (216 color) palette for power-savings.
21
+ # Color-capable browsers can respect the prefers-color-scheme:light
22
+ # @media query (browser support a work-in-progress)
23
+ STYLE = <<'EOF'.gsub(/^\s*/m, '').delete!("\n") # :nodoc:
24
+ @media screen {
25
+ *{background:#000;color:#ccc}
26
+ a{color:#69f;text-decoration:none}
27
+ a:visited{color:#96f}
28
+ }
29
+ @media screen AND (prefers-color-scheme:light) {
30
+ *{background:#fff;color:#333}
31
+ a{color:#00f;text-decoration:none}
32
+ a:visited{color:#808}
33
+ }
34
+ EOF
35
+
36
+ def initialize(*args) # :nodoc:
37
+ super
38
+ @oldweb_style = STYLE
39
+ end
40
+ end
41
+ # :startdoc:
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015-2016 all contributors <olddoc-public@80x24.org>
1
+ # Copyright (C) 2015-2019 all contributors <olddoc-public@80x24.org>
2
2
  # License: GPL-3.0+ <https://www.gnu.org/licenses/gpl-3.0.txt>
3
3
  module Olddoc # :nodoc:
4
4
  autoload :Gemspec, 'olddoc/gemspec'
@@ -8,6 +8,7 @@ module Olddoc # :nodoc:
8
8
  autoload :NewsRdoc, 'olddoc/news_rdoc'
9
9
  autoload :Prepare, 'olddoc/prepare'
10
10
  autoload :Readme, 'olddoc/readme'
11
+ autoload :Man2HTML, 'olddoc/man2html'
11
12
 
12
13
  def self.config(path = ".olddoc.yml")
13
14
  File.readable?(path) and return YAML.load(File.read(path))
@@ -16,3 +17,4 @@ module Olddoc # :nodoc:
16
17
  end
17
18
  end
18
19
  require_relative 'oldweb'
20
+ require_relative 'dark216'
@@ -9,7 +9,7 @@ module Olddoc::History # :nodoc:
9
9
 
10
10
  # returns a cgit URI for a given +tag_name+
11
11
  def tag_uri(tag_name)
12
- uri = @cgit_uri.dup
12
+ uri = @cgit_uri[0].dup
13
13
  uri.path += "/tag/"
14
14
  uri.query = "id=#{tag_name}"
15
15
  uri
@@ -0,0 +1,149 @@
1
+ # Copyright (C) 2019 all contributors <olddoc-public@80x24.org>
2
+ # License: GPL-3.0+ <https://www.gnu.org/licenses/gpl-3.0.txt>
3
+ # frozen_string_literal: true
4
+ require 'digest'
5
+ require 'optparse'
6
+
7
+ # linkifier for manpages rendered to a terminal. man2html(1) and
8
+ # groff generate too much style
9
+
10
+ class Olddoc::Man2HTML # :nodoc:
11
+ SALT = rand
12
+ LINK_RE = %r{([\('!])?\b((?:ftps?|https?|nntps?|gopher|imaps?)://
13
+ [\@:\w\.-]+(?:/
14
+ (?:[a-z0-9\-\._~!\$\&\';\(\)\*\+,;=:@/%]*)
15
+ (?:\?[a-z0-9\-\._~!\$\&\';\(\)\*\+,;=:@/%]+)?
16
+ (?:\#[a-z0-9\-\._~!\$\&\';\(\)\*\+,;=:@/%\?]+)?
17
+ )?
18
+ )}xi
19
+
20
+ PAIRS = {
21
+ "(" => %r/(\)[\.,;\+]?)\z/, # Markdown (,), Ruby (+) (, for arrays)
22
+ "'" => %r/('[\.,;\+]?)\z/, # Perl / Ruby
23
+ "!" => %r/(![\.,;\+]?)\z/, # Perl / Ruby
24
+ }
25
+
26
+ def initialize(opts) # :nodoc:
27
+ end
28
+
29
+ def run(argv) # :nodoc:
30
+ out = $stdout
31
+ OptionParser.new("", 24, ' ') do |opts|
32
+ opts.on('-o', '--output PATH', 'output to given file') { |path|
33
+ out = File.open(path, 'w')
34
+ }
35
+ opts.parse!(argv)
36
+ end
37
+ argv[0] or abort 'manpage required'
38
+ cols = '72'
39
+ env = ENV.to_hash
40
+ env.merge!({ 'COLUMNS' => cols, 'MANWIDTH' => cols, 'TERM' => 'dumb' })
41
+
42
+ # note: I don't care for the styles groff and man2html throw
43
+ # on us, I just want indented and wrapped text with <a hrefs>
44
+ # for URLs.
45
+
46
+ # try man-db options, first:
47
+ str = IO.popen(env, ['man', '--nh', '--nj', *argv], &:read)
48
+
49
+ if str.empty? || !$?.success?
50
+ str = IO.popen(env, ['man', *argv], &:read)
51
+ end
52
+ if $?.success?
53
+ sections = '[A-Z][A-Z ]+'
54
+ str = str.split(/^(#{sections})$/mo)
55
+
56
+ str = str.map! do |s|
57
+ case s
58
+ when /\A(#{sections})$/o
59
+ # this is to be compatible with HTML fragments pandoc used
60
+ sec = $1
61
+ anchor = sec.downcase.tr(' ', '-')
62
+ "<h1\nid=#{anchor.encode(xml: :attr)}>#{sec}</h1>"
63
+ else
64
+ state = linkify_1(s)
65
+ s.encode!(xml: :text)
66
+ linkify_2(state, s)
67
+ s.rstrip!
68
+ s.empty? ? '' : "<pre>#{s}</pre>"
69
+ end
70
+ end.join
71
+
72
+ out.print(str)
73
+
74
+ # use mtime of the original source
75
+ if out.respond_to?(:path)
76
+ path = out.path
77
+ out.close
78
+ stat = src_input_stat(argv)
79
+ File.utime(stat.atime, stat.mtime, path) if stat
80
+ end
81
+ end
82
+ end
83
+
84
+ def src_input_stat(argv)
85
+ argv.reverse_each do |f|
86
+ next unless File.file?(f)
87
+ return File.stat(f)
88
+ end
89
+
90
+ argv.reverse_each do |f|
91
+ path = IO.popen(%W(man -w #{f}), &:read)
92
+ path.chomp!
93
+ next unless File.file?(path)
94
+ return File.stat(path)
95
+ end
96
+ nil
97
+ end
98
+
99
+ def linkify_1(str) # :nodoc:
100
+ state = {}
101
+ str.gsub!(LINK_RE) do
102
+ head = $1 || ''
103
+ url = $2.dup
104
+ tail = ''.dup
105
+
106
+ # it's fairly common to end URLs in messages with
107
+ # '.', ',' or ';' to denote the end of a statement;
108
+ # assume the intent was to end the statement/sentence
109
+ # in English
110
+ if re = PAIRS[head]
111
+ url.sub!(re, '')
112
+ tail = $1
113
+ elsif url.sub!(/(\))?([\.,;])\z/, '')
114
+ tail = $2
115
+ # require ')' to be paired with '('
116
+ if $1 # ')'
117
+ if url.index('(').nil?
118
+ tail = ")#{tail}"
119
+ else
120
+ url += ')'
121
+ end
122
+ end
123
+ elsif url !~ /\(/ && url.sub!(/\)\z/, '')
124
+ tail = ')'
125
+ end
126
+
127
+ # salt this, as this could be exploited to show
128
+ # links in the HTML which don't show up in the raw mail.
129
+ key = Digest::MD5.hexdigest("#{url}#{SALT}").freeze
130
+ state[key] = url
131
+ "#{head}OLD-LINK-#{key}#{tail}"
132
+ end
133
+ state
134
+ end
135
+
136
+ def linkify_2(state, str) # :nodoc:
137
+ # Added "OLD-LINK-" prefix to avoid false-positives on git commits
138
+ str.gsub!(/\bOLD-LINK-([a-f0-9]{32})\b/) do
139
+ key = $1
140
+ url = state[key]
141
+ if url
142
+ %Q{<a\nhref=#{url.encode(xml: :attr)}>#{url.encode(xml: :text)}</a>}
143
+ else
144
+ # false positive or somebody tried to mess with us
145
+ key
146
+ end
147
+ end
148
+ end
149
+ end
@@ -32,9 +32,9 @@ module Olddoc::NewsAtom # :nodoc:
32
32
  def news_atom_xml
33
33
  project_name, short_desc, _ = readme_metadata
34
34
  new_tags = tags[0,10]
35
- atom_uri = @rdoc_uri.dup
35
+ atom_uri = @rdoc_uri[0].dup
36
36
  atom_uri.path += "NEWS.atom.xml"
37
- news_uri = @rdoc_uri.dup
37
+ news_uri = @rdoc_uri[0].dup
38
38
  news_uri.path += "NEWS.html"
39
39
 
40
40
  dst = ''
@@ -12,8 +12,8 @@ class Olddoc::Prepare # :nodoc:
12
12
  cgit_url = opts['cgit_url']
13
13
  rdoc_url && cgit_url or
14
14
  abort "rdoc_url and cgit_url required in .olddoc.yml for `prepare'"
15
- @rdoc_uri = URI.parse(rdoc_url)
16
- @cgit_uri = URI.parse(cgit_url)
15
+ @rdoc_uri = Array(rdoc_url).map { |u| URI.parse(u) }
16
+ @cgit_uri = Array(cgit_url).map { |u| URI.parse(u) }
17
17
  @name, @short_desc = readme_metadata
18
18
  end
19
19
 
@@ -5,7 +5,7 @@ require 'rdoc'
5
5
  require 'erb'
6
6
  require 'pathname'
7
7
  require 'yaml'
8
- require 'uri'
8
+ require 'cgi'
9
9
 
10
10
  # oldweb is an \RDoc template and not intended as a programming API.
11
11
  # You may specify it as an \RDoc formatter:
@@ -73,12 +73,25 @@ class Oldweb
73
73
  noindex = @old_cfg['noindex'] and noindex.each { |k| ni[k] = true }
74
74
  @old_cfg['noindex'] = ni
75
75
 
76
- if cgit_url = @old_cfg['cgit_url']
77
- cgit_url += '/tree/%s' # path name
78
- tag = @git_tag and cgit_url << "id=#{URI.escape(tag)}"
79
- cgit_url << '#n%d' # lineno
80
- @old_vcs_url = cgit_url
76
+ cgit_url = Array(@old_cfg['cgit_url'])
77
+ source = @old_cfg['source_code'] ||= []
78
+ if source.empty?
79
+ source << "git clone #{cgit_url[0]}" if cgit_url[0]
80
+ git_url = @old_cfg['git_url']
81
+ if git_url && git_url != cgit_url[0]
82
+ source << "git clone #{git_url}"
83
+ end
84
+ end
85
+
86
+ if cgit_url[0]
87
+ cgit_url.each do |u|
88
+ u += '/tree/%s' # path name
89
+ tag = @git_tag and u << "id=#{CGI.escape(tag)}"
90
+ u << '#n%d' # lineno
91
+ end
92
+ @old_vcs_url = cgit_url[0]
81
93
  end
94
+ @oldweb_style = nil # used by dark216
82
95
  end
83
96
 
84
97
  def generate # :nodoc:
@@ -269,7 +282,11 @@ class Oldweb
269
282
  erbout = "_erbout_#{file_var}"
270
283
  end
271
284
 
272
- template = klass.new(template, nil, '<>', erbout)
285
+ if ERB.instance_method(:initialize).parameters.assoc(:key)
286
+ template = klass.new(template, trim_mode: '<>', eoutvar: erbout)
287
+ else
288
+ template = klass.new(template, nil, '<>', erbout)
289
+ end
273
290
  @template_cache[file] = template
274
291
  end
275
292
 
@@ -280,7 +297,7 @@ class Oldweb
280
297
  def method_srclink(m) # :nodoc:
281
298
  url = @old_vcs_url or return ""
282
299
  line = m.line or return ""
283
- path = URI.escape(m.file_name)
300
+ path = CGI.escape(m.file_name)
284
301
  %Q(<a href="#{url % [ path, line ]}">source</a>)
285
302
  end
286
303
 
@@ -8,4 +8,8 @@ type="application/atom+xml" /><%
8
8
  end
9
9
  %><meta
10
10
  http-equiv="Content-Type"
11
- content="text/html; charset=<%= @options.charset %>">
11
+ content="text/html; charset=<%= @options.charset %>"><%
12
+ if @oldweb_style
13
+ %><style><%= @oldweb_style %></style><%
14
+ end
15
+ %>
@@ -2,7 +2,7 @@
2
2
  public_email = @old_cfg['public_email']
3
3
  private_email = @old_cfg['private_email']
4
4
  source_code = Array(@old_cfg['source_code']).dup
5
- archive_urls = Array(@old_cfg['ml_url']) + Array(@old_cfg['nntp_url'])
5
+ archive_urls = Array(@old_cfg.values_at(*%W(ml_url nntp_url imap_url))).flatten
6
6
  if url = archive_urls.shift %><hr /><pre>
7
7
  mail archives: <a
8
8
  href="<%= url %>"><%= url %></a><%
@@ -22,8 +22,11 @@ href="mailto:<%= private_email %>"><%= private_email %></a><%
22
22
  end
23
23
 
24
24
  if url_or_cmd = source_code.shift
25
+ url_or_cmd = url_or_cmd.sub(%r{\b(https?://\S+)}, "<a\nhref='\\1'>\\1</a>")
25
26
  %>
26
27
  source code: <%= url_or_cmd %>
27
- <% source_code.each do |x| %><%= "\t#{x}" %><% end
28
+ <% source_code.each do |x| %><%=
29
+ %Q{\t#{x.sub(%r{\b(https?://\S+)}, %Q{<a\nhref='\\1'>\\1</a>})}}
30
+ %><% end
28
31
  end
29
32
  %></pre><% end %>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: olddoc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.1
4
+ version: 1.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - olddoc hackers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-15 00:00:00.000000000 Z
11
+ date: 2020-08-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rdoc
@@ -45,8 +45,9 @@ files:
45
45
  - COPYING
46
46
  - Documentation/.gitignore
47
47
  - Documentation/GNUmakefile
48
- - Documentation/olddoc.1.txt
49
- - Documentation/olddoc.5.txt
48
+ - Documentation/olddoc.1.pod
49
+ - Documentation/olddoc.5.pod
50
+ - Documentation/podtxt2html
50
51
  - GIT-VERSION-GEN
51
52
  - GNUmakefile
52
53
  - INSTALL
@@ -55,9 +56,11 @@ files:
55
56
  - Rakefile
56
57
  - TODO
57
58
  - bin/olddoc
59
+ - lib/dark216.rb
58
60
  - lib/olddoc.rb
59
61
  - lib/olddoc/gemspec.rb
60
62
  - lib/olddoc/history.rb
63
+ - lib/olddoc/man2html.rb
61
64
  - lib/olddoc/merge.rb
62
65
  - lib/olddoc/news_atom.rb
63
66
  - lib/olddoc/news_rdoc.rb
@@ -104,8 +107,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
107
  - !ruby/object:Gem::Version
105
108
  version: '0'
106
109
  requirements: []
107
- rubyforge_project:
108
- rubygems_version: 2.7.3
110
+ rubygems_version: 3.0.2
109
111
  signing_key:
110
112
  specification_version: 4
111
113
  summary: old-fashioned Ruby documentation generator
@@ -1,21 +0,0 @@
1
- % olddoc(1) olddoc user manual
2
-
3
- # NAME
4
-
5
- olddoc - old-fashioned RDoc HTML generator
6
-
7
- # SYNOPSIS
8
-
9
- `olddoc` prepare
10
-
11
- `rdoc` -f oldweb
12
-
13
- # DESCRIPTION
14
-
15
- olddoc features oldweb, and old-fashioned RDoc HTML generator.
16
- You can also use "olddoc prepare" to generate NEWS files from
17
- git tags.
18
-
19
- # SEE ALSO
20
-
21
- olddoc(5)