* mdoc2man.rb: Make this work as a library.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3371 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
knu 2003-01-20 10:44:10 +00:00
parent 4a464c1fa2
commit c1d00ec453
2 changed files with 345 additions and 325 deletions

View File

@ -1,3 +1,7 @@
Mon Jan 20 19:43:41 2003 Akinori MUSHA <knu@iDaemons.org>
* mdoc2man.rb: Make this work as a library.
Mon Jan 20 18:22:40 2003 Nobuyoshi Nakada <nobu.nokada@softhome.net> Mon Jan 20 18:22:40 2003 Nobuyoshi Nakada <nobu.nokada@softhome.net>
* eval.c (rb_f_require): purge too many goto's. * eval.c (rb_f_require): purge too many goto's.

View File

@ -42,18 +42,39 @@
### $Id$ ### $Id$
### ###
$name = $date = $id = nil class Mdoc2Man
$refauthors = $reftitle = $refissue = $refdate = $refopt = nil def initialize
@name = @date = @id = nil
@refauthors = @reftitle = @refissue = @refdate = @refopt = nil
$optlist = 0 ### 1 = bullet, 2 = enum, 3 = tag, 4 = item @optlist = 0 ### 1 = bullet, 2 = enum, 3 = tag, 4 = item
$oldoptlist = 0 @oldoptlist = 0
$nospace = 0 ### 0, 1, 2 @nospace = 0 ### 0, 1, 2
$enum = 0 @enum = 0
$synopsis = true @synopsis = true
$reference = false @reference = false
$ext = false @ext = false
$extopt = false @extopt = false
$literal = false @literal = false
end
def mdoc2man(i, o)
i.each { |line|
if /^\./ !~ line
o.print line
o.print ".br\n" if @literal
next
end
line.slice!(0, 1)
next if /\\"/ =~ line
line = parse_macro(line) and o.print line
}
initialize
end
def parse_macro(line) def parse_macro(line)
words = line.split words = line.split
@ -67,22 +88,22 @@ def parse_macro(line)
when 'Li', 'Pf' when 'Li', 'Pf'
next next
when 'Xo' when 'Xo'
$ext = true @ext = true
retval << ' ' unless retval.empty? || /[\n ]\z/ =~ retval retval << ' ' unless retval.empty? || /[\n ]\z/ =~ retval
next next
when 'Xc' when 'Xc'
$ext = false @ext = false
retval << "\n" unless $extopt retval << "\n" unless @extopt
break break
when 'Bd' when 'Bd'
$literal = true if words[0] == '-literal' @literal = true if words[0] == '-literal'
retval << "\n" retval << "\n"
break break
when 'Ed' when 'Ed'
$literal = false @literal = false
break break
when 'Ns' when 'Ns'
$nospace = 1 if $nospace == 0 @nospace = 1 if @nospace == 0
retval.chomp!(' ') retval.chomp!(' ')
next next
when 'No' when 'No'
@ -96,56 +117,56 @@ def parse_macro(line)
end until words.empty? || /^[\.,]/ =~ words[0] end until words.empty? || /^[\.,]/ =~ words[0]
retval.chomp!(' ') retval.chomp!(' ')
retval << '\'\'' retval << '\'\''
$nospace = 1 if $nospace == 0 && /^[\.,]/ =~ words[0] @nospace = 1 if @nospace == 0 && /^[\.,]/ =~ words[0]
next next
when 'Sq', 'Ql' when 'Sq', 'Ql'
retval << '`' << words.shift << '\'' retval << '`' << words.shift << '\''
$nospace = 1 if $nospace == 0 && /^[\.,]/ =~ words[0] @nospace = 1 if @nospace == 0 && /^[\.,]/ =~ words[0]
next next
# when 'Ic' # when 'Ic'
# retval << '\\fB' << words.shift << '\\fP' # retval << '\\fB' << words.shift << '\\fP'
# next # next
when 'Oo' when 'Oo'
#retval << "[\\c\n" #retval << "[\\c\n"
$extopt = true @extopt = true
$nospace = 1 if $nospace == 0 @nospace = 1 if @nospace == 0
retval << '[' retval << '['
next next
when 'Oc' when 'Oc'
$extopt = false @extopt = false
retval << ']' retval << ']'
next next
end end
retval << ' ' if $nospace == 0 && !(retval.empty? || /[\n ]\z/ =~ retval) retval << ' ' if @nospace == 0 && !(retval.empty? || /[\n ]\z/ =~ retval)
$nospace = 0 if $nospace == 1 @nospace = 0 if @nospace == 1
case word case word
when 'Dd' when 'Dd'
$date = words.join(' ') @date = words.join(' ')
return nil return nil
when 'Dt' when 'Dt'
$id = words.join(' ') @id = words.join(' ')
return nil return nil
when 'Os' when 'Os'
retval << '.TH ' << $id << ' "' << $date << '" "' << retval << '.TH ' << @id << ' "' << @date << '" "' <<
words.join(' ') << '"' words.join(' ') << '"'
break break
when 'Sh' when 'Sh'
retval << '.SH' retval << '.SH'
$synopsis = (words[0] == 'SYNOPSIS') @synopsis = (words[0] == 'SYNOPSIS')
next next
when 'Xr' when 'Xr'
retval << '\\fB' << words.shift << retval << '\\fB' << words.shift <<
'\\fP(' << words.shift << ')' << words.shift '\\fP(' << words.shift << ')' << words.shift
break break
when 'Rs' when 'Rs'
$refauthors = [] @refauthors = []
$reftitle = '' @reftitle = ''
$refissue = '' @refissue = ''
$refdate = '' @refdate = ''
$refopt = '' @refopt = ''
$reference = true @reference = true
break break
when 'Re' when 'Re'
retval << "\n" retval << "\n"
@ -158,62 +179,62 @@ def parse_macro(line)
retval << @refauthors.shift retval << @refauthors.shift
# title # title
retval << ', \\fI' << $reftitle << '\\fP' retval << ', \\fI' << @reftitle << '\\fP'
# issue # issue
retval << ', ' << $refissue unless $refissue.empty? retval << ', ' << @refissue unless @refissue.empty?
# date # date
retval << ', ' << $refdate unless $refdate.empty? retval << ', ' << @refdate unless @refdate.empty?
# optional info # optional info
retval << ', ' << $refopt unless $refopt.empty? retval << ', ' << @refopt unless @refopt.empty?
retval << ".\n" retval << ".\n"
$reference = false @reference = false
break break
when 'Ux' when 'Ux'
retval << "UNIX" retval << "UNIX"
next next
end end
if $reference if @reference
case word case word
when '%A' when '%A'
@refauthors.unshift(words.join(' ')) @refauthors.unshift(words.join(' '))
break break
when '%T' when '%T'
$reftitle = words.join(' ') @reftitle = words.join(' ')
$reftitle.sub!(/^"/, '') @reftitle.sub!(/^"/, '')
$reftitle.sub!(/"$/, '') @reftitle.sub!(/"$/, '')
break break
when '%N' when '%N'
$refissue = words.join(' ') @refissue = words.join(' ')
break break
when '%D' when '%D'
$refdate = words.join(' ') @refdate = words.join(' ')
break break
when '%O' when '%O'
$refopt = words.join(' ') @refopt = words.join(' ')
break break
end end
end end
case word case word
when 'Nm' when 'Nm'
name = words.empty? ? $name : words.shift name = words.empty? ? @name : words.shift
$name ||= name @name ||= name
retval << ".br\n" if $synopsis retval << ".br\n" if @synopsis
retval << "\\fB" << name << "\\fP" retval << "\\fB" << name << "\\fP"
$nospace = 1 if $nospace == 0 && /^[\.,]/ =~ words[0] @nospace = 1 if @nospace == 0 && /^[\.,]/ =~ words[0]
next next
when 'Nd' when 'Nd'
retval << '\\-' retval << '\\-'
next next
when 'Fl' when 'Fl'
retval << '\\fB\\-' << words.shift << '\\fP' retval << '\\fB\\-' << words.shift << '\\fP'
$nospace = 1 if $nospace == 0 && /^[\.,]/ =~ words[0] @nospace = 1 if @nospace == 0 && /^[\.,]/ =~ words[0]
next next
when 'Ar' when 'Ar'
retval << '\\fI' retval << '\\fI'
@ -224,7 +245,7 @@ def parse_macro(line)
while words[0] == '|' while words[0] == '|'
retval << ' ' << words.shift << ' \\fI' << words.shift << '\\fP' retval << ' ' << words.shift << ' \\fI' << words.shift << '\\fP'
end end
$nospace = 1 if $nospace == 0 && /^[\.,]/ =~ words[0] @nospace = 1 if @nospace == 0 && /^[\.,]/ =~ words[0]
next next
end end
when 'Cm' when 'Cm'
@ -235,7 +256,7 @@ def parse_macro(line)
next next
when 'Op' when 'Op'
option = true option = true
$nospace = 1 if $nospace == 0 @nospace = 1 if @nospace == 0
retval << '[' retval << '['
# words.push(words.pop + ']') # words.push(words.pop + ']')
next next
@ -254,7 +275,7 @@ def parse_macro(line)
while /^[\.,:;)]$/ =~ words[0] while /^[\.,:;)]$/ =~ words[0]
retval << words.shift retval << words.shift
end end
# $nospace = 1 if $nospace == 0 && /^[\.,]/ =~ words[0] # @nospace = 1 if @nospace == 0 && /^[\.,]/ =~ words[0]
next next
end end
@ -267,7 +288,7 @@ def parse_macro(line)
next next
when 'Pq' when 'Pq'
retval << '(' retval << '('
$nospace = 1 @nospace = 1
parens = true parens = true
next next
when 'Sx', 'Sy' when 'Sx', 'Sy'
@ -289,7 +310,7 @@ def parse_macro(line)
retval << words.shift retval << words.shift
end end
retval << ' ' if $nospace == 0 retval << ' ' if @nospace == 0
end end
retval.chomp!(' ') retval.chomp!(' ')
@ -297,35 +318,35 @@ def parse_macro(line)
retval << words.shift unless words.empty? retval << words.shift unless words.empty?
break break
when 'Bl' when 'Bl'
$oldoptlist = $optlist @oldoptlist = @optlist
case words[0] case words[0]
when '-bullet' when '-bullet'
$optlist = 1 @optlist = 1
when '-enum' when '-enum'
$optlist = 2 @optlist = 2
$enum = 0 @enum = 0
when '-tag' when '-tag'
$optlist = 3 @optlist = 3
when '-item' when '-item'
$optlist = 4 @optlist = 4
end end
break break
when 'El' when 'El'
$optlist = $oldoptlist @optlist = @oldoptlist
next next
end end
if $optlist != 0 && word == 'It' if @optlist != 0 && word == 'It'
case $optlist case @optlist
when 1 when 1
# bullets # bullets
retval << '.IP \\(bu' retval << '.IP \\(bu'
when 2 when 2
# enum # enum
$enum += 1 @enum += 1
retval << '.IP ' << $enum << '.' retval << '.IP ' << @enum << '.'
when 3 when 3
# tags # tags
retval << ".TP\n" retval << ".TP\n"
@ -346,10 +367,10 @@ def parse_macro(line)
when 'Sm' when 'Sm'
case words[0] case words[0]
when 'off' when 'off'
$nospace = 2 @nospace = 2
when 'on' when 'on'
# retval << "\n" # retval << "\n"
$nospace = 0 @nospace = 0
end end
words.shift words.shift
next next
@ -367,25 +388,20 @@ def parse_macro(line)
retval << ']' if option retval << ']' if option
# retval << ' ' unless $nospace == 0 || retval.empty? || /\n\z/ =~ retval # retval << ' ' unless @nospace == 0 || retval.empty? || /\n\z/ =~ retval
retval << ' ' unless !$ext || $extopt || / $/ =~ retval retval << ' ' unless !@ext || @extopt || / $/ =~ retval
retval << "\n" unless $ext || $extopt || retval.empty? || /\n\z/ =~ retval retval << "\n" unless @ext || @extopt || retval.empty? || /\n\z/ =~ retval
return retval return retval
end end
ARGF.each { |line| def self.mdoc2man(i, o)
if /^\./ !~ line new.mdoc2man(i, o)
print line end
print ".br\n" if $literal
next
end end
line.slice!(0, 1) if $0 == __FILE__
Mdoc2Man.mdoc2man(ARGF, STDOUT)
next if /\\"/ =~ line end
line = parse_macro(line) and print line
}