From 1d11cd1d7daea5fcf857f98f493f258c97703711 Mon Sep 17 00:00:00 2001 From: knu Date: Mon, 20 Jan 2003 10:44:10 +0000 Subject: * mdoc2man.rb: Make this work as a library. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@3371 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- mdoc2man.rb | 612 +++++++++++++++++++++++++++++++----------------------------- 1 file changed, 314 insertions(+), 298 deletions(-) (limited to 'mdoc2man.rb') diff --git a/mdoc2man.rb b/mdoc2man.rb index 1999b8569..7a66edfcc 100755 --- a/mdoc2man.rb +++ b/mdoc2man.rb @@ -42,350 +42,366 @@ ### $Id$ ### -$name = $date = $id = nil -$refauthors = $reftitle = $refissue = $refdate = $refopt = nil - -$optlist = 0 ### 1 = bullet, 2 = enum, 3 = tag, 4 = item -$oldoptlist = 0 -$nospace = 0 ### 0, 1, 2 -$enum = 0 -$synopsis = true -$reference = false -$ext = false -$extopt = false -$literal = false - -def parse_macro(line) - words = line.split - retval = '' - - option = false - parens = false - - while word = words.shift - case word - when 'Li', 'Pf' - next - when 'Xo' - $ext = true - retval << ' ' unless retval.empty? || /[\n ]\z/ =~ retval - next - when 'Xc' - $ext = false - retval << "\n" unless $extopt - break - when 'Bd' - $literal = true if words[0] == '-literal' - retval << "\n" - break - when 'Ed' - $literal = false - break - when 'Ns' - $nospace = 1 if $nospace == 0 - retval.chomp!(' ') - next - when 'No' - retval.chomp!(' ') - retval << words.shift - next - when 'Dq' - retval << '``' - begin - retval << words.shift << ' ' - end until words.empty? || /^[\.,]/ =~ words[0] - retval.chomp!(' ') - retval << '\'\'' - $nospace = 1 if $nospace == 0 && /^[\.,]/ =~ words[0] - next - when 'Sq', 'Ql' - retval << '`' << words.shift << '\'' - $nospace = 1 if $nospace == 0 && /^[\.,]/ =~ words[0] - next - # when 'Ic' - # retval << '\\fB' << words.shift << '\\fP' - # next - when 'Oo' - #retval << "[\\c\n" - $extopt = true - $nospace = 1 if $nospace == 0 - retval << '[' - next - when 'Oc' - $extopt = false - retval << ']' - next - end +class Mdoc2Man + def initialize + @name = @date = @id = nil + @refauthors = @reftitle = @refissue = @refdate = @refopt = nil + + @optlist = 0 ### 1 = bullet, 2 = enum, 3 = tag, 4 = item + @oldoptlist = 0 + @nospace = 0 ### 0, 1, 2 + @enum = 0 + @synopsis = true + @reference = false + @ext = false + @extopt = false + @literal = false + end - retval << ' ' if $nospace == 0 && !(retval.empty? || /[\n ]\z/ =~ retval) - $nospace = 0 if $nospace == 1 - - case word - when 'Dd' - $date = words.join(' ') - return nil - when 'Dt' - $id = words.join(' ') - return nil - when 'Os' - retval << '.TH ' << $id << ' "' << $date << '" "' << - words.join(' ') << '"' - break - when 'Sh' - retval << '.SH' - $synopsis = (words[0] == 'SYNOPSIS') - next - when 'Xr' - retval << '\\fB' << words.shift << - '\\fP(' << words.shift << ')' << words.shift - break - when 'Rs' - $refauthors = [] - $reftitle = '' - $refissue = '' - $refdate = '' - $refopt = '' - $reference = true - break - when 'Re' - retval << "\n" - - # authors - while @refauthors.size > 1 - retval << @refauthors.shift << ', ' + def mdoc2man(i, o) + i.each { |line| + if /^\./ !~ line + o.print line + o.print ".br\n" if @literal + next end - retval << 'and ' unless retval.empty? - retval << @refauthors.shift - # title - retval << ', \\fI' << $reftitle << '\\fP' + line.slice!(0, 1) - # issue - retval << ', ' << $refissue unless $refissue.empty? + next if /\\"/ =~ line - # date - retval << ', ' << $refdate unless $refdate.empty? + line = parse_macro(line) and o.print line + } - # optional info - retval << ', ' << $refopt unless $refopt.empty? + initialize + end - retval << ".\n" + def parse_macro(line) + words = line.split + retval = '' - $reference = false - break - when 'Ux' - retval << "UNIX" - next - end + option = false + parens = false - if $reference + while word = words.shift case word - when '%A' - @refauthors.unshift(words.join(' ')) + when 'Li', 'Pf' + next + when 'Xo' + @ext = true + retval << ' ' unless retval.empty? || /[\n ]\z/ =~ retval + next + when 'Xc' + @ext = false + retval << "\n" unless @extopt break - when '%T' - $reftitle = words.join(' ') - $reftitle.sub!(/^"/, '') - $reftitle.sub!(/"$/, '') + when 'Bd' + @literal = true if words[0] == '-literal' + retval << "\n" break - when '%N' - $refissue = words.join(' ') + when 'Ed' + @literal = false break - when '%D' - $refdate = words.join(' ') + when 'Ns' + @nospace = 1 if @nospace == 0 + retval.chomp!(' ') + next + when 'No' + retval.chomp!(' ') + retval << words.shift + next + when 'Dq' + retval << '``' + begin + retval << words.shift << ' ' + end until words.empty? || /^[\.,]/ =~ words[0] + retval.chomp!(' ') + retval << '\'\'' + @nospace = 1 if @nospace == 0 && /^[\.,]/ =~ words[0] + next + when 'Sq', 'Ql' + retval << '`' << words.shift << '\'' + @nospace = 1 if @nospace == 0 && /^[\.,]/ =~ words[0] + next + # when 'Ic' + # retval << '\\fB' << words.shift << '\\fP' + # next + when 'Oo' + #retval << "[\\c\n" + @extopt = true + @nospace = 1 if @nospace == 0 + retval << '[' + next + when 'Oc' + @extopt = false + retval << ']' + next + end + + retval << ' ' if @nospace == 0 && !(retval.empty? || /[\n ]\z/ =~ retval) + @nospace = 0 if @nospace == 1 + + case word + when 'Dd' + @date = words.join(' ') + return nil + when 'Dt' + @id = words.join(' ') + return nil + when 'Os' + retval << '.TH ' << @id << ' "' << @date << '" "' << + words.join(' ') << '"' break - when '%O' - $refopt = words.join(' ') + when 'Sh' + retval << '.SH' + @synopsis = (words[0] == 'SYNOPSIS') + next + when 'Xr' + retval << '\\fB' << words.shift << + '\\fP(' << words.shift << ')' << words.shift break - end - end + when 'Rs' + @refauthors = [] + @reftitle = '' + @refissue = '' + @refdate = '' + @refopt = '' + @reference = true + break + when 'Re' + retval << "\n" - case word - when 'Nm' - name = words.empty? ? $name : words.shift - $name ||= name - retval << ".br\n" if $synopsis - retval << "\\fB" << name << "\\fP" - $nospace = 1 if $nospace == 0 && /^[\.,]/ =~ words[0] - next - when 'Nd' - retval << '\\-' - next - when 'Fl' - retval << '\\fB\\-' << words.shift << '\\fP' - $nospace = 1 if $nospace == 0 && /^[\.,]/ =~ words[0] - next - when 'Ar' - retval << '\\fI' - if words.empty? - retval << 'file ...\\fP' - else - retval << words.shift << '\\fP' - while words[0] == '|' - retval << ' ' << words.shift << ' \\fI' << words.shift << '\\fP' + # authors + while @refauthors.size > 1 + retval << @refauthors.shift << ', ' end - $nospace = 1 if $nospace == 0 && /^[\.,]/ =~ words[0] + retval << 'and ' unless retval.empty? + retval << @refauthors.shift + + # title + retval << ', \\fI' << @reftitle << '\\fP' + + # issue + retval << ', ' << @refissue unless @refissue.empty? + + # date + retval << ', ' << @refdate unless @refdate.empty? + + # optional info + retval << ', ' << @refopt unless @refopt.empty? + + retval << ".\n" + + @reference = false + break + when 'Ux' + retval << "UNIX" next end - when 'Cm' - retval << '\\fB' << words.shift << '\\fP' - while /^[\.,:)]$/ =~ words[0] - retval << words.shift - end - next - when 'Op' - option = true - $nospace = 1 if $nospace == 0 - retval << '[' - # words.push(words.pop + ']') - next - when 'Pp' - retval << "\n" - next - when 'Ss' - retval << '.SS' - next - end - if word == 'Pa' && !option - retval << '\\fI' - retval << '\\&' if /^\./ =~ words[0] - retval << words.shift << '\\fP' - while /^[\.,:;)]$/ =~ words[0] - retval << words.shift + if @reference + case word + when '%A' + @refauthors.unshift(words.join(' ')) + break + when '%T' + @reftitle = words.join(' ') + @reftitle.sub!(/^"/, '') + @reftitle.sub!(/"$/, '') + break + when '%N' + @refissue = words.join(' ') + break + when '%D' + @refdate = words.join(' ') + break + when '%O' + @refopt = words.join(' ') + break + end end - # $nospace = 1 if $nospace == 0 && /^[\.,]/ =~ words[0] - next - end - case word - when 'Dv' - retval << '.BR' - next - when 'Em', 'Ev' - retval << '.IR' - next - when 'Pq' - retval << '(' - $nospace = 1 - parens = true - next - when 'Sx', 'Sy' - retval << '.B ' << words.join(' ') - break - when 'Ic' - retval << '\\fB' - until words.empty? || /^[\.,]/ =~ words[0] - case words[0] - when 'Op' - words.shift - retval << '[' - words.push(words.pop + ']') - next - when 'Ar' - words.shift - retval << '\\fI' << words.shift << '\\fP' + case word + when 'Nm' + name = words.empty? ? @name : words.shift + @name ||= name + retval << ".br\n" if @synopsis + retval << "\\fB" << name << "\\fP" + @nospace = 1 if @nospace == 0 && /^[\.,]/ =~ words[0] + next + when 'Nd' + retval << '\\-' + next + when 'Fl' + retval << '\\fB\\-' << words.shift << '\\fP' + @nospace = 1 if @nospace == 0 && /^[\.,]/ =~ words[0] + next + when 'Ar' + retval << '\\fI' + if words.empty? + retval << 'file ...\\fP' else + retval << words.shift << '\\fP' + while words[0] == '|' + retval << ' ' << words.shift << ' \\fI' << words.shift << '\\fP' + end + @nospace = 1 if @nospace == 0 && /^[\.,]/ =~ words[0] + next + end + when 'Cm' + retval << '\\fB' << words.shift << '\\fP' + while /^[\.,:)]$/ =~ words[0] retval << words.shift end - - retval << ' ' if $nospace == 0 + next + when 'Op' + option = true + @nospace = 1 if @nospace == 0 + retval << '[' + # words.push(words.pop + ']') + next + when 'Pp' + retval << "\n" + next + when 'Ss' + retval << '.SS' + next end - retval.chomp!(' ') - retval << '\\fP' - retval << words.shift unless words.empty? - break - when 'Bl' - $oldoptlist = $optlist - - case words[0] - when '-bullet' - $optlist = 1 - when '-enum' - $optlist = 2 - $enum = 0 - when '-tag' - $optlist = 3 - when '-item' - $optlist = 4 + if word == 'Pa' && !option + retval << '\\fI' + retval << '\\&' if /^\./ =~ words[0] + retval << words.shift << '\\fP' + while /^[\.,:;)]$/ =~ words[0] + retval << words.shift + end + # @nospace = 1 if @nospace == 0 && /^[\.,]/ =~ words[0] + next end - break - when 'El' - $optlist = $oldoptlist - next - end + case word + when 'Dv' + retval << '.BR' + next + when 'Em', 'Ev' + retval << '.IR' + next + when 'Pq' + retval << '(' + @nospace = 1 + parens = true + next + when 'Sx', 'Sy' + retval << '.B ' << words.join(' ') + break + when 'Ic' + retval << '\\fB' + until words.empty? || /^[\.,]/ =~ words[0] + case words[0] + when 'Op' + words.shift + retval << '[' + words.push(words.pop + ']') + next + when 'Ar' + words.shift + retval << '\\fI' << words.shift << '\\fP' + else + retval << words.shift + end + + retval << ' ' if @nospace == 0 + end + + retval.chomp!(' ') + retval << '\\fP' + retval << words.shift unless words.empty? + break + when 'Bl' + @oldoptlist = @optlist - if $optlist != 0 && word == 'It' - case $optlist - when 1 - # bullets - retval << '.IP \\(bu' - when 2 - # enum - $enum += 1 - retval << '.IP ' << $enum << '.' - when 3 - # tags - retval << ".TP\n" case words[0] - when 'Pa', 'Ev' - words.shift - retval << '.B' + when '-bullet' + @optlist = 1 + when '-enum' + @optlist = 2 + @enum = 0 + when '-tag' + @optlist = 3 + when '-item' + @optlist = 4 end - when 4 - # item - retval << ".IP\n" + + break + when 'El' + @optlist = @oldoptlist + next end - next - end + if @optlist != 0 && word == 'It' + case @optlist + when 1 + # bullets + retval << '.IP \\(bu' + when 2 + # enum + @enum += 1 + retval << '.IP ' << @enum << '.' + when 3 + # tags + retval << ".TP\n" + case words[0] + when 'Pa', 'Ev' + words.shift + retval << '.B' + end + when 4 + # item + retval << ".IP\n" + end - case word - when 'Sm' - case words[0] - when 'off' - $nospace = 2 - when 'on' - # retval << "\n" - $nospace = 0 + next end - words.shift - next - end - retval << word - end + case word + when 'Sm' + case words[0] + when 'off' + @nospace = 2 + when 'on' + # retval << "\n" + @nospace = 0 + end + words.shift + next + end - return nil if retval == '.' + retval << word + end - retval.sub!(/\A\.([^a-zA-Z])/, "\\1") - # retval.chomp!(' ') + return nil if retval == '.' - retval << ')' if parens + retval.sub!(/\A\.([^a-zA-Z])/, "\\1") + # retval.chomp!(' ') - retval << ']' if option + retval << ')' if parens - # retval << ' ' unless $nospace == 0 || retval.empty? || /\n\z/ =~ retval + retval << ']' if option - retval << ' ' unless !$ext || $extopt || / $/ =~ retval + # retval << ' ' unless @nospace == 0 || retval.empty? || /\n\z/ =~ retval - retval << "\n" unless $ext || $extopt || retval.empty? || /\n\z/ =~ retval + retval << ' ' unless !@ext || @extopt || / $/ =~ retval - return retval -end + retval << "\n" unless @ext || @extopt || retval.empty? || /\n\z/ =~ retval -ARGF.each { |line| - if /^\./ !~ line - print line - print ".br\n" if $literal - next + return retval end - line.slice!(0, 1) - - next if /\\"/ =~ line + def self.mdoc2man(i, o) + new.mdoc2man(i, o) + end +end - line = parse_macro(line) and print line -} +if $0 == __FILE__ + Mdoc2Man.mdoc2man(ARGF, STDOUT) +end -- cgit