Rev 2 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2 | Rev 3 | ||
---|---|---|---|
1 | #!/usr/bin/perl |
1 | #!/usr/bin/perl |
2 | # Copyright (c) 2002-2014 Sampo Kellomaki (sampo@iki.fi). All Rights Reserved. |
2 | # Copyright (c) 2002-2014 Sampo Kellomaki (sampo@iki.fi). All Rights Reserved. |
3 | # This is free software. You may distribute under GPL. NO WARRANTY. |
3 | # This is free software. You may distribute under GPL. NO WARRANTY. |
4 | # |
4 | # |
5 | # PlainDoc to LaTeX, DocBook, and HTML converter |
5 | # PlainDoc to LaTeX, DocBook, and HTML converter |
6 | # http://zxid.org/plaindoc/pd.html |
6 | # http://zxid.org/plaindoc/pd.html |
7 | # |
7 | # |
8 | # $Id: pd2tex,v 1.55 2009-11-10 23:28:31 sampo Exp $ |
8 | # $Id: pd2tex,v 1.55 2009-11-10 23:28:31 sampo Exp $ |
9 | # xx.xx.1999, created, Sampo Kellomaki <sampo@iki.fi> |
9 | # xx.xx.1999, created, Sampo Kellomaki <sampo@iki.fi> |
10 | # 3.2.2002, complete rewrite --Sampo |
10 | # 3.2.2002, complete rewrite --Sampo |
11 | # (snip -- see ChangeLog) |
11 | # (snip -- see ChangeLog) |
12 | # 10.11.2009, patch from Octavio Alvarez <alvarezp.at.alvarezp.com> |
12 | # 10.11.2009, patch from Octavio Alvarez <alvarezp.at.alvarezp.com> |
13 | # 12.1.2010, Improvements to the blogging system and multipage HTML --Sampo |
13 | # 12.1.2010, Improvements to the blogging system and multipage HTML --Sampo |
14 | # 29.1.2011, Tweaks and minor bug fixes --Sampo |
14 | # 29.1.2011, Tweaks and minor bug fixes --Sampo |
15 | # 29.3.2011, Added a <<csv: >> feature --Sampo |
15 | # 29.3.2011, Added a <<csv: >> feature --Sampo |
16 | # 2.2.2012, Render Latin1 special chars using math mode --Sampo |
16 | # 2.2.2012, Render Latin1 special chars using math mode --Sampo |
17 | # 30.1.2013, Moved .tex and spell.words temp files to tex/ subdirectory --Sampo |
17 | # 30.1.2013, Moved .tex and spell.words temp files to tex/ subdirectory --Sampo |
18 | # 8.2.2013, Fixed RTF support --Sampo |
18 | # 8.2.2013, Fixed RTF support --Sampo |
19 | # 27.4.2013, .nonl support and added <<multicol*: >> construct --Sampo |
19 | # 27.4.2013, .nonl support and added <<multicol*: >> construct --Sampo |
20 | # 21.2.2014, Added pdseal support --Sampo |
20 | # 21.2.2014, Added pdseal support --Sampo |
21 | # |
21 | # |
22 | # Usage: ./pd2tex foo.pd |
22 | # Usage: ./pd2tex foo.pd |
23 | # |
23 | # |
24 | # Document contains (document can be considered as a special top level section) |
24 | # Document contains (document can be considered as a special top level section) |
25 | # - <<special: constructs>> |
25 | # - <<special: constructs>> |
26 | # - anything that a section can contain |
26 | # - anything that a section can contain |
27 | # |
27 | # |
28 | # Sections and subsections can contain |
28 | # Sections and subsections can contain |
29 | # - lower level subsections (identified by underlining) |
29 | # - lower level subsections (identified by underlining) |
30 | # - anything that body can contain |
30 | # - anything that body can contain |
31 | # - direct descendants must be top level lists |
31 | # - direct descendants must be top level lists |
32 | # |
32 | # |
33 | # List items are identified by level of indent and can contain |
33 | # List items are identified by level of indent and can contain |
34 | # - anything that body can contain |
34 | # - anything that body can contain |
35 | # - list can contain only lower level lists (more indent) |
35 | # - list can contain only lower level lists (more indent) |
36 | # - list can never contain sections or subsections. Appearence of a section terminates list |
36 | # - list can never contain sections or subsections. Appearence of a section terminates list |
37 | # - decrease in level of indent terminates list |
37 | # - decrease in level of indent terminates list |
38 | # - list items can be single line or multiline, with same indent |
38 | # - list items can be single line or multiline, with same indent |
39 | # |
39 | # |
40 | # Body text can contain |
40 | # Body text can contain |
41 | # - lists (no list can not span (sub)sections) |
41 | # - lists (no list can not span (sub)sections) |
42 | # - * bulleted lists |
42 | # - * bulleted lists |
43 | # - 1. number lists |
43 | # - 1. number lists |
44 | # - a. alpha lists |
44 | # - a. alpha lists |
45 | # - definition:: lists (subsequent lines must be indented by 4 chars) |
45 | # - definition:: lists (subsequent lines must be indented by 4 chars) |
46 | # - <<table: Caption text ...>> |
46 | # - <<table: Caption text ...>> |
47 | # - <<img: file.eps: Caption text>> |
47 | # - <<img: file.eps: Caption text>> |
48 | # N.B. The best way to produce diagram drawings is to use dia for drawing |
48 | # N.B. The best way to produce diagram drawings is to use dia for drawing |
49 | # and export as .eps. Then run `epstopdf file.eps'. Only problem with this |
49 | # and export as .eps. Then run `epstopdf file.eps'. Only problem with this |
50 | # method is that there is no control of image size. Thus the eps must already |
50 | # method is that there is no control of image size. Thus the eps must already |
51 | # be the correct size. Apparently the best way to accomplish this is to |
51 | # be the correct size. Apparently the best way to accomplish this is to |
52 | # use the dia File->Page Setup->Scale option to reduce the image (e.g. 70%). |
52 | # use the dia File->Page Setup->Scale option to reduce the image (e.g. 70%). |
53 | # - code, identified by indent |
53 | # - code, identified by indent |
54 | # - para, if nothing special indicates otherwise |
54 | # - para, if nothing special indicates otherwise |
55 | # - body terminates if |
55 | # - body terminates if |
56 | # - indent level decreases |
56 | # - indent level decreases |
57 | # - something looking like section is found |
57 | # - something looking like section is found |
58 | # |
58 | # |
59 | # Table contains cells defined by special syntax. Each cell content is treated as a para |
59 | # Table contains cells defined by special syntax. Each cell content is treated as a para |
60 | # |
60 | # |
61 | # Para can contain |
61 | # Para can contain |
62 | # - *bold*, +italic+, ~code~ |
62 | # - *bold*, +italic+, ~code~ |
63 | # - inline <<image.gif>> |
63 | # - inline <<image.gif>> |
64 | # - www.foo.com and email@foo.com links (autodetected) |
64 | # - www.foo.com and email@foo.com links (autodetected) |
65 | # - [references] |
65 | # - [references] |
66 | # - paragraphs are separated by empty lines (and special constructs?) |
66 | # - paragraphs are separated by empty lines (and special constructs?) |
67 | # |
67 | # |
68 | # Code section starts at given level of indent and continues until less indented |
68 | # Code section starts at given level of indent and continues until less indented |
69 | # line. Lines in between may be more indented if needed. |
69 | # line. Lines in between may be more indented if needed. |
70 | # |
70 | # |
71 | # Lists and indent (| = current indent, : = parent's indent; lesser indent terminates construct) |
71 | # Lists and indent (| = current indent, : = parent's indent; lesser indent terminates construct) |
72 | # 1.: parent list |
72 | # 1.: parent list |
73 | # :a.|same level |
73 | # :a.|same level |
74 | # :b.|same level |
74 | # :b.|same level |
75 | # : |* sublist |
75 | # : |* sublist |
76 | # : |* sub |
76 | # : |* sub |
77 | # :c.|same level (terminates sub) |
77 | # :c.|same level (terminates sub) |
78 | # : |* sub |
78 | # : |* sub |
79 | # 2.: next parent item |
79 | # 2.: next parent item |
80 | # |
80 | # |
81 | # Book printing |
81 | # Book printing |
82 | # pd2tex r-slim.pd |
82 | # pd2tex r-slim.pd |
83 | # pdftops |
83 | # pdftops |
84 | # psbook r-slim.ps r-slim-book.ps # omit -s for best result |
84 | # psbook r-slim.ps r-slim-book.ps # omit -s for best result |
85 | # mpage -o -2 -j1%2 -P r-slim-book.ps # odd sheets |
85 | # mpage -o -2 -j1%2 -P r-slim-book.ps # odd sheets |
86 | # # HP4100: rotate output by 180 degrees and put in input tray with image up (p. 1) |
86 | # # HP4100: rotate output by 180 degrees and put in input tray with image up (p. 1) |
87 | # mpage -o -2 -j2%2 -P r-slim-book.ps # even sheets |
87 | # mpage -o -2 -j2%2 -P r-slim-book.ps # even sheets |
88 | # # invert order of output, fold, and staple in middle |
88 | # # invert order of output, fold, and staple in middle |
89 | # |
89 | # |
90 | # http://www.biblioscape.com/rtf15_spec.htm |
90 | # http://www.biblioscape.com/rtf15_spec.htm |
91 | # |
91 | # |
92 | # Latex tips |
92 | # Latex tips |
93 | # ========== |
93 | # ========== |
94 | # Too deeply nested Apparently this really means what it says. Maybe something not closing? |
94 | # Too deeply nested Apparently this really means what it says. Maybe something not closing? |
95 | # Float too large Picture or table is too large to fit in available space on page. Ignore. |
95 | # Float too large Picture or table is too large to fit in available space on page. Ignore. |
96 | # Overfull \vbox Means that something didn't really fit. May cause misformatting. Ignore. |
96 | # Overfull \vbox Means that something didn't really fit. May cause misformatting. Ignore. |
97 | # Missing $ inserted Automatic switch to math mode: char (e.g. under score) only allowed |
97 | # Missing $ inserted Automatic switch to math mode: char (e.g. under score) only allowed |
98 | # in math mode was seen and LaTeX "helpfully" switches to math mode. |
98 | # in math mode was seen and LaTeX "helpfully" switches to math mode. |
99 | # \usepackage{lineno} \linenumbers: Use 'lineno' as moreopt parameter of <<class: >> |
99 | # \usepackage{lineno} \linenumbers: Use 'lineno' as moreopt parameter of <<class: >> |
100 | # \hspace{\fill} Right align rest of line |
100 | # \hspace{\fill} Right align rest of line |
101 | 101 | ||
102 | $usage = <<USAGE; |
102 | $usage = <<USAGE; |
103 | Usage: pd2tex mydoc.pd # Generate mydoc.tex, mydoc.pdf, mydoc.dbx, and mydoc.html |
103 | Usage: pd2tex mydoc.pd # Generate mydoc.tex, mydoc.pdf, mydoc.dbx, and mydoc.html |
104 | pd2tex -acroread mydoc.pd # Regenerate document and preview it |
104 | pd2tex -acroread mydoc.pd # Regenerate document and preview it |
105 | pd2tex <mydox.pd >mydoc.tex # filter mode |
105 | pd2tex <mydox.pd >mydoc.tex # filter mode |
106 | pd2tex -dbx <mydoc.pd >mydoc.dbx # filter mode for DocBook |
106 | pd2tex -dbx <mydoc.pd >mydoc.dbx # filter mode for DocBook |
107 | pd2tex -verify <plaintext # Verify PDSEAL |
107 | pd2tex -verify <plaintext # Verify PDSEAL |
108 | 108 | ||
109 | Options: |
109 | Options: |
110 | -dbx Invokes DocBook filter mode |
110 | -dbx Invokes DocBook filter mode |
111 | -html Invokes HTML filter mode (must make subdirectory html) |
111 | -html Invokes HTML filter mode (must make subdirectory html) |
112 | -gensafe Convert images from ps, eps, dot, or dia to pdf only if no pdf (default) |
112 | -gensafe Convert images from ps, eps, dot, or dia to pdf only if no pdf (default) |
113 | -gendep Convert from ps, eps, dot, or dia to pdf based on time stamps |
113 | -gendep Convert from ps, eps, dot, or dia to pdf based on time stamps |
114 | -genforce Force conversion of images from ps, eps, dot, or dia to pdf |
114 | -genforce Force conversion of images from ps, eps, dot, or dia to pdf |
115 | -nogen Prevent conversion of images from ps, eps, dot, or dia to pdf |
115 | -nogen Prevent conversion of images from ps, eps, dot, or dia to pdf |
116 | -notex Prevent .tex output in normal mode. Also prevents .pdf output. |
116 | -notex Prevent .tex output in normal mode. Also prevents .pdf output. |
117 | -nopdf Prevent .pdf output in normal mode (.tex is still generated). |
117 | -nopdf Prevent .pdf output in normal mode (.tex is still generated). |
118 | -nodbx Prevent .dbx output in normal mode |
118 | -nodbx Prevent .dbx output in normal mode |
119 | -nohtml Prevent .html output in normal mode |
119 | -nohtml Prevent .html output in normal mode |
120 | -nohtml2 Prevent multipage .html output in normal mode |
120 | -nohtml2 Prevent multipage .html output in normal mode |
121 | -nortf Prevent .rtf output in normal mode (.rtf is only poorly supported) |
121 | -nortf Prevent .rtf output in normal mode (.rtf is only poorly supported) |
122 | -noref Skip expensive reference resolution pass. |
122 | -noref Skip expensive reference resolution pass. |
123 | -nohtmlpreamb Prevent HTML preamble from being added |
123 | -nohtmlpreamb Prevent HTML preamble from being added |
124 | -nosecnum Prevent automatic section numbering |
124 | -nosecnum Prevent automatic section numbering |
125 | 125 | ||
126 | -p Same as -pdfonly |
126 | -p Same as -pdfonly |
127 | -pdfonly Only generate .tex and .pdf output (no .dbx, .html, or .rtf) |
127 | -pdfonly Only generate .tex and .pdf output (no .dbx, .html, or .rtf) |
128 | -htmlonly Only generate .html output (no .tex, .dbx, or .rtf) |
128 | -htmlonly Only generate .html output (no .tex, .dbx, or .rtf) |
129 | -html2only Only generate multipage html (no .tex, .dbx, or .rtf) |
129 | -html2only Only generate multipage html (no .tex, .dbx, or .rtf) |
130 | 130 | ||
131 | -fn Omit footnotes. |
131 | -fn Omit footnotes. |
132 | -FN Force footnotes even on dbx (some dbx tools are broken wrt footnotes in lists) |
132 | -FN Force footnotes even on dbx (some dbx tools are broken wrt footnotes in lists) |
133 | -n Dry run. Do not alter files on disk. |
133 | -n Dry run. Do not alter files on disk. |
134 | -acroread Automatically launch acroread after processing the document |
134 | -acroread Automatically launch acroread after processing the document |
135 | -d DIR Change current working directory to DIR |
135 | -d DIR Change current working directory to DIR |
136 | -o path Specify output path different from input |
136 | -o path Specify output path different from input |
137 | -DMACRO=VAL Define a macro to have a value |
137 | -DMACRO=VAL Define a macro to have a value |
138 | -verify Verify a PDSEAL (e.g. paste text from PDF to stdin) |
138 | -verify Verify a PDSEAL (e.g. paste text from PDF to stdin) |
139 | -init Create typical directory hierarchy used by pd2tex (tex, html, tmp, review) |
139 | -init Create typical directory hierarchy used by pd2tex (tex, html, tmp, review) |
140 | USAGE |
140 | USAGE |
141 | ; |
141 | ; |
142 | 142 | ||
143 | ### Configure |
143 | ### Configure |
144 | 144 | ||
145 | $trace = 0; |
145 | $trace = 0; |
146 | $number = 0; # Should sections and lists be explicitly numbered in dbx |
146 | $number = 0; # Should sections and lists be explicitly numbered in dbx |
147 | $tex_col_wid_factor = 1.8; # TeX: tweak the table/column width (mm per equals sign in underline) |
147 | $tex_col_wid_factor = 1.8; # TeX: tweak the table/column width (mm per equals sign in underline) |
148 | $dbx_col_wid_factor = 0.08; # DocBook: tweak the table/column width (inches per equals sign) |
148 | $dbx_col_wid_factor = 0.08; # DocBook: tweak the table/column width (inches per equals sign) |
149 | $hbadness = 2000; # Do not warn for hbadness below this. See also tables which set this to 10000. |
149 | $hbadness = 2000; # Do not warn for hbadness below this. See also tables which set this to 10000. |
150 | $imggen = 'safe'; |
150 | $imggen = 'safe'; |
151 | $pipemode = 0; |
151 | $pipemode = 0; |
152 | $html2_split_threshold = 99; # 99 = Always split |
152 | $html2_split_threshold = 99; # 99 = Always split |
153 | $fn_style = 1; # 0 = omit (-fn), 1 = tex ok, dbx inline, 3 = both tex and dbx footnotes (-FN) |
153 | $fn_style = 1; # 0 = omit (-fn), 1 = tex ok, dbx inline, 3 = both tex and dbx footnotes (-FN) |
154 | $maxlogline = 77; |
154 | $maxlogline = 77; |
155 | $htmldir = 'html/'; |
155 | $htmldir = 'html/'; |
156 | $texdir = 'tex/'; |
156 | $texdir = 'tex/'; |
157 | $dbxdir = 'tex/'; |
157 | $dbxdir = 'tex/'; |
158 | $rtfdir = 'tex/'; |
158 | $rtfdir = 'tex/'; |
159 | $pdflag{'autoformat'} = 1; # <<pdflags: autoformat=0>> |
159 | $pdflag{'autoformat'} = 1; # <<pdflags: autoformat=0>> |
160 | $pdflag{'showsgasxsd'} = 0; # <<pdflags: showsgasxsd=1>> |
160 | $pdflag{'showsgasxsd'} = 0; # <<pdflags: showsgasxsd=1>> |
161 | $pdflag{'stripsecnum'} = 1; # <<pdflags: stripsecnum=0>> |
161 | $pdflag{'stripsecnum'} = 1; # <<pdflags: stripsecnum=0>> |
162 | $pdflag{'secnum'} = 1; # <<pdflags: secnum=0>> |
162 | $pdflag{'secnum'} = 1; # <<pdflags: secnum=0>> |
163 | 163 | ||
164 | ### Process command line options |
164 | ### Process command line options |
165 | 165 | ||
166 | while ($ARGV[0] =~ /^-/) { |
166 | while ($ARGV[0] =~ /^-/) { |
167 | $f = $ARGV[0]; |
167 | $f = $ARGV[0]; |
168 | if ($f eq '-acroread') { shift; $acroread = 1; next; } |
168 | if ($f eq '-acroread') { shift; $acroread = 1; next; } |
169 | if ($f eq '-dbx') { shift; $dbx_filter = 1; next; } |
169 | if ($f eq '-dbx') { shift; $dbx_filter = 1; next; } |
170 | if ($f eq '-html') { shift; $html_filter = 1; next; } |
170 | if ($f eq '-html') { shift; $html_filter = 1; next; } |
171 | if ($f eq '-gensafe') { shift; $imggen = 'safe'; next; } |
171 | if ($f eq '-gensafe') { shift; $imggen = 'safe'; next; } |
172 | if ($f eq '-gendep') { shift; $imggen = 'dep'; next; } |
172 | if ($f eq '-gendep') { shift; $imggen = 'dep'; next; } |
173 | if ($f eq '-genforce') { shift; $imggen = 'force'; next; } |
173 | if ($f eq '-genforce') { shift; $imggen = 'force'; next; } |
174 | if ($f eq '-pdfonly' || $f eq '-p') { shift; $nodbx=$nortf=$nohtml=$nohtml2=1; next; } |
174 | if ($f eq '-pdfonly' || $f eq '-p') { shift; $nodbx=$nortf=$nohtml=$nohtml2=1; next; } |
175 | if ($f eq '-htmlonly') { shift; $nodbx=$nortf=$notex=$nohtml2=1; next; } |
175 | if ($f eq '-htmlonly') { shift; $nodbx=$nortf=$notex=$nohtml2=1; next; } |
176 | if ($f eq '-html2only'){ shift; $nodbx=$nortf=$nohtml=$notex=1; next; } |
176 | if ($f eq '-html2only'){ shift; $nodbx=$nortf=$nohtml=$notex=1; next; } |
177 | if ($f eq '-nogen') { shift; $imggen = ''; next; } |
177 | if ($f eq '-nogen') { shift; $imggen = ''; next; } |
178 | if ($f eq '-notex') { shift; $notex = 1; next; } |
178 | if ($f eq '-notex') { shift; $notex = 1; next; } |
179 | if ($f eq '-nopdf') { shift; $nopdf = 1; next; } |
179 | if ($f eq '-nopdf') { shift; $nopdf = 1; next; } |
180 | if ($f eq '-nodbx') { shift; $nodbx = 1; next; } |
180 | if ($f eq '-nodbx') { shift; $nodbx = 1; next; } |
181 | if ($f eq '-nohtml') { shift; $nohtml = 1; next; } |
181 | if ($f eq '-nohtml') { shift; $nohtml = 1; next; } |
182 | if ($f eq '-nohtml2') { shift; $nohtml2 = 1; next; } |
182 | if ($f eq '-nohtml2') { shift; $nohtml2 = 1; next; } |
183 | if ($f eq '-nortf') { shift; $nortf = 1; next; } |
183 | if ($f eq '-nortf') { shift; $nortf = 1; next; } |
184 | if ($f eq '-noref') { shift; $noref = 1; next; } |
184 | if ($f eq '-noref') { shift; $noref = 1; next; } |
185 | if ($f eq '-nopipe') { shift; $pipemode = 0; next; } |
185 | if ($f eq '-nopipe') { shift; $pipemode = 0; next; } |
186 | if ($f eq '-pipe') { shift; $pipemode = 1; next; } |
186 | if ($f eq '-pipe') { shift; $pipemode = 1; next; } |
187 | if ($f eq '-nosecnum') { shift; $pdflag{'secnum'} = 0; next; } |
187 | if ($f eq '-nosecnum') { shift; $pdflag{'secnum'} = 0; next; } |
188 | if ($f eq '-nohtmlpreamb') { shift; $nohtmlpreamb = 1; next; } |
188 | if ($f eq '-nohtmlpreamb') { shift; $nohtmlpreamb = 1; next; } |
189 | if ($f eq '-htmldir') { shift; $htmldir = shift; next; } |
189 | if ($f eq '-htmldir') { shift; $htmldir = shift; next; } |
190 | if ($f eq '-epstopng') { shift; epstopng($ARGV[0], $ARGV[1]); exit; } |
190 | if ($f eq '-epstopng') { shift; epstopng($ARGV[0], $ARGV[1]); exit; } |
191 | if ($f eq '-n') { shift; $dryrun = 1; next; } |
191 | if ($f eq '-n') { shift; $dryrun = 1; next; } |
192 | if ($f eq '-fn') { shift; $fn_style = 0; next; } # omit footnotes |
192 | if ($f eq '-fn') { shift; $fn_style = 0; next; } # omit footnotes |
193 | if ($f eq '-FN') { shift; $fn_style = 3; next; } # force dbx footnotes |
193 | if ($f eq '-FN') { shift; $fn_style = 3; next; } # force dbx footnotes |
194 | if ($f eq '-t') { shift; ++$trace; next; } |
194 | if ($f eq '-t') { shift; ++$trace; next; } |
195 | if ($f eq '-d') { shift; chdir shift; next; } |
195 | if ($f eq '-d') { shift; chdir shift; next; } |
196 | if ($f eq '-o') { shift; $base = shift; next; } |
196 | if ($f eq '-o') { shift; $base = shift; next; } |
197 | if ($f =~ /^-D(\w+)(?:=(.*))?$/) { $mac{$1} = $cmdline_mac{$1} = $2; shift; next; } |
197 | if ($f =~ /^-D(\w+)(?:=(.*))?$/) { $mac{$1} = $cmdline_mac{$1} = $2; shift; next; } |
198 | if ($f eq '-init') { |
198 | if ($f eq '-init') { |
199 | #mkdir "corners"; |
199 | #mkdir "corners"; |
200 | mkdir '.pd'; # Private temp files (like tmp, but newer) |
200 | mkdir '.pd'; # Private temp files (like tmp, but newer) |
201 | mkdir 'tex'; |
201 | mkdir 'tex'; |
202 | mkdir $htmldir; |
202 | mkdir $htmldir; |
203 | mkdir 'review'; |
203 | mkdir 'review'; |
204 | mkdir 'tmp'; # See also .pd |
204 | mkdir 'tmp'; # See also .pd |
205 | exit; |
205 | exit; |
206 | } |
206 | } |
207 | if ($f eq '-verify') { |
207 | if ($f eq '-verify') { |
208 | undef $/; |
208 | undef $/; |
209 | $x = <STDIN>; |
209 | $x = <STDIN>; |
210 | ($pdseal,$sha1) = $x =~ /(PDSEAL1([A-Za-z0-9_.-]+))/; |
210 | ($pdseal,$sha1) = $x =~ /(PDSEAL1([A-Za-z0-9_.-]+))/; |
211 | $x =~ s/PDSEAL1[A-Za-z0-9_.-]+//; |
211 | $x =~ s/PDSEAL1[A-Za-z0-9_.-]+//; |
212 | die "pdseal($pdseal) is wrong length" if length $pdseal != 7+28; |
212 | die "pdseal($pdseal) is wrong length" if length $pdseal != 7+28; |
213 | $x = pdseal1($x); |
213 | $x = pdseal1($x); |
214 | die "pdseal($pdseal) mismatch($x) normalized_form($pdseal_norm)" if $pdseal ne $x; |
214 | die "pdseal($pdseal) mismatch($x) normalized_form($pdseal_norm)" if $pdseal ne $x; |
215 | warn "OK: pdseal($pdseal) matches.\n"; |
215 | warn "OK: pdseal($pdseal) matches.\n"; |
216 | exit; |
216 | exit; |
217 | } |
217 | } |
218 | die "Unknown argument `$f'\n$usage"; |
218 | die "Unknown argument `$f'\n$usage"; |
219 | } |
219 | } |
220 | 220 | ||
221 | if (@ARGV) { # Not filter mode: input file name is an argument |
221 | if (@ARGV) { # Not filter mode: input file name is an argument |
222 | $file = shift; |
222 | $file = shift; |
223 | $base ||= $file; |
223 | $base ||= $file; |
224 | $base =~ s/\.pdf?$//i; |
224 | $base =~ s/\.pdf?$//i; |
225 | $base =~ s/tex\///i; |
225 | $base =~ s/tex\///i; |
226 | open STDIN,"<$file" or die "Cannot read input file $file: $!"; |
226 | open STDIN,"<$file" or die "Cannot read input file $file: $!"; |
227 | open NONL,">$texdir$base.nonl"; # output where newlines are stripped to ease importing to Word |
227 | open NONL,">$texdir$base.nonl"; # output where newlines are stripped to ease importing to Word |
228 | open PDSEAL,">$texdir$base.seal"; # output in pdseal hashable format |
228 | open PDSEAL,">$texdir$base.seal"; # output in pdseal hashable format |
229 | if ($notex || $dryrun) { |
229 | if ($notex || $dryrun) { |
230 | open TEX,">/dev/null"; |
230 | open TEX,">/dev/null"; |
231 | open BIB,">/dev/null"; |
231 | open BIB,">/dev/null"; |
232 | $nopdf = 1; |
232 | $nopdf = 1; |
233 | } else { |
233 | } else { |
234 | unlink "$texdir$base.tex"; # in case stray pipe was left over from previous iteration |
234 | unlink "$texdir$base.tex"; # in case stray pipe was left over from previous iteration |
235 | if ($pipemode) { |
235 | if ($pipemode) { |
236 | # Since LaTeX apparently does not support reading input from stdin, we fool |
236 | # Since LaTeX apparently does not support reading input from stdin, we fool |
237 | # it by creating a named pipe. This allows us to interperse the pd2tex error |
237 | # it by creating a named pipe. This allows us to interperse the pd2tex error |
238 | # output with the messages from LaTeX. |
238 | # output with the messages from LaTeX. |
239 | if ($enabib) { |
239 | if ($enabib) { |
240 | open BIB,">$texdir$base.bib" or die "Cannot write $texdir$base.bib: $!"; |
240 | open BIB,">$texdir$base.bib" or die "Cannot write $texdir$base.bib: $!"; |
241 | } |
241 | } |
242 | open TEX,">$texdir$base.tex" or die "Cannot write $texdir$base.tex: $!"; |
242 | open TEX,">$texdir$base.tex" or die "Cannot write $texdir$base.tex: $!"; |
243 | warn "Writing $texdir$base.tex"; |
243 | warn "Writing $texdir$base.tex"; |
244 | if (-d 'tex') { |
244 | if (-d 'tex') { |
245 | select TEX; $| = 1; select STDOUT; |
245 | select TEX; $| = 1; select STDOUT; |
246 | if (!($texpid = fork)) { |
246 | if (!($texpid = fork)) { |
247 | die "fork (for pdflatex) failed: $!" if !defined($texpid); |
247 | die "fork (for pdflatex) failed: $!" if !defined($texpid); |
248 | chdir $texdir; |
248 | chdir $texdir; |
249 | select(undef,undef,undef,0.250); |
249 | select(undef,undef,undef,0.250); |
250 | warn "pdflatex -file-line-error-style -interaction=errorstopmode $base.tex"; |
250 | warn "pdflatex -file-line-error-style -interaction=errorstopmode $base.tex"; |
251 | exec "pdflatex -file-line-error-style -interaction=errorstopmode $base.tex"; |
251 | exec "pdflatex -file-line-error-style -interaction=errorstopmode $base.tex"; |
252 | die "exec pdflatex failed: $!"; |
252 | die "exec pdflatex failed: $!"; |
253 | } |
253 | } |
254 | } else { |
254 | } else { |
255 | warn "WARNING: For pdflatex post processing tex subdirectory is needed. Create using pd2tex -init (or mkdir tex)\n"; |
255 | warn "WARNING: For pdflatex post processing tex subdirectory is needed. Create using pd2tex -init (or mkdir tex)\n"; |
256 | } |
256 | } |
257 | #open TEX,"|pdflatex -file-line-error-style -interaction=errorstopmode - >$base.pdf" |
257 | #open TEX,"|pdflatex -file-line-error-style -interaction=errorstopmode - >$base.pdf" |
258 | # or die "Cannot open pipe to pdflatex: $!"; |
258 | # or die "Cannot open pipe to pdflatex: $!"; |
259 | } else { |
259 | } else { |
260 | ### This is the normal case when you invoke: pd2text foo.pd |
260 | ### This is the normal case when you invoke: pd2text foo.pd |
261 | if ($enabib) { |
261 | if ($enabib) { |
262 | open BIB,">$texdir$base.bib" or die "Cannot write $texdir$base.bib: $!"; |
262 | open BIB,">$texdir$base.bib" or die "Cannot write $texdir$base.bib: $!"; |
263 | } |
263 | } |
264 | open TEX,">$texdir$base.tex" or die "Cannot write $texdir$base.tex: $!"; |
264 | open TEX,">$texdir$base.tex" or die "Cannot write $texdir$base.tex: $!"; |
265 | warn "Writing $texdir$base.tex"; |
265 | warn "Writing $texdir$base.tex"; |
266 | } |
266 | } |
267 | } |
267 | } |
268 | if ($nohtml || $dryrun) { |
268 | if ($nohtml || $dryrun) { |
269 | open HTML,">/dev/null"; |
269 | open HTML,">/dev/null"; |
270 | } else { |
270 | } else { |
271 | if (!length($htmldir) || -d $htmldir) { |
271 | if (!length($htmldir) || -d $htmldir) { |
272 | $html1 = "$base.html"; |
272 | $html1 = "$base.html"; |
273 | open HTML,">$htmldir$html1" or die "Cannot write $htmldir$html1: $!"; |
273 | open HTML,">$htmldir$html1" or die "Cannot write $htmldir$html1: $!"; |
274 | warn "Writing $htmldir$html1"; |
274 | warn "Writing $htmldir$html1"; |
275 | } else { |
275 | } else { |
276 | warn "WARNING: For HTML conversion to work, you must create subdirectory called html. E.g. pd2tex -init (or mkdir html)"; |
276 | warn "WARNING: For HTML conversion to work, you must create subdirectory called html. E.g. pd2tex -init (or mkdir html)"; |
277 | open HTML,">/dev/null"; |
277 | open HTML,">/dev/null"; |
278 | $html1 = undef; |
278 | $html1 = undef; |
279 | } |
279 | } |
280 | } |
280 | } |
281 | if ($nohtml2 || $dryrun) { |
281 | if ($nohtml2 || $dryrun) { |
282 | open HTML2,">/dev/null"; |
282 | open HTML2,">/dev/null"; |
283 | $html2 = undef; |
283 | $html2 = undef; |
284 | } else { |
284 | } else { |
285 | if (!length($htmldir) || -d $htmldir) { |
285 | if (!length($htmldir) || -d $htmldir) { |
286 | $html2 = "$base-front-matter.html"; |
286 | $html2 = "$base-front-matter.html"; |
287 | open HTML2,">$htmldir$html2" or die "Cannot write $htmldir$html2: $!"; |
287 | open HTML2,">$htmldir$html2" or die "Cannot write $htmldir$html2: $!"; |
288 | warn "Writing $htmldir$html2"; |
288 | warn "Writing $htmldir$html2"; |
289 | } else { |
289 | } else { |
290 | warn "WARNING: For HTML conversion to work, you must create subdirectory called html. E.g. mkdir html"; |
290 | warn "WARNING: For HTML conversion to work, you must create subdirectory called html. E.g. mkdir html"; |
291 | open HTML2,">/dev/null"; |
291 | open HTML2,">/dev/null"; |
292 | $html2 = undef; |
292 | $html2 = undef; |
293 | } |
293 | } |
294 | } |
294 | } |
295 | if ($nodbx || $dryrun) { |
295 | if ($nodbx || $dryrun) { |
296 | open DBX,">/dev/null"; |
296 | open DBX,">/dev/null"; |
297 | } else { |
297 | } else { |
298 | open DBX,">$dbxdir$base.dbx" or die "Cannot write $dbxdir$base.dbx: $!"; |
298 | open DBX,">$dbxdir$base.dbx" or die "Cannot write $dbxdir$base.dbx: $!"; |
299 | warn "Writing $dbxdir$base.dbx"; |
299 | warn "Writing $dbxdir$base.dbx"; |
300 | } |
300 | } |
301 | if ($nortf || $dryrun) { |
301 | if ($nortf || $dryrun) { |
302 | open RTF,">/dev/null"; |
302 | open RTF,">/dev/null"; |
303 | } else { |
303 | } else { |
304 | open RTF,">$rtfdir$base.rtf" or die "Cannot write $rtfdir$base.rtf: $!"; |
304 | open RTF,">$rtfdir$base.rtf" or die "Cannot write $rtfdir$base.rtf: $!"; |
305 | warn "Writing $rtfdir$base.rtf"; |
305 | warn "Writing $rtfdir$base.rtf"; |
306 | } |
306 | } |
307 | } else { |
307 | } else { |
308 | if ($dbx_filter) { |
308 | if ($dbx_filter) { |
309 | open BIB,">/dev/null"; |
309 | open BIB,">/dev/null"; |
310 | open TEX,">/dev/null"; |
310 | open TEX,">/dev/null"; |
311 | open DBX,">&STDOUT"; |
311 | open DBX,">&STDOUT"; |
312 | open RTF,">/dev/null"; |
312 | open RTF,">/dev/null"; |
313 | open NONL,">/dev/null"; |
313 | open NONL,">/dev/null"; |
314 | open PDSEAL,">/dev/null"; |
314 | open PDSEAL,">/dev/null"; |
315 | open HTML,">/dev/null"; |
315 | open HTML,">/dev/null"; |
316 | open HTML2,">/dev/null"; |
316 | open HTML2,">/dev/null"; |
317 | $html2 = undef; |
317 | $html2 = undef; |
318 | } elsif ($html_filter) { |
318 | } elsif ($html_filter) { |
319 | open BIB,">/dev/null"; |
319 | open BIB,">/dev/null"; |
320 | open TEX,">/dev/null"; |
320 | open TEX,">/dev/null"; |
321 | open DBX,">/dev/null"; |
321 | open DBX,">/dev/null"; |
322 | open RTF,">/dev/null"; |
322 | open RTF,">/dev/null"; |
323 | open NONL,">/dev/null"; |
323 | open NONL,">/dev/null"; |
324 | open PDSEAL,">/dev/null"; |
324 | open PDSEAL,">/dev/null"; |
325 | open HTML,">&STDOUT"; |
325 | open HTML,">&STDOUT"; |
326 | open HTML2,">/dev/null"; |
326 | open HTML2,">/dev/null"; |
327 | $html2 = undef; |
327 | $html2 = undef; |
328 | } else { |
328 | } else { |
329 | open BIB,">/dev/null"; |
329 | open BIB,">/dev/null"; |
330 | open TEX,">&STDOUT"; |
330 | open TEX,">&STDOUT"; |
331 | open DBX,">/dev/null"; |
331 | open DBX,">/dev/null"; |
332 | open RTF,">/dev/null"; |
332 | open RTF,">/dev/null"; |
333 | open NONL,">/dev/null"; |
333 | open NONL,">/dev/null"; |
334 | open PDSEAL,">/dev/null"; |
334 | open PDSEAL,">/dev/null"; |
335 | open HTML,">/dev/null"; |
335 | open HTML,">/dev/null"; |
336 | open HTML2,">/dev/null"; |
336 | open HTML2,">/dev/null"; |
337 | $html2 = undef; |
337 | $html2 = undef; |
338 | } |
338 | } |
339 | $nopdf = 1; |
339 | $nopdf = 1; |
340 | } |
340 | } |
341 | 341 | ||
342 | # Exceptions to the two letter country code recognition |
342 | # Exceptions to the two letter country code recognition |
343 | %not_a_country = ( pl=>'perl', cc=>'c++', hh=>'c++ hdr', sh=>'Shell', |
343 | %not_a_country = ( pl=>'perl', cc=>'c++', hh=>'c++ hdr', sh=>'Shell', |
344 | ds=>'DirectoryScript', pd=>'PlainDoc', so=>'Shared Object' ); |
344 | ds=>'DirectoryScript', pd=>'PlainDoc', so=>'Shared Object' ); |
345 | 345 | ||
346 | # Exceptions to dot designates path rule |
346 | # Exceptions to dot designates path rule |
347 | %not_a_path = ( 'i.e'=>1, 'e.g'=>1, 'p.ex'=>1, 'E.U'=>1, 'U.E'=>1, 'U.S'=>1, |
347 | %not_a_path = ( 'i.e'=>1, 'e.g'=>1, 'p.ex'=>1, 'E.U'=>1, 'U.E'=>1, 'U.S'=>1, |
348 | 'and/or'=>1, 'AND/OR'=>1, 'e/ou'=>1, 'ja/tai'=>1, |
348 | 'and/or'=>1, 'AND/OR'=>1, 'e/ou'=>1, 'ja/tai'=>1, |
349 | 'c.d'=>1, 'n.b' => 1, 'N.B'=>1, 'S.A'=>1, 'n/a'=>1); |
349 | 'c.d'=>1, 'n.b' => 1, 'N.B'=>1, 'S.A'=>1, 'n/a'=>1); |
350 | 350 | ||
351 | $encoding = 'UTF-8'; # only for dbx |
351 | $encoding = 'UTF-8'; # only for dbx |
352 | #$encoding = 'Latin1'; |
352 | #$encoding = 'Latin1'; |
353 | #$code_tag = 'literallayout'; |
353 | #$code_tag = 'literallayout'; |
354 | $code_open_tag = '<programlisting format="non-normative-code"><computeroutput>'; # used for indented code blocks |
354 | $code_open_tag = '<programlisting format="non-normative-code"><computeroutput>'; # used for indented code blocks |
355 | $code_close_tag = '</computeroutput></programlisting>'; # used for indented code blocks |
355 | $code_close_tag = '</computeroutput></programlisting>'; # used for indented code blocks |
356 | $tag_tag = 'command'; |
356 | $tag_tag = 'command'; |
357 | %dbx_list_open = ( |
357 | %dbx_list_open = ( |
358 | '1' => qq(<orderedlist>\n), |
358 | '1' => qq(<orderedlist>\n), |
359 | 'a' => qq(<orderedlist numeration="loweralpha">\n), |
359 | 'a' => qq(<orderedlist numeration="loweralpha">\n), |
360 | 'A' => qq(<orderedlist numeration="upperalpha">\n), |
360 | 'A' => qq(<orderedlist numeration="upperalpha">\n), |
361 | 'i' => qq(<orderedlist numeration="loweralpha">\n), |
361 | 'i' => qq(<orderedlist numeration="loweralpha">\n), |
362 | 'I' => qq(<orderedlist numeration="loweralpha">\n), |
362 | 'I' => qq(<orderedlist numeration="loweralpha">\n), |
363 | '*' => qq(<itemizedlist mark="bullet">\n), |
363 | '*' => qq(<itemizedlist mark="bullet">\n), |
364 | '-' => qq(<itemizedlist mark="hyphen">\n), |
364 | '-' => qq(<itemizedlist mark="hyphen">\n), |
365 | '+' => qq(<itemizedlist mark="plus">\n), |
365 | '+' => qq(<itemizedlist mark="plus">\n), |
366 | 'o' => qq(<itemizedlist mark="opencircle">\n), |
366 | 'o' => qq(<itemizedlist mark="opencircle">\n), |
367 | ':' => qq(<variablelist>\n), # termlength="20" |
367 | ':' => qq(<variablelist>\n), # termlength="20" |
368 | ); |
368 | ); |
369 | %dbx_list_close = ( |
369 | %dbx_list_close = ( |
370 | '1' => qq(</orderedlist>\n\n), |
370 | '1' => qq(</orderedlist>\n\n), |
371 | 'a' => qq(</orderedlist>\n\n), 'A' => qq(</orderedlist>\n\n), |
371 | 'a' => qq(</orderedlist>\n\n), 'A' => qq(</orderedlist>\n\n), |
372 | 'i' => qq(</orderedlist>\n\n), 'I' => qq(</orderedlist>\n\n), |
372 | 'i' => qq(</orderedlist>\n\n), 'I' => qq(</orderedlist>\n\n), |
373 | '*' => qq(</itemizedlist>\n\n), '-' => qq(</itemizedlist>\n\n), |
373 | '*' => qq(</itemizedlist>\n\n), '-' => qq(</itemizedlist>\n\n), |
374 | '+' => qq(</itemizedlist>\n\n), 'o' => qq(</itemizedlist>\n\n), |
374 | '+' => qq(</itemizedlist>\n\n), 'o' => qq(</itemizedlist>\n\n), |
375 | ':' => qq(</variablelist>\n\n), |
375 | ':' => qq(</variablelist>\n\n), |
376 | ); |
376 | ); |
377 | 377 | ||
378 | # html |
378 | # html |
379 | 379 | ||
380 | %html_list_open = ( |
380 | %html_list_open = ( |
381 | '1' => qq(<ol>\n), |
381 | '1' => qq(<ol>\n), |
382 | 'a' => qq(<ol>\n), 'A' => qq(<ol>\n), |
382 | 'a' => qq(<ol>\n), 'A' => qq(<ol>\n), |
383 | 'i' => qq(<ol>\n), 'I' => qq(<ol>\n), |
383 | 'i' => qq(<ol>\n), 'I' => qq(<ol>\n), |
384 | '*' => qq(<ul>\n), '-' => qq(<ul>\n), |
384 | '*' => qq(<ul>\n), '-' => qq(<ul>\n), |
385 | '+' => qq(<ul>\n), 'o' => qq(<ul>\n), |
385 | '+' => qq(<ul>\n), 'o' => qq(<ul>\n), |
386 | ':' => qq(<dl>\n), |
386 | ':' => qq(<dl>\n), |
387 | ); |
387 | ); |
388 | %html_list_close = ( |
388 | %html_list_close = ( |
389 | '1' => qq(</ol>\n\n), |
389 | '1' => qq(</ol>\n\n), |
390 | 'a' => qq(</ol>\n\n), 'A' => qq(</ol>\n\n), |
390 | 'a' => qq(</ol>\n\n), 'A' => qq(</ol>\n\n), |
391 | 'i' => qq(</ol>\n\n), 'I' => qq(</ol>\n\n), |
391 | 'i' => qq(</ol>\n\n), 'I' => qq(</ol>\n\n), |
392 | '*' => qq(</ul>\n\n), '-' => qq(</ul>\n\n), |
392 | '*' => qq(</ul>\n\n), '-' => qq(</ul>\n\n), |
393 | '+' => qq(</ul>\n\n), 'o' => qq(</ul>\n\n), |
393 | '+' => qq(</ul>\n\n), 'o' => qq(</ul>\n\n), |
394 | ':' => qq(</dl>\n\n), |
394 | ':' => qq(</dl>\n\n), |
395 | ); |
395 | ); |
396 | 396 | ||
397 | # rtf |
397 | # rtf |
398 | 398 | ||
399 | %ord_mark = ( |
399 | %ord_mark = ( |
400 | '1' => [ qw(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30) ], |
400 | '1' => [ qw(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30) ], |
401 | 'a' => [ qw(a b c d e f g h i j k l m n o p q r s t u v w x y z) ], |
401 | 'a' => [ qw(a b c d e f g h i j k l m n o p q r s t u v w x y z) ], |
402 | 'A' => [ qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) ], |
402 | 'A' => [ qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) ], |
403 | 'i' => [ qw(i ii iii iv v vi vii viii ix x xi xii xiii xiv xv xvi xvii xviii xix xx) ], |
403 | 'i' => [ qw(i ii iii iv v vi vii viii ix x xi xii xiii xiv xv xvi xvii xviii xix xx) ], |
404 | 'I' => [ qw(I II III IV V VI VII VIII IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX) ], |
404 | 'I' => [ qw(I II III IV V VI VII VIII IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX) ], |
405 | ); |
405 | ); |
406 | 406 | ||
407 | $rtf_tabs = '\tx720 \tx1440 \tx2160 \tx2880'; |
407 | $rtf_tabs = '\tx720 \tx1440 \tx2160 \tx2880'; |
408 | 408 | ||
409 | %rtf_styles = ( |
409 | %rtf_styles = ( |
410 | 'ds1' => 'SEC1;', |
410 | 'ds1' => 'SEC1;', |
411 | 'ds2' => 'SEC2;', |
411 | 'ds2' => 'SEC2;', |
412 | 'ds3' => 'SEC3;', |
412 | 'ds3' => 'SEC3;', |
413 | 'ds4' => 'SEC4;', |
413 | 'ds4' => 'SEC4;', |
414 | 'ds5' => 'SEC5;', |
414 | 'ds5' => 'SEC5;', |
415 | 'ds6' => 'SEC6;', |
415 | 'ds6' => 'SEC6;', |
416 | 416 | ||
417 | 's1' => '\sa360 \keepn \fs48 \b H1;', |
417 | 's1' => '\sa360 \keepn \fs48 \b H1;', |
418 | 's2' => '\sa320 \keepn \fs36 \b H2;', |
418 | 's2' => '\sa320 \keepn \fs36 \b H2;', |
419 | 's3' => '\sa280 \keepn \fs30 \b H3;', |
419 | 's3' => '\sa280 \keepn \fs30 \b H3;', |
420 | 's4' => '\sa220 \keepn \fs24 \b H4;', |
420 | 's4' => '\sa220 \keepn \fs24 \b H4;', |
421 | 's5' => '\sa220 \keepn \fs24 \b H5;', |
421 | 's5' => '\sa220 \keepn \fs24 \b H5;', |
422 | 's6' => '\sa220 \keepn \fs24 \b H6;', |
422 | 's6' => '\sa220 \keepn \fs24 \b H6;', |
423 | 423 | ||
424 | 's10' => '\sa360 para;', |
424 | 's10' => '\sa360 para;', |
425 | 's14' => '\qc \sa360 \fs56 \b Title;', |
425 | 's14' => '\qc \sa360 \fs56 \b Title;', |
426 | 's15' => '\qc \sa360 \i Author;', |
426 | 's15' => '\qc \sa360 \i Author;', |
427 | 's16' => '\qj \sa360 \li720 \ri720 \i Abstract;', |
427 | 's16' => '\qj \sa360 \li720 \ri720 \i Abstract;', |
428 | 428 | ||
429 | 's21' => '\sa180 \qj \li360 \ri360 blockquote1;', |
429 | 's21' => '\sa180 \qj \li360 \ri360 blockquote1;', |
430 | 's22' => '\sa180 \qj \li720 \ri720 blockquote2;', |
430 | 's22' => '\sa180 \qj \li720 \ri720 blockquote2;', |
431 | 's23' => '\sa180 \qj \li1080 \ri1080 blockquote3;', |
431 | 's23' => '\sa180 \qj \li1080 \ri1080 blockquote3;', |
432 | 's24' => '\sa180 \qj \li1440 \ri1440 blockquote4;', |
432 | 's24' => '\sa180 \qj \li1440 \ri1440 blockquote4;', |
433 | 433 | ||
434 | 's31' => $rtf_tabs . ' \sa180 \li720 \ri180 \fi-720 list1;', |
434 | 's31' => $rtf_tabs . ' \sa180 \li720 \ri180 \fi-720 list1;', |
435 | 's32' => $rtf_tabs . ' \sa180 \li1440 \ri180 \fi-720 list2;', |
435 | 's32' => $rtf_tabs . ' \sa180 \li1440 \ri180 \fi-720 list2;', |
436 | 's33' => $rtf_tabs . ' \sa180 \li2160 \ri180 \fi-720 list3;', |
436 | 's33' => $rtf_tabs . ' \sa180 \li2160 \ri180 \fi-720 list3;', |
437 | 's34' => $rtf_tabs . ' \sa180 \li2880 \ri180 \fi-720 list4;', |
437 | 's34' => $rtf_tabs . ' \sa180 \li2880 \ri180 \fi-720 list4;', |
438 | ); |
438 | ); |
439 | 439 | ||
440 | %rtf_list_item = ( |
440 | %rtf_list_item = ( |
441 | '1' => qq({\\pn \\pnlvl!!N !!M. ), |
441 | '1' => qq({\\pn \\pnlvl!!N !!M. ), |
442 | 'a' => qq({\\pn \\pnlvl!!N !!M. ), 'A' => qq({\\pn \\pnlvl!!N !!M. ), |
442 | 'a' => qq({\\pn \\pnlvl!!N !!M. ), 'A' => qq({\\pn \\pnlvl!!N !!M. ), |
443 | 'i' => qq({\\pn \\pnlvl!!N !!M. ), 'I' => qq({\\pn \\pnlvl!!N !!M. ), |
443 | 'i' => qq({\\pn \\pnlvl!!N !!M. ), 'I' => qq({\\pn \\pnlvl!!N !!M. ), |
444 | #'*' => qq({\\par \\pard \\bullet ), '-' => qq(\\par \\pard - ), |
444 | #'*' => qq({\\par \\pard \\bullet ), '-' => qq(\\par \\pard - ), |
445 | '*' => qq({\\pn \\pnlvl!!N \\pnlvlblt {\\pntxtb \\bullet} ), '-' => qq({\\pn \\pnlvl!!N \\pnlvlblt {\\pntxtb -} ), |
445 | '*' => qq({\\pn \\pnlvl!!N \\pnlvlblt {\\pntxtb \\bullet} ), '-' => qq({\\pn \\pnlvl!!N \\pnlvlblt {\\pntxtb -} ), |
446 | '+' => qq({\\pn \\pnlvl!!N \\pnlvlblt {\\pntxtb +} ), 'o' => qq({\\pn \\pnlvl!!N \\pnlvlblt {\\pntxtb o} ), |
446 | '+' => qq({\\pn \\pnlvl!!N \\pnlvlblt {\\pntxtb +} ), 'o' => qq({\\pn \\pnlvl!!N \\pnlvlblt {\\pntxtb o} ), |
447 | ) if 0; |
447 | ) if 0; |
448 | 448 | ||
449 | %rtf_list_item = ( |
449 | %rtf_list_item = ( |
450 | '1'=>"{\\pard !!S \\s3!!N\n!!M.\\tab ", |
450 | '1'=>"{\\pard !!S \\s3!!N\n!!M.\\tab ", |
451 | 'a'=>"{\\pard !!S \\s3!!N\n!!M.\\tab ", 'A'=>"{\\pard !!S \\s3!!N\n!!M.\\tab ", |
451 | 'a'=>"{\\pard !!S \\s3!!N\n!!M.\\tab ", 'A'=>"{\\pard !!S \\s3!!N\n!!M.\\tab ", |
452 | 'i'=>"{\\pard !!S \\s3!!N\n!!M.\\tab ", 'I'=>"{\\pard !!S \\s3!!N\n!!M.\\tab ", |
452 | 'i'=>"{\\pard !!S \\s3!!N\n!!M.\\tab ", 'I'=>"{\\pard !!S \\s3!!N\n!!M.\\tab ", |
453 | '*'=>"{\\pard !!S \\s3!!N\n\\'b7\\tab ", '-'=>"{\\pard !!S \\s3!!N\n-\\tab ", |
453 | '*'=>"{\\pard !!S \\s3!!N\n\\'b7\\tab ", '-'=>"{\\pard !!S \\s3!!N\n-\\tab ", |
454 | '+'=>"{\\pard !!S \\s3!!N\n+\\tab ", 'o'=>"{\\pard !!S \\s3!!N\no\\tab ", |
454 | '+'=>"{\\pard !!S \\s3!!N\n+\\tab ", 'o'=>"{\\pard !!S \\s3!!N\no\\tab ", |
455 | ) if 1; |
455 | ) if 1; |
456 | 456 | ||
457 | $enum = 'enumerate'; |
457 | $enum = 'enumerate'; |
458 | #$enum = 'denseenum'; |
458 | #$enum = 'denseenum'; |
459 | $itemize = 'itemize'; |
459 | $itemize = 'itemize'; |
460 | #$itemize = 'denseitemize'; |
460 | #$itemize = 'denseitemize'; |
461 | 461 | ||
462 | %tex_list_open = ( |
462 | %tex_list_open = ( |
463 | '1' => qq(\\begin{$enum}[1.]\n), |
463 | '1' => qq(\\begin{$enum}[1.]\n), |
464 | 'a' => qq(\\begin{$enum}[a.]\n), 'A' => qq(\\begin{$enum}[A.]\n), |
464 | 'a' => qq(\\begin{$enum}[a.]\n), 'A' => qq(\\begin{$enum}[A.]\n), |
465 | 'i' => qq(\\begin{$enum}[i.]\n), 'I' => qq(\\begin{$enum}[I.]\n), |
465 | 'i' => qq(\\begin{$enum}[i.]\n), 'I' => qq(\\begin{$enum}[I.]\n), |
466 | '*' => qq(\\begin{$itemize}\n), '-' => qq(\\begin{$itemize}\n), |
466 | '*' => qq(\\begin{$itemize}\n), '-' => qq(\\begin{$itemize}\n), |
467 | '+' => qq(\\begin{$itemize}\n), 'o' => qq(\\begin{$itemize}\n), |
467 | '+' => qq(\\begin{$itemize}\n), 'o' => qq(\\begin{$itemize}\n), |
468 | ':' => qq(\\begin{description}\n), |
468 | ':' => qq(\\begin{description}\n), |
469 | ); |
469 | ); |
470 | %tex_list_item = ( |
470 | %tex_list_item = ( |
471 | '1' => qq(\\item ), |
471 | '1' => qq(\\item ), |
472 | 'a' => qq(\\item ), 'A' => qq(\\item ), |
472 | 'a' => qq(\\item ), 'A' => qq(\\item ), |
473 | 'i' => qq(\\item ), 'I' => qq(\\item ), |
473 | 'i' => qq(\\item ), 'I' => qq(\\item ), |
474 | '*' => qq(\\item ), '-' => qq(\\item[-] ), |
474 | '*' => qq(\\item ), '-' => qq(\\item[-] ), |
475 | '+' => qq(\\item[+] ), 'o' => qq(\\item[o] ), |
475 | '+' => qq(\\item[+] ), 'o' => qq(\\item[o] ), |
476 | ':' => qq(\\item[notused]\n), |
476 | ':' => qq(\\item[notused]\n), |
477 | ); |
477 | ); |
478 | %tex_list_close = ( |
478 | %tex_list_close = ( |
479 | '1' => qq(\\end{$enum}\n\n), |
479 | '1' => qq(\\end{$enum}\n\n), |
480 | 'a' => qq(\\end{$enum}\n\n), 'A' => qq(\\end{$enum}\n\n), |
480 | 'a' => qq(\\end{$enum}\n\n), 'A' => qq(\\end{$enum}\n\n), |
481 | 'i' => qq(\\end{$enum}\n\n), 'I' => qq(\\end{$enum}\n\n), |
481 | 'i' => qq(\\end{$enum}\n\n), 'I' => qq(\\end{$enum}\n\n), |
482 | '*' => qq(\\end{$itemize}\n\n), '-' => qq(\\end{$itemize}\n\n), |
482 | '*' => qq(\\end{$itemize}\n\n), '-' => qq(\\end{$itemize}\n\n), |
483 | '+' => qq(\\end{$itemize}\n\n), 'o' => qq(\\end{$itemize}\n\n), |
483 | '+' => qq(\\end{$itemize}\n\n), 'o' => qq(\\end{$itemize}\n\n), |
484 | ':' => qq(\\end{description}\n\n), |
484 | ':' => qq(\\end{description}\n\n), |
485 | ); |
485 | ); |
486 | 486 | ||
487 | %tex_align = ( l => '', r => '\\hfill ', c => '\\centering' ); # , '' => ' \\raggedright' |
487 | %tex_align = ( l => '', r => '\\hfill ', c => '\\centering' ); # , '' => ' \\raggedright' |
488 | %th_align = ( l => ' align=left', r => ' align=right', c => '' ); |
488 | %th_align = ( l => ' align=left', r => ' align=right', c => '' ); |
489 | %td_align = ( l => '', r => ' align=right', c => ' align=center' ); |
489 | %td_align = ( l => '', r => ' align=right', c => ' align=center' ); |
490 | 490 | ||
491 | $class = 'article'; |
491 | $class = 'article'; |
492 | $tex_doc_class = "\\documentclass[12pt]{article}\n"; |
492 | $tex_doc_class = "\\documentclass[12pt]{article}\n"; |
493 | 493 | ||
494 | # See also <<texsections: ignore section* subsection* subsubsection* subsubsubsection* paragraph*>> |
494 | # See also <<texsections: ignore section* subsection* subsubsection* subsubsubsection* paragraph*>> |
495 | # N.B. subsubsubsection does not exist in all LaTeX document styles |
495 | # N.B. subsubsubsection does not exist in all LaTeX document styles |
496 | # ==== ---- ~~~~ ^^^^ |
496 | # ==== ---- ~~~~ ^^^^ |
497 | @tex_sec_article = qw( ignore section subsection subsubsection textbf paragraph ); |
497 | @tex_sec_article = qw( ignore section subsection subsubsection textbf paragraph ); |
498 | @tex_sec_slide = qw( ignore section* subsection* subsubsection* subsubsubsection* paragraph* ); |
498 | @tex_sec_slide = qw( ignore section* subsection* subsubsection* subsubsubsection* paragraph* ); |
499 | @tex_sec_book = qw( ignore chapter section subsection subsubsection subsubsubsection paragraph ); |
499 | @tex_sec_book = qw( ignore chapter section subsection subsubsection subsubsubsection paragraph ); |
500 | @tex_sec = @tex_sec_article; |
500 | @tex_sec = @tex_sec_article; |
501 | #$tex_flt_place = '!hbp'; |
501 | #$tex_flt_place = '!hbp'; |
502 | $tex_flt_place = '!hbt'; #Removed p because you usually do not want all the images in one page at the end of the chapter |
502 | $tex_flt_place = '!hbt'; #Removed p because you usually do not want all the images in one page at the end of the chapter |
503 | $includegraphics = '\\includegraphics[width=1.0\\textwidth,height=1.0\\textheight,keepaspectratio]'; |
503 | $includegraphics = '\\includegraphics[width=1.0\\textwidth,height=1.0\\textheight,keepaspectratio]'; |
504 | $maketitle = '\\maketitle'; |
504 | $maketitle = '\\maketitle'; |
505 | $moretexpreamble = <<LATEX; |
505 | $moretexpreamble = <<LATEX; |
506 | \\setlength\\parskip{\\medskipamount} |
506 | \\setlength\\parskip{\\medskipamount} |
507 | \\setlength\\parindent{0pt} |
507 | \\setlength\\parindent{0pt} |
508 | \\lfoot{\\today} |
508 | \\lfoot{\\today} |
509 | \\cfoot{!?!AUTHOR} |
509 | \\cfoot{!?!AUTHOR} |
510 | \\rfoot{!?!HEADER_TITLE, p. \\thepage !?!AFTER_PAGE} |
510 | \\rfoot{!?!HEADER_TITLE, p. \\thepage !?!AFTER_PAGE} |
511 | LATEX |
511 | LATEX |
512 | ; |
512 | ; |
513 | $moretexpreamble_empty = <<LATEX; |
513 | $moretexpreamble_empty = <<LATEX; |
514 | \\setlength\\parskip{\\medskipamount} |
514 | \\setlength\\parskip{\\medskipamount} |
515 | \\setlength\\parindent{0pt} |
515 | \\setlength\\parindent{0pt} |
516 | LATEX |
516 | LATEX |
517 | ; |
517 | ; |
518 | #\\lhead{} |
518 | #\\lhead{} |
519 | #\\chead{} |
519 | #\\chead{} |
520 | #\\rhead{} |
520 | #\\rhead{} |
521 | #\\lfoot{} |
521 | #\\lfoot{} |
522 | #\\cfoot{} |
522 | #\\cfoot{} |
523 | #\\rfoot{} |
523 | #\\rfoot{} |
524 | #LATEX |
524 | #LATEX |
525 | # ; |
525 | # ; |
526 | 526 | ||
527 | $moretexpreamble_clean = <<LATEX; |
527 | $moretexpreamble_clean = <<LATEX; |
528 | \\setlength\\parskip{\\medskipamount} |
528 | \\setlength\\parskip{\\medskipamount} |
529 | \\setlength\\parindent{0pt} |
529 | \\setlength\\parindent{0pt} |
530 | \\lhead{} |
530 | \\lhead{} |
531 | \\chead{} |
531 | \\chead{} |
532 | \\rhead{} |
532 | \\rhead{} |
533 | \\lfoot{} |
533 | \\lfoot{} |
534 | \\cfoot{} |
534 | \\cfoot{} |
535 | \\rfoot{} |
535 | \\rfoot{} |
536 | \\pagestyle{empty} |
536 | \\pagestyle{empty} |
537 | LATEX |
537 | LATEX |
538 | ; |
538 | ; |
539 | 539 | ||
540 | $moretexpreamble_confidential = <<LATEX; |
540 | $moretexpreamble_confidential = <<LATEX; |
541 | \\setlength\\parskip{\\medskipamount} |
541 | \\setlength\\parskip{\\medskipamount} |
542 | \\setlength\\parindent{0pt} |
542 | \\setlength\\parindent{0pt} |
543 | \\lfoot{\\today\\\\Proprietary and Confidential. May contain privileged information.} |
543 | \\lfoot{\\today\\\\Proprietary and Confidential. May contain privileged information.} |
544 | \\cfoot{\\copyright !?!COPYRIGHT} |
544 | \\cfoot{\\copyright !?!COPYRIGHT} |
545 | \\rfoot{!?!HEADER_TITLE, p. \\thepage !?!AFTER_PAGE} |
545 | \\rfoot{!?!HEADER_TITLE, p. \\thepage !?!AFTER_PAGE} |
546 | LATEX |
546 | LATEX |
547 | ; |
547 | ; |
548 | 548 | ||
549 | $tex_boxed_tab = 1; |
549 | $tex_boxed_tab = 1; |
550 | if ($tex_boxed_tab) { |
550 | if ($tex_boxed_tab) { |
551 | $tex_tab_hdr_sep = "\\\\\n\\hline\n\\hline\n"; |
551 | $tex_tab_hdr_sep = "\\\\\n\\hline\n\\hline\n"; |
552 | $tex_tab_line_sep = "\\\\\n\\hline\n"; |
552 | $tex_tab_line_sep = "\\\\\n\\hline\n"; |
553 | $tex_left_bar = '|'; |
553 | $tex_left_bar = '|'; |
554 | $tex_top_line = "\\hline\n"; |
554 | $tex_top_line = "\\hline\n"; |
555 | $tex_bot_line = "\\\\\n\\hline\n"; |
555 | $tex_bot_line = "\\\\\n\\hline\n"; |
556 | } else { |
556 | } else { |
557 | $tex_tab_hdr_sep = "\\\\\n\\hline\n"; |
557 | $tex_tab_hdr_sep = "\\\\\n\\hline\n"; |
558 | $tex_tab_line_sep = "\\\\\n"; |
558 | $tex_tab_line_sep = "\\\\\n"; |
559 | $tex_left_bar = ''; |
559 | $tex_left_bar = ''; |
560 | $tex_top_line = ''; |
560 | $tex_top_line = ''; |
561 | $tex_bot_line = ''; |
561 | $tex_bot_line = ''; |
562 | } |
562 | } |
563 | 563 | ||
564 | $toc_enable = ''; |
564 | $toc_enable = ''; |
565 | 565 | ||
566 | $dbxpreamble = <<DBX; # <!ENTITY legalnotice SYSTEM "../legal/legalnotice-sg-1.0.dbx"> |
566 | $dbxpreamble = <<DBX; # <!ENTITY legalnotice SYSTEM "../legal/legalnotice-sg-1.0.dbx"> |
567 | <?xml version="1.0" encoding="$encoding"?> |
567 | <?xml version="1.0" encoding="$encoding"?> |
568 | <!DOCTYPE article SYSTEM "../../src/dtd/libdocbook.dtd" [ |
568 | <!DOCTYPE article SYSTEM "../../src/dtd/libdocbook.dtd" [ |
569 | <!ENTITY % xinclude SYSTEM "../../src/dtd/xinclude.mod"> |
569 | <!ENTITY % xinclude SYSTEM "../../src/dtd/xinclude.mod"> |
570 | %xinclude; |
570 | %xinclude; |
571 | <!ENTITY legalnotice SYSTEM "../legal/legalnotice-wsf-2.0.dbx"> |
571 | <!ENTITY legalnotice SYSTEM "../legal/legalnotice-wsf-2.0.dbx"> |
572 | ]> |
572 | ]> |
573 | DBX |
573 | DBX |
574 | ; |
574 | ; |
575 | 575 | ||
576 | # N.B. in the following !?! indicates a variable that will be substituted near end of processing |
576 | # N.B. in the following !?! indicates a variable that will be substituted near end of processing |
577 | 577 | ||
578 | $htmlpreamble2 = <<HTML2; |
578 | $htmlpreamble2 = <<HTML2; |
579 | <title>!?!TITLE</title> |
579 | <title>!?!TITLE</title> |
580 | <link type="text/css" rel="stylesheet" href="!?!BASE.css"> |
580 | <link type="text/css" rel="stylesheet" href="!?!BASE.css"> |
581 | <body bgcolor=white> |
581 | <body bgcolor=white> |
582 | [<a href="!?!PREV">Prev</a>]<hr> |
582 | [<a href="!?!PREV">Prev</a>]<hr> |
583 | HTML2 |
583 | HTML2 |
584 | ; |
584 | ; |
585 | $htmlpostamble2 = qq(<hr>[<a href="!?!PREV" class=prevBut>Prev</a> | <a href="!?!NEXT" class=nextBut>Next</a>]<hr>\n); |
585 | $htmlpostamble2 = qq(<hr>[<a href="!?!PREV" class=prevBut>Prev</a> | <a href="!?!NEXT" class=nextBut>Next</a>]<hr>\n); |
586 | 586 | ||
587 | ### End configure |
587 | ### End configure |
588 | 588 | ||
589 | use Data::Dumper; |
589 | use Data::Dumper; |
590 | use POSIX qw(strftime); |
590 | use POSIX qw(strftime); |
591 | $curdate = strftime "%e %b %Y", gmtime; |
591 | $curdate = strftime "%e %b %Y", gmtime; |
592 | $yyyy = 1900 + (gmtime)[5]; |
592 | $yyyy = 1900 + (gmtime)[5]; |
593 | 593 | ||
594 | ### Expand all %include_pd() and %include_code() sections |
594 | ### Expand all %include_pd() and %include_code() sections |
595 | 595 | ||
596 | sub readall { |
596 | sub readall { |
597 | my ($f, $dont_die_on_unfound) = @_; |
597 | my ($f, $dont_die_on_unfound) = @_; |
598 | unless (open X, "<$f") { |
598 | unless (open X, "<$f") { |
599 | if ($dont_die_on_unfound) { |
599 | if ($dont_die_on_unfound) { |
600 | warn "$i: Missing include file <<$f>>: $!"; |
600 | warn "$i: Missing include file <<$f>>: $!"; |
601 | warn `pwd`; |
601 | warn `pwd`; |
602 | return "***missing file $f***"; |
602 | return "***missing file $f***"; |
603 | } else { |
603 | } else { |
604 | die "Cant read($f): $!"; |
604 | die "Cant read($f): $!"; |
605 | } |
605 | } |
606 | } |
606 | } |
607 | undef $/; # warning: global effect |
607 | undef $/; # warning: global effect |
608 | my $x = <X>; |
608 | my $x = <X>; |
609 | close X; |
609 | close X; |
610 | return $x; |
610 | return $x; |
611 | } |
611 | } |
612 | 612 | ||
613 | sub writeall { |
613 | sub writeall { |
614 | my ($f,$x) = @_; |
614 | my ($f,$x) = @_; |
615 | open X, ">$f" or die "Cant write $f: $!"; |
615 | open X, ">$f" or die "Cant write $f: $!"; |
616 | warn "Writing $f"; |
616 | warn "Writing $f"; |
617 | print X $x; |
617 | print X $x; |
618 | close X; |
618 | close X; |
619 | } |
619 | } |
620 | 620 | ||
621 | sub include { |
621 | sub include { |
622 | my ($prefix,$path,$ext) = @_; |
622 | my ($prefix,$path,$ext) = @_; |
623 | return "$prefix<<$path$ext>>" if $path =~ /^\w+:/; # Specials |
623 | return "$prefix<<$path$ext>>" if $path =~ /^\w+:/; # Specials |
624 | if ($ext =~ /^\.(svg)|(e?ps)|(png)|(gif)|(jpe?g)$/i) { # Images |
624 | if ($ext =~ /^\.(svg)|(e?ps)|(png)|(gif)|(jpe?g)$/i) { # Images |
625 | warn(('-'x$inc_iter)." image: $path$ext\n"); |
625 | warn(('-'x$inc_iter)." image: $path$ext\n"); |
626 | return "$prefix<<$path$ext>>"; |
626 | return "$prefix<<$path$ext>>"; |
627 | } |
627 | } |
628 | #my $x = readall(($path=~m%^/%s) ? "$path$ext":"../$path$ext", 1); |
628 | #my $x = readall(($path=~m%^/%s) ? "$path$ext":"../$path$ext", 1); |
629 | my $x = readall("$path$ext", 1); |
629 | my $x = readall("$path$ext", 1); |
630 | warn(('-'x$inc_iter)." <<include: $path$ext>> got ".length($x)." chars\n"); |
630 | warn(('-'x$inc_iter)." <<include: $path$ext>> got ".length($x)." chars\n"); |
631 | $x =~ s/\r?\n<<EOF: .*?>>.*$//s; |
631 | $x =~ s/\r?\n<<EOF: .*?>>.*$//s; |
632 | if ($prefix =~ /^\s+$/) { # Verbatim block? |
632 | if ($prefix =~ /^\s+$/) { # Verbatim block? |
633 | $x =~ s/\n/\n$prefix/g; |
633 | $x =~ s/\n/\n$prefix/g; |
634 | return $prefix . $x; |
634 | return $prefix . $x; |
635 | } else { |
635 | } else { |
636 | return $x; |
636 | return $x; |
637 | } |
637 | } |
638 | } |
638 | } |
639 | 639 | ||
640 | sub incl_range { |
640 | sub incl_range { |
641 | my ($prefix,$path,$ext,$start,$end) = @_; |
641 | my ($prefix,$path,$ext,$start,$end) = @_; |
642 | my $x = readall($path.$ext, 1); |
642 | my $x = readall($path.$ext, 1); |
643 | my @lines = split /\r?\n/, $x; |
643 | my @lines = split /\r?\n/, $x; |
644 | warn(('-'x$inc_iter)." <<includerange:$path$ext: $start-$end>> got ".length($x)." chars, $#lines lines\n"); |
644 | warn(('-'x$inc_iter)." <<includerange:$path$ext: $start-$end>> got ".length($x)." chars, $#lines lines\n"); |
645 | @lines = splice @lines, $start, $end-$start; |
645 | @lines = splice @lines, $start, $end-$start; |
646 | $x = join "\n", @lines; |
646 | $x = join "\n", @lines; |
647 | if ($prefix =~ /^\s+$/) { # Verbatim block? |
647 | if ($prefix =~ /^\s+$/) { # Verbatim block? |
648 | $x =~ s/\n/\n$prefix/g; |
648 | $x =~ s/\n/\n$prefix/g; |
649 | return $prefix . $x; |
649 | return $prefix . $x; |
650 | } else { |
650 | } else { |
651 | return $x; |
651 | return $x; |
652 | } |
652 | } |
653 | } |
653 | } |
654 | 654 | ||
655 | sub hexit { |
655 | sub hexit { |
656 | my ($x,$tag) = @_; |
656 | my ($x,$tag) = @_; |
657 | $x =~ s/(.)/sprintf("%02x",ord($1))/ges; |
657 | $x =~ s/(.)/sprintf("%02x",ord($1))/ges; |
658 | return "^^^^^^^^$tag: $x~~~~~~~~" if $tag; |
658 | return "^^^^^^^^$tag: $x~~~~~~~~" if $tag; |
659 | return $x; |
659 | return $x; |
660 | } |
660 | } |
661 | 661 | ||
662 | sub unhexit { |
662 | sub unhexit { |
663 | my ($x) = @_; |
663 | my ($x) = @_; |
664 | $x =~ s/(..)/chr(hex($1))/gsex; |
664 | $x =~ s/(..)/chr(hex($1))/gsex; |
665 | return $x; |
665 | return $x; |
666 | } |
666 | } |
667 | 667 | ||
668 | sub def_macro { |
668 | sub def_macro { |
669 | my ($name, $value) = @_; |
669 | my ($name, $value) = @_; |
670 | #die "def_macro($name,$value)"; |
670 | #die "def_macro($name,$value)"; |
671 | $mac{$name} = $value unless defined $cmdline_mac{$name}; |
671 | $mac{$name} = $value unless defined $cmdline_mac{$name}; |
672 | return ''; |
672 | return ''; |
673 | } |
673 | } |
674 | 674 | ||
675 | sub def_specific_macro { |
675 | sub def_specific_macro { |
676 | my ($name, $tex, $dbx, $htm, $rtfl) = @_; |
676 | my ($name, $tex, $dbx, $htm, $rtfl) = @_; |
677 | #warn "SPECIFIC MACRO tex($tex) dbx($dbx) html($html)"; |
677 | #warn "SPECIFIC MACRO tex($tex) dbx($dbx) html($html)"; |
678 | $mac{$name} = ''; |
678 | $mac{$name} = ''; |
679 | $mac{$name} .= hexit($tex, 'RAWTEX') if $tex; |
679 | $mac{$name} .= hexit($tex, 'RAWTEX') if $tex; |
680 | $mac{$name} .= hexit($dbx, 'RAWDBX') if $dbx; |
680 | $mac{$name} .= hexit($dbx, 'RAWDBX') if $dbx; |
681 | $mac{$name} .= hexit($rtf, 'RAWRTF') if $rtf; |
681 | $mac{$name} .= hexit($rtf, 'RAWRTF') if $rtf; |
682 | $mac{$name} .= hexit($html,'RAWHTML') if $html; |
682 | $mac{$name} .= hexit($html,'RAWHTML') if $html; |
683 | #$tex_mac{$name} = $tex; |
683 | #$tex_mac{$name} = $tex; |
684 | #$dbx_mac{$name} = $dbx; |
684 | #$dbx_mac{$name} = $dbx; |
685 | #$html_mac{$name} = $html; |
685 | #$html_mac{$name} = $html; |
686 | return ''; |
686 | return ''; |
687 | } |
687 | } |
688 | 688 | ||
689 | sub extract_macros { |
689 | sub extract_macros { |
690 | # <<define: MACRO!value>> <<define: MACRO=value>> |
690 | # <<define: MACRO!value>> <<define: MACRO=value>> |
691 | # 1 1 2 2 |
691 | # 1 1 2 2 |
692 | $pd =~ s|\n<<define:\s+(\w+)[=!]([^>]+)>>|def_macro($1, $2)|gex; |
692 | $pd =~ s|\n<<define:\s+(\w+)[=!]([^>]+)>>|def_macro($1, $2)|gex; |
693 | #$pd =~ s|\n<<define:\s+\w+.*?>>\s*\n|HErE|sg; |
693 | #$pd =~ s|\n<<define:\s+\w+.*?>>\s*\n|HErE|sg; |
694 | # 1 1 2 tex 2 3 dbx 3 4 html 4 |
694 | # 1 1 2 tex 2 3 dbx 3 4 html 4 |
695 | #$pd =~ s/\n<<definespecific: (\w+)(?:!([^!>]+)(?:!([^!>]+)(?:!([^!>]+))?)?)?>>/def_specific_macro($1, $2, $3, $4)/gex; |
695 | #$pd =~ s/\n<<definespecific: (\w+)(?:!([^!>]+)(?:!([^!>]+)(?:!([^!>]+))?)?)?>>/def_specific_macro($1, $2, $3, $4)/gex; |
696 | # 1 1 2 tex 2 3 dbx 3 4 html 4 |
696 | # 1 1 2 tex 2 3 dbx 3 4 html 4 |
697 | $pd =~ s/\n<<definespecific:\s+(\w+)[!=]([^!]+)!([^!]+)!([^!]+?)>>/def_specific_macro($1, $2, $3, $4)/gex; |
697 | $pd =~ s/\n<<definespecific:\s+(\w+)[!=]([^!]+)!([^!]+)!([^!]+?)>>/def_specific_macro($1, $2, $3, $4)/gex; |
698 | $pd =~ s|\n<<default:\s+(\w+)!([^>]+)>>|def_macro($1, $2) if !defined $mac{$1}|gex; |
698 | $pd =~ s|\n<<default:\s+(\w+)!([^>]+)>>|def_macro($1, $2) if !defined $mac{$1}|gex; |
699 | } |
699 | } |
700 | 700 | ||
701 | ### |
701 | ### |
702 | ### Read in file, expand includes, process conditionals |
702 | ### Read in file, expand includes, process conditionals |
703 | ### |
703 | ### |
704 | 704 | ||
705 | undef $/; |
705 | undef $/; |
706 | $pd = <STDIN>; |
706 | $pd = <STDIN>; |
707 | warn "original input: ".length($pd)." chars\n"; |
707 | warn "original input: ".length($pd)." chars\n"; |
708 | $pd =~ s|\n<<define1st:\s+(\w+)[=!]([^>]+)>>|def_macro($1, $2)|gex; |
708 | $pd =~ s|\n<<define1st:\s+(\w+)[=!]([^>]+)>>|def_macro($1, $2)|gex; |
709 | #extract_macros(); # First iteration, only -D macros are valid |
709 | #extract_macros(); # First iteration, only -D macros are valid |
710 | for ($inc_iter = 1; $inc_iter <= 5; ++$inc_iter) { # 5 levels of include nesting |
710 | for ($inc_iter = 1; $inc_iter <= 5; ++$inc_iter) { # 5 levels of include nesting |
711 | #Remove lines beginning with % (by Fredrik Jonsson 070708) |
711 | #Remove lines beginning with % (by Fredrik Jonsson 070708) |
712 | # Unfortunately this seems to interfere with verbatim includes, esp. sg --Sampo |
712 | # Unfortunately this seems to interfere with verbatim includes, esp. sg --Sampo |
713 | #$/ = "\n"; # Disable Slurp mode to find beginning of lines |
713 | #$/ = "\n"; # Disable Slurp mode to find beginning of lines |
714 | #$pd =~ s/^%.*//gm; # % means TeX comment |
714 | #$pd =~ s/^%.*//gm; # % means TeX comment |
715 | #undef $/; # Enable Slurp mode again |
715 | #undef $/; # Enable Slurp mode again |
716 | 716 | ||
717 | # 1 1 2 path 23 ext 3 4 4 5 5 |
717 | # 1 1 2 path 23 ext 3 4 4 5 5 |
718 | $pd =~ s{^(.*?)<<includerange: ([^\n>:]+?)(\.\w+)?:\s+(\d+)-(\d+)>>} |
718 | $pd =~ s{^(.*?)<<includerange: ([^\n>:]+?)(\.\w+)?:\s+(\d+)-(\d+)>>} |
719 | {incl_range($1,$2,$3,$4,$5)}gem; |
719 | {incl_range($1,$2,$3,$4,$5)}gem; |
720 | $pd =~ s/^(.*?)<<([^\n>]+?)(\.\w+)?>>/include($1,$2,$3)/gem; |
720 | $pd =~ s/^(.*?)<<([^\n>]+?)(\.\w+)?>>/include($1,$2,$3)/gem; |
721 | $pd =~ s/<<ignore:\s+.*?>>[ \t]*//sg; # Ignore blocks are omitted (eat trailing spaces, too) |
721 | $pd =~ s/<<ignore:\s+.*?>>[ \t]*//sg; # Ignore blocks are omitted (eat trailing spaces, too) |
722 | 722 | ||
723 | # Conditional processing (n.b. only macros from -D flags or <<define1st: >> can be tested) |
723 | # Conditional processing (n.b. only macros from -D flags or <<define1st: >> can be tested) |
724 | # 1 1 2 2 3 3 |
724 | # 1 1 2 2 3 3 |
725 | $pd =~ s/<<if:\s+(\w+)>>(.*?)<<else:\s+>>(.*?)<<fi:\s+>>/$mac{$1}?$2:$3/gsex; |
725 | $pd =~ s/<<if:\s+(\w+)>>(.*?)<<else:\s+>>(.*?)<<fi:\s+>>/$mac{$1}?$2:$3/gsex; |
726 | 726 | ||
727 | extract_macros(); |
727 | extract_macros(); |
728 | } |
728 | } |
729 | warn "input after includes and conditionals: ".length($pd)." chars\n"; |
729 | warn "input after includes and conditionals: ".length($pd)." chars\n"; |
730 | 730 | ||
731 | ### Figure out document class |
731 | ### Figure out document class |
732 | 732 | ||
733 | $pagestyle = "\\usepackage{fancyhdr}\n\\pagestyle{fancy}\n"; |
733 | $pagestyle = "\\usepackage{fancyhdr}\n\\pagestyle{fancy}\n"; |
734 | 734 | ||
735 | ($class, $optarg, $lang, $header_title, $after_page, $moreopt) = |
735 | ($class, $optarg, $lang, $header_title, $after_page, $moreopt) = |
736 | $pd =~ m/<<class:\s+(\w+)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*))?)?)?)?)?>>/s; |
736 | $pd =~ m/<<class:\s+(\w+)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*))?)?)?)?)?>>/s; |
737 | if ($class) { |
737 | if ($class) { |
738 | #warn "class($class) optarg($optarg) lang($lang) hdrtit($header_title) after_page($after_page) [$&]"; |
738 | #warn "class($class) optarg($optarg) lang($lang) hdrtit($header_title) after_page($after_page) [$&]"; |
739 | $pd =~ s/<<class:\s+.*?>>//s; |
739 | $pd =~ s/<<class:\s+.*?>>//s; |
740 | if ($class eq 'book') { |
740 | if ($class eq 'book') { |
741 | warn "BOOK"; |
741 | warn "BOOK"; |
742 | @tex_sec = @tex_sec_book; |
742 | @tex_sec = @tex_sec_book; |
743 | } elsif ($class eq 'empty') { |
743 | } elsif ($class eq 'empty') { |
744 | warn "EMPTY"; |
744 | warn "EMPTY"; |
745 | $class = 'article'; |
745 | $class = 'article'; |
746 | $moretexpreamble = $moretexpreamble_empty; |
746 | $moretexpreamble = $moretexpreamble_empty; |
747 | } elsif ($class eq 'clean') { |
747 | } elsif ($class eq 'clean') { |
748 | warn "CLEAN"; |
748 | warn "CLEAN"; |
749 | $class = 'article'; |
749 | $class = 'article'; |
750 | $moretexpreamble = $moretexpreamble_clean; |
750 | $moretexpreamble = $moretexpreamble_clean; |
751 | } elsif ($class eq 'confidential') { |
751 | } elsif ($class eq 'confidential') { |
752 | warn "CONFIDENTIAL"; |
752 | warn "CONFIDENTIAL"; |
753 | $class = 'article'; |
753 | $class = 'article'; |
754 | $moretexpreamble = $moretexpreamble_confidential; |
754 | $moretexpreamble = $moretexpreamble_confidential; |
755 | } elsif ($class eq 'slide') { |
755 | } elsif ($class eq 'slide') { |
756 | warn "SLIDE"; |
756 | warn "SLIDE"; |
757 | @tex_sec = @tex_sec_slide; |
757 | @tex_sec = @tex_sec_slide; |
758 | $class = 'article'; |
758 | $class = 'article'; |
759 | $optarg ||= '12pt'; |
759 | $optarg ||= '12pt'; |
760 | $paper = 'custom'; |
760 | $paper = 'custom'; |
761 | $wid = '400pt'; |
761 | $wid = '400pt'; |
762 | $ht = '300pt'; |
762 | $ht = '300pt'; |
763 | $new_slide = "\n\\newpage\n\n"; # force page break before each section |
763 | $new_slide = "\n\\newpage\n\n"; # force page break before each section |
764 | $lm = '5mm'; |
764 | $lm = '5mm'; |
765 | $tm = '3mm'; |
765 | $tm = '3mm'; |
766 | $rm = '5mm'; |
766 | $rm = '5mm'; |
767 | $bm = '7mm'; # tall enough for 8mm logo art in footer |
767 | $bm = '7mm'; # tall enough for 8mm logo art in footer |
768 | $hh = '12pt'; |
768 | $hh = '12pt'; |
769 | $hs = '5pt'; |
769 | $hs = '5pt'; |
770 | $fh = '12pt'; |
770 | $fh = '12pt'; |
771 | $fs = '14pt'; |
771 | $fs = '14pt'; |
772 | } |
772 | } |
773 | $tex_doc_class = "\\documentclass[$optarg]{$class}\n"; |
773 | $tex_doc_class = "\\documentclass[$optarg]{$class}\n"; |
774 | $tex_doc_class .= "\\usepackage[$lang]{babel}\n\\selectlanguage{$lang}\n" if $lang; |
774 | $tex_doc_class .= "\\usepackage[$lang]{babel}\n\\selectlanguage{$lang}\n" if $lang; |
775 | } |
775 | } |
776 | 776 | ||
777 | if ($moreopt eq 'lineno') { |
777 | if ($moreopt eq 'lineno') { |
778 | $lineno = "\\usepackage{lineno}\n\\linenumbers"; |
778 | $lineno = "\\usepackage{lineno}\n\\linenumbers"; |
779 | } |
779 | } |
780 | 780 | ||
781 | ### Custom paper size and margins (See LaTeX companion pp.89-90 (vmargin replaces vpage)) |
781 | ### Custom paper size and margins (See LaTeX companion pp.89-90 (vmargin replaces vpage)) |
782 | # <<papersize: empty!a4!landsacpe>> |
782 | # <<papersize: empty!a4!landsacpe>> |
783 | # <<papersize: fancy!a4>> |
783 | # <<papersize: fancy!a4>> |
784 | # <<papersize: fancy!custom!dummy!WIDTHpt!HEIGHTpt!LM!TM!RM!BM!HEAD-HEIGHT!HEAD-SKIP!FOOT-HEIGHT!FOOT-SKIP>> |
784 | # <<papersize: fancy!custom!dummy!WIDTHpt!HEIGHTpt!LM!TM!RM!BM!HEAD-HEIGHT!HEAD-SKIP!FOOT-HEIGHT!FOOT-SKIP>> |
785 | # <<papersize: fancy!custom!dummy!210mm!297mm!25mm!10mm!25mm!10mm!7mm!5mm!7mm!5mm>> |
785 | # <<papersize: fancy!custom!dummy!210mm!297mm!25mm!10mm!25mm!10mm!7mm!5mm!7mm!5mm>> |
786 | 786 | ||
787 | ($headfootstyle, $paper2, $orient, $wid2, $ht2, $lm2, $tm2, $rm2, $bm2, $hh2, $hs2, $fh2, $fs2) = |
787 | ($headfootstyle, $paper2, $orient, $wid2, $ht2, $lm2, $tm2, $rm2, $bm2, $hh2, $hs2, $fh2, $fs2) = |
788 | $pd =~ m/<<papersize:\s+(\w+)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*))?)?)?)?)?)?)?)?)?)?)?)?>>/s; |
788 | $pd =~ m/<<papersize:\s+(\w+)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*)(?:!([^!>]*))?)?)?)?)?)?)?)?)?)?)?)?>>/s; |
789 | $pd =~ s/<<papersize:\s+.*?>>//s; |
789 | $pd =~ s/<<papersize:\s+.*?>>//s; |
790 | 790 | ||
791 | $paper = $paper2 if $paper2; |
791 | $paper = $paper2 if $paper2; |
792 | $wid = $wid2 if $wid2; |
792 | $wid = $wid2 if $wid2; |
793 | $ht = $ht2 if $ht2; |
793 | $ht = $ht2 if $ht2; |
794 | 794 | ||
795 | $lm = $lm2 if $lm2; # left margin |
795 | $lm = $lm2 if $lm2; # left margin |
796 | $tm = $tm2 if $tm2; # top margin |
796 | $tm = $tm2 if $tm2; # top margin |
797 | $rm = $rm2 if $rm2; # right margin |
797 | $rm = $rm2 if $rm2; # right margin |
798 | $bm = $bm2 if $bm2; # bottom margin |
798 | $bm = $bm2 if $bm2; # bottom margin |
799 | $hh = $hh2 if $hh2; # head height |
799 | $hh = $hh2 if $hh2; # head height |
800 | $hs = $hs2 if $hs2; # head sep |
800 | $hs = $hs2 if $hs2; # head sep |
801 | $fh = $fh2 if $fh2; # foot height |
801 | $fh = $fh2 if $fh2; # foot height |
802 | $fs = $fs2 if $fs2; # foot skip |
802 | $fs = $fs2 if $fs2; # foot skip |
803 | 803 | ||
804 | if ($paper || $orient) { |
804 | if ($paper || $orient) { |
805 | $vmargin ||= "\\usepackage{vmargin}\n"; |
805 | $vmargin ||= "\\usepackage{vmargin}\n"; |
806 | $paper ||= "Afour"; |
806 | $paper ||= "Afour"; |
807 | if ($paper eq 'custom') { |
807 | if ($paper eq 'custom') { |
808 | $vmargin .= "\\setpapersize{custom}{$wid}{$ht}\n"; |
808 | $vmargin .= "\\setpapersize{custom}{$wid}{$ht}\n"; |
809 | } else { |
809 | } else { |
810 | $orient = "[$orient]" if $orient; |
810 | $orient = "[$orient]" if $orient; |
811 | $vmargin .= "\\setpapersize${orient}{$paper}\n"; |
811 | $vmargin .= "\\setpapersize${orient}{$paper}\n"; |
812 | } |
812 | } |
813 | } |
813 | } |
814 | 814 | ||
815 | if ($lm || $tm || $rm || $bm) { |
815 | if ($lm || $tm || $rm || $bm) { |
816 | $lm ||= '0mm'; # left margin |
816 | $lm ||= '0mm'; # left margin |
817 | $tm ||= '0mm'; # top margin |
817 | $tm ||= '0mm'; # top margin |
818 | $rm ||= '0mm'; # right margin |
818 | $rm ||= '0mm'; # right margin |
819 | $bm ||= '0mm'; # bottom margin |
819 | $bm ||= '0mm'; # bottom margin |
820 | $hh ||= '0mm'; # head height |
820 | $hh ||= '0mm'; # head height |
821 | $hs ||= '0mm'; # head sep |
821 | $hs ||= '0mm'; # head sep |
822 | $fh ||= '0mm'; # foot height |
822 | $fh ||= '0mm'; # foot height |
823 | $fs ||= '0mm'; # foot skip |
823 | $fs ||= '0mm'; # foot skip |
824 | $vmargin ||= "\\usepackage{vmargin}\n"; |
824 | $vmargin ||= "\\usepackage{vmargin}\n"; |
825 | $vmargin .= "\\setmarginsrb{$lm}{$tm}{$rm}{$bm}{$hh}{$hs}{$fh}{$fs}\n"; |
825 | $vmargin .= "\\setmarginsrb{$lm}{$tm}{$rm}{$bm}{$hh}{$hs}{$fh}{$fs}\n"; |
826 | } |
826 | } |
827 | 827 | ||
828 | warn "vmargin($vmargin)"; |
828 | warn "vmargin($vmargin)"; |
829 | 829 | ||
830 | if ($headfootstyle && $headfootstyle ne 'fancy') { |
830 | if ($headfootstyle && $headfootstyle ne 'fancy') { |
831 | $pagestyle = "\\pagestyle{$headfootstyle}\n"; # e.g. empty or plain |
831 | $pagestyle = "\\pagestyle{$headfootstyle}\n"; # e.g. empty or plain |
832 | } |
832 | } |
833 | 833 | ||
834 | ### Tweak paragraph and line spacing: <<linespace: LINESPACING!PARINDENT!PARSKIP>> |
834 | ### Tweak paragraph and line spacing: <<linespace: LINESPACING!PARINDENT!PARSKIP>> |
835 | 835 | ||
836 | ($linespacing, $parindent, $parskip) = |
836 | ($linespacing, $parindent, $parskip) = |
837 | $pd =~ m/<<linespace:\s+([^!>]*)(?:!([^!>]*)(?:!([^!>]*))?)?>>/s; |
837 | $pd =~ m/<<linespace:\s+([^!>]*)(?:!([^!>]*)(?:!([^!>]*))?)?>>/s; |
838 | $pd =~ s/<<linespace:\s+.*?>>//s; |
838 | $pd =~ s/<<linespace:\s+.*?>>//s; |
839 | 839 | ||
840 | $linespace .= "\\renewcommand{\\baselinestretch}{$linespacing}\n" if $linespacing; |
840 | $linespace .= "\\renewcommand{\\baselinestretch}{$linespacing}\n" if $linespacing; |
841 | $linespace .= "\\setlength\\parindent{$parindent}\n" if $parindent; |
841 | $linespace .= "\\setlength\\parindent{$parindent}\n" if $parindent; |
842 | $linespace .= "\\setlength\\parskip{$parskip}\n" if $parskip; |
842 | $linespace .= "\\setlength\\parskip{$parskip}\n" if $parskip; |
843 | 843 | ||
844 | #die "pd($pd)"; |
844 | #die "pd($pd)"; |
845 | 845 | ||
846 | $pd =~ s/<<cvsid:\s+(.*?)>>/$cvsid.="$1\n",''/ge; |
846 | $pd =~ s/<<cvsid:\s+(.*?)>>/$cvsid.="$1\n",''/ge; |
847 | ($cvsfile, $cvsrevision, $cvsdate, $cvstime, $cvsuser) = |
847 | ($cvsfile, $cvsrevision, $cvsdate, $cvstime, $cvsuser) = |
848 | $cvsid =~ /^\$Id:\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+/; |
848 | $cvsid =~ /^\$Id:\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+/; |
849 | def_macro('CVSID', $cvsid); |
849 | def_macro('CVSID', $cvsid); |
850 | def_macro('CVSFILE', $cvsfile); |
850 | def_macro('CVSFILE', $cvsfile); |
851 | def_macro('CVSREVISION', $cvsrevision); |
851 | def_macro('CVSREVISION', $cvsrevision); |
852 | def_macro('CVSDATE', $cvsdate); |
852 | def_macro('CVSDATE', $cvsdate); |
853 | def_macro('CVSTIME', $cvstime); |
853 | def_macro('CVSTIME', $cvstime); |
854 | def_macro('CVSUSER', $cvsuser); |
854 | def_macro('CVSUSER', $cvsuser); |
855 | 855 | ||
856 | ($author) = $pd =~ m/<<author:\s+(.*?)>>/; |
856 | ($author) = $pd =~ m/<<author:\s+(.*?)>>/; |
857 | $pd =~ s/<<author:\s+.*?>>//; |
857 | $pd =~ s/<<author:\s+.*?>>//; |
858 | $author ||= 'N.N.'; |
858 | $author ||= 'N.N.'; |
859 | #warn "author($author)"; |
859 | #warn "author($author)"; |
860 | def_macro('AUTHOR', $author); |
860 | def_macro('AUTHOR', $author); |
861 | 861 | ||
862 | ($copyright) = $pd =~ m/<<copyright:\s+(.*?)>>/; |
862 | ($copyright) = $pd =~ m/<<copyright:\s+(.*?)>>/; |
863 | $pd =~ s/<<copyright:\s+.*?>>//; |
863 | $pd =~ s/<<copyright:\s+.*?>>//; |
864 | $copyright ||= $author; |
864 | $copyright ||= $author; |
865 | def_macro('COPYRIGHT', $copyright); |
865 | def_macro('COPYRIGHT', $copyright); |
866 | 866 | ||
867 | ($top_id , $version) = $pd =~ m/<<version:(?:([\w-]+):)?\s+(.*?)>>/; |
867 | ($top_id , $version) = $pd =~ m/<<version:(?:([\w-]+):)?\s+(.*?)>>/; |
868 | $pd =~ s/<<version:.*?>>//; |
868 | $pd =~ s/<<version:.*?>>//; |
869 | def_macro('VERSION', $version); |
869 | def_macro('VERSION', $version); |
870 | 870 | ||
871 | ### Substitute macros |
871 | ### Substitute macros |
872 | 872 | ||
873 | $pd =~ s/!!(\w+)(?:\?([^!]*)\?)?/$mac{$1}||$2/ge; |
873 | $pd =~ s/!!(\w+)(?:\?([^!]*)\?)?/$mac{$1}||$2/ge; |
874 | 874 | ||
875 | ### Extract some special <<components>> |
875 | ### Extract some special <<components>> |
876 | 876 | ||
877 | ($x) = $pd =~ s%<<notapath:\s+(.*?)>>%for $x (split /[,\s]+/,$1) { $not_a_path{$x}=1; }%gse; |
877 | ($x) = $pd =~ s%<<notapath:\s+(.*?)>>%for $x (split /[,\s]+/,$1) { $not_a_path{$x}=1; }%gse; |
878 | ($x) = $pd =~ s%<<notaurl:\s+(.*?)>>%for $x (split /[,\s]+/,$1) { $not_a_url{$x}=1; }%gse; |
878 | ($x) = $pd =~ s%<<notaurl:\s+(.*?)>>%for $x (split /[,\s]+/,$1) { $not_a_url{$x}=1; }%gse; |
879 | ($x) = $pd =~ s%<<notacountry:\s+(.*?)>>%for $x (split /[,\s]+/,$1) { $not_a_country{$x}=1; }%gse; |
879 | ($x) = $pd =~ s%<<notacountry:\s+(.*?)>>%for $x (split /[,\s]+/,$1) { $not_a_country{$x}=1; }%gse; |
880 | 880 | ||
881 | ($abstract) = $pd =~ m/<<abstract:\s+(.*?)>>/s; |
881 | ($abstract) = $pd =~ m/<<abstract:\s+(.*?)>>/s; |
882 | #warn "abstract $abstract" if $trace;; |
882 | #warn "abstract $abstract" if $trace;; |
883 | #$tex_abstract = "\\begin{quote} Abstract: ".tex_para($abstract)."\\end{quote}\n\n" if $abstract; |
883 | #$tex_abstract = "\\begin{quote} Abstract: ".tex_para($abstract)."\\end{quote}\n\n" if $abstract; |
884 | $tex_abstract = "\\begin{abstract}\n".tex_para($abstract)."\\end{abstract}\n\n" if $abstract; |
884 | $tex_abstract = "\\begin{abstract}\n".tex_para($abstract)."\\end{abstract}\n\n" if $abstract; |
885 | $rtf_abstract = rtf_format($abstract) if $abstract; |
885 | $rtf_abstract = rtf_format($abstract) if $abstract; |
886 | $rtf_abstract =~ s/\n/\n /sg; |
886 | $rtf_abstract =~ s/\n/\n /sg; |
887 | $nonl_abstract = $abstract; |
887 | $nonl_abstract = $abstract; |
888 | $pdseal_abstract = $abstract; |
888 | $pdseal_abstract = $abstract; |
889 | $abstract =~ s%\r?\n\r?\n%^^^^/para~~~~\n^^^^para~~~~%sg; |
889 | $abstract =~ s%\r?\n\r?\n%^^^^/para~~~~\n^^^^para~~~~%sg; |
890 | $dbx_abstract = dbx_para($abstract); |
890 | $dbx_abstract = dbx_para($abstract); |
891 | $abstract =~ s%^^^^/para~~~~\n^^^^para~~~~%\n^^^^p~~~~%sg; |
891 | $abstract =~ s%^^^^/para~~~~\n^^^^para~~~~%\n^^^^p~~~~%sg; |
892 | $html_abstract = html_para($abstract); |
892 | $html_abstract = html_para($abstract); |
893 | 893 | ||
894 | $pd =~ s/<<abstract:\s+.*?>>/<<tex:\n$tex_abstract>>/s; |
894 | $pd =~ s/<<abstract:\s+.*?>>/<<tex:\n$tex_abstract>>/s; |
895 | 895 | ||
896 | ($first_page) = $pd =~ m/<<1stpage:\s+(.*?)>>/s; |
896 | ($first_page) = $pd =~ m/<<1stpage:\s+(.*?)>>/s; |
897 | $pd =~ s/<<1stpage:\s+.*?>>//s; |
897 | $pd =~ s/<<1stpage:\s+.*?>>//s; |
898 | 898 | ||
899 | ($keywords) = $pd =~ m/<<keywords:\s+(.*?)>>/s; |
899 | ($keywords) = $pd =~ m/<<keywords:\s+(.*?)>>/s; |
900 | $pd =~ s/<<keywords:\s+.*?>>//s; |
900 | $pd =~ s/<<keywords:\s+.*?>>//s; |
901 | $keywords =~ s{,\s*}{</keyword>\n<keyword>}gs; |
901 | $keywords =~ s{,\s*}{</keyword>\n<keyword>}gs; |
902 | 902 | ||
903 | ($x) = $pd =~ m/<<texpreamble:\s+(.*?)>>/s; |
903 | ($x) = $pd =~ m/<<texpreamble:\s+(.*?)>>/s; |
904 | $pd =~ s/<<texpreamble:\s+.*?>>//s; |
904 | $pd =~ s/<<texpreamble:\s+.*?>>//s; |
905 | $texpreamble = $x if $x; |
905 | $texpreamble = $x if $x; |
906 | $texpreamble =~ s/!\?!AUTHOR/$author/; |
906 | $texpreamble =~ s/!\?!AUTHOR/$author/; |
907 | $texpreamble =~ s/!\?!HEADER_TITLE/$header_title/; |
907 | $texpreamble =~ s/!\?!HEADER_TITLE/$header_title/; |
908 | $texpreamble =~ s/!\?!AFTER_PAGE/$after_page/; |
908 | $texpreamble =~ s/!\?!AFTER_PAGE/$after_page/; |
909 | $texpreamble =~ s/!\?!COPYRIGHT/$copyright/; |
909 | $texpreamble =~ s/!\?!COPYRIGHT/$copyright/; |
910 | $texpreamble =~ s/!\?!VERSION/$version/; |
910 | $texpreamble =~ s/!\?!VERSION/$version/; |
911 | $texpreamble =~ s/!\?!TITLE/$doctitle/; # *** $doctitle not defined yet |
911 | $texpreamble =~ s/!\?!TITLE/$doctitle/; # *** $doctitle not defined yet |
912 | 912 | ||
913 | if ($pd =~ m/<<moretexpreamble:\s+.*?>>/s) { |
913 | if ($pd =~ m/<<moretexpreamble:\s+.*?>>/s) { |
914 | $moretexpreamble = ''; |
914 | $moretexpreamble = ''; |
915 | $pd =~ s/<<moretexpreamble:\s+(.*?)>>/$moretexpreamble.=$1,''/gse; |
915 | $pd =~ s/<<moretexpreamble:\s+(.*?)>>/$moretexpreamble.=$1,''/gse; |
916 | } |
916 | } |
917 | $moretexpreamble =~ s/!\?!AUTHOR/$author/; |
917 | $moretexpreamble =~ s/!\?!AUTHOR/$author/; |
918 | $moretexpreamble =~ s/!\?!HEADER_TITLE/$header_title/; |
918 | $moretexpreamble =~ s/!\?!HEADER_TITLE/$header_title/; |
919 | $moretexpreamble =~ s/!\?!AFTER_PAGE/$after_page/; |
919 | $moretexpreamble =~ s/!\?!AFTER_PAGE/$after_page/; |
920 | $moretexpreamble =~ s/!\?!COPYRIGHT/$copyright/; |
920 | $moretexpreamble =~ s/!\?!COPYRIGHT/$copyright/; |
921 | $moretexpreamble =~ s/!\?!VERSION/$version/; |
921 | $moretexpreamble =~ s/!\?!VERSION/$version/; |
922 | $moretexpreamble =~ s/!\?!TITLE/$doctitle/; # *** $doctitle not defined yet |
922 | $moretexpreamble =~ s/!\?!TITLE/$doctitle/; # *** $doctitle not defined yet |
923 | 923 | ||
924 | if ($pd =~ m/<<moremoretexpreamble:\s+.*?>>/s) { |
924 | if ($pd =~ m/<<moremoretexpreamble:\s+.*?>>/s) { |
925 | $pd =~ s/<<moremoretexpreamble:\s+(.*?)>>/$moremoretexpreamble.=$1,''/gse; |
925 | $pd =~ s/<<moremoretexpreamble:\s+(.*?)>>/$moremoretexpreamble.=$1,''/gse; |
926 | } |
926 | } |
927 | 927 | ||
928 | ($x) = $pd =~ m/<<dbxpreamble:\s+(.*?)>>/s; |
928 | ($x) = $pd =~ m/<<dbxpreamble:\s+(.*?)>>/s; |
929 | $pd =~ s/<<dbxpreamble:\s+.*?>>//s; |
929 | $pd =~ s/<<dbxpreamble:\s+.*?>>//s; |
930 | $dbxpreamble = $x if $x; |
930 | $dbxpreamble = $x if $x; |
931 | 931 | ||
932 | ($x) = $pd =~ m/<<htmlpreamble:\s+(.*?)>>/s; |
932 | ($x) = $pd =~ m/<<htmlpreamble:\s+(.*?)>>/s; |
933 | $pd =~ s/<<htmlpreamble:\s+.*?>>//s; |
933 | $pd =~ s/<<htmlpreamble:\s+.*?>>//s; |
934 | $htmlpreamble = $x if $x; |
934 | $htmlpreamble = $x if $x; |
935 | $htmlpreamble =~ s/!\?!AUTHOR/$author/; |
935 | $htmlpreamble =~ s/!\?!AUTHOR/$author/; |
936 | $htmlpreamble =~ s/!\?!HEADER_TITLE/$header_title/; |
936 | $htmlpreamble =~ s/!\?!HEADER_TITLE/$header_title/; |
937 | $htmlpreamble =~ s/!\?!AFTER_PAGE/$after_page/; |
937 | $htmlpreamble =~ s/!\?!AFTER_PAGE/$after_page/; |
938 | $htmlpreamble =~ s/!\?!COPYRIGHT/$copyright/; |
938 | $htmlpreamble =~ s/!\?!COPYRIGHT/$copyright/; |
939 | $htmlpreamble =~ s/!\?!VERSION/$version/; |
939 | $htmlpreamble =~ s/!\?!VERSION/$version/; |
940 | $htmlpreamble =~ s/!\?!TITLE/$doctitle/; # *** $doctitle not defined yet |
940 | $htmlpreamble =~ s/!\?!TITLE/$doctitle/; # *** $doctitle not defined yet |
941 | 941 | ||
942 | ($x) = $pd =~ m/<<htmlpostamble:\s+(.*?)>>/s; |
942 | ($x) = $pd =~ m/<<htmlpostamble:\s+(.*?)>>/s; |
943 | $pd =~ s/<<htmlpostamble:\s+.*?>>//s; |
943 | $pd =~ s/<<htmlpostamble:\s+.*?>>//s; |
944 | $htmlpostamble = $x if $x; |
944 | $htmlpostamble = $x if $x; |
945 | $htmlpostamble =~ s/!\?!AUTHOR/$author/; |
945 | $htmlpostamble =~ s/!\?!AUTHOR/$author/; |
946 | $htmlpostamble =~ s/!\?!HEADER_TITLE/$header_title/; |
946 | $htmlpostamble =~ s/!\?!HEADER_TITLE/$header_title/; |
947 | $htmlpostamble =~ s/!\?!AFTER_PAGE/$after_page/; |
947 | $htmlpostamble =~ s/!\?!AFTER_PAGE/$after_page/; |
948 | $htmlpostamble =~ s/!\?!COPYRIGHT/$copyright/; |
948 | $htmlpostamble =~ s/!\?!COPYRIGHT/$copyright/; |
949 | $htmlpostamble =~ s/!\?!VERSION/$version/; |
949 | $htmlpostamble =~ s/!\?!VERSION/$version/; |
950 | $htmlpostamble =~ s/!\?!TITLE/$doctitle/; # *** $doctitle not defined yet |
950 | $htmlpostamble =~ s/!\?!TITLE/$doctitle/; # *** $doctitle not defined yet |
951 | 951 | ||
952 | ($x) = $pd =~ m/<<htmlpreamble2:\s+(.*?)>>/s; |
952 | ($x) = $pd =~ m/<<htmlpreamble2:\s+(.*?)>>/s; |
953 | $pd =~ s/<<htmlpreamble2:\s+.*?>>//s; |
953 | $pd =~ s/<<htmlpreamble2:\s+.*?>>//s; |
954 | $htmlpreamble2 = $x if $x; |
954 | $htmlpreamble2 = $x if $x; |
955 | $htmlpreamble2 =~ s/!\?!AUTHOR/$author/; |
955 | $htmlpreamble2 =~ s/!\?!AUTHOR/$author/; |
956 | $htmlpreamble2 =~ s/!\?!HEADER_TITLE/$header_title/; |
956 | $htmlpreamble2 =~ s/!\?!HEADER_TITLE/$header_title/; |
957 | $htmlpreamble2 =~ s/!\?!AFTER_PAGE/$after_page/; |
957 | $htmlpreamble2 =~ s/!\?!AFTER_PAGE/$after_page/; |
958 | $htmlpreamble2 =~ s/!\?!COPYRIGHT/$copyright/; |
958 | $htmlpreamble2 =~ s/!\?!COPYRIGHT/$copyright/; |
959 | $htmlpreamble2 =~ s/!\?!VERSION/$version/; |
959 | $htmlpreamble2 =~ s/!\?!VERSION/$version/; |
960 | $htmlpreamble2 =~ s/!\?!TITLE/$doctitle/; # *** $doctitle not defined yet |
960 | $htmlpreamble2 =~ s/!\?!TITLE/$doctitle/; # *** $doctitle not defined yet |
961 | 961 | ||
962 | ($x) = $pd =~ m/<<htmlpostamble2:\s+(.*?)>>/s; |
962 | ($x) = $pd =~ m/<<htmlpostamble2:\s+(.*?)>>/s; |
963 | $pd =~ s/<<htmlpostamble2:\s+.*?>>//s; |
963 | $pd =~ s/<<htmlpostamble2:\s+.*?>>//s; |
964 | $htmlpostamble2 = $x if $x; |
964 | $htmlpostamble2 = $x if $x; |
965 | $htmlpostamble2 =~ s/!\?!AUTHOR/$author/; |
965 | $htmlpostamble2 =~ s/!\?!AUTHOR/$author/; |
966 | $htmlpostamble2 =~ s/!\?!HEADER_TITLE/$header_title/; |
966 | $htmlpostamble2 =~ s/!\?!HEADER_TITLE/$header_title/; |
967 | $htmlpostamble2 =~ s/!\?!AFTER_PAGE/$after_page/; |
967 | $htmlpostamble2 =~ s/!\?!AFTER_PAGE/$after_page/; |
968 | $htmlpostamble2 =~ s/!\?!COPYRIGHT/$copyright/; |
968 | $htmlpostamble2 =~ s/!\?!COPYRIGHT/$copyright/; |
969 | $htmlpostamble2 =~ s/!\?!VERSION/$version/; |
969 | $htmlpostamble2 =~ s/!\?!VERSION/$version/; |
970 | $htmlpostamble2 =~ s/!\?!TITLE/$doctitle/; # *** $doctitle not defined yet |
970 | $htmlpostamble2 =~ s/!\?!TITLE/$doctitle/; # *** $doctitle not defined yet |
971 | 971 | ||
972 | ($additionalarticleinfodbx) = $pd =~ m/<<additionalarticleinfodbx:\s+(.*?)>>/s; |
972 | ($additionalarticleinfodbx) = $pd =~ m/<<additionalarticleinfodbx:\s+(.*?)>>/s; |
973 | $pd =~ s/<<additionalarticleinfodbx:\s+.*?>>//s; |
973 | $pd =~ s/<<additionalarticleinfodbx:\s+.*?>>//s; |
974 | 974 | ||
975 | ($odt_name, $x) = $pd =~ m/<<odtpreamble:\s+(\w+)\n(.*?)>>/s; |
975 | ($odt_name, $x) = $pd =~ m/<<odtpreamble:\s+(\w+)\n(.*?)>>/s; |
976 | if ($x) { |
976 | if ($x) { |
977 | $pd =~ s/<<odtpreamble:\s+.*?>>//s; |
977 | $pd =~ s/<<odtpreamble:\s+.*?>>//s; |
978 | open ODT, ">$odt_name/content.xml" or die "Can not write ODT file '$odt_name/content.xml': $!"; |
978 | open ODT, ">$odt_name/content.xml" or die "Can not write ODT file '$odt_name/content.xml': $!"; |
979 | warn "Writing $odt_name/content.xml"; |
979 | warn "Writing $odt_name/content.xml"; |
980 | print ODT $x; |
980 | print ODT $x; |
981 | } else { |
981 | } else { |
982 | open ODT,">/dev/null"; |
982 | open ODT,">/dev/null"; |
983 | } |
983 | } |
984 | 984 | ||
985 | ($history_ena, $history_title, $x) = $pd =~ m/<<history:(\d:)?\s*(\S[^\n]*)?(.*?)>>/s; |
985 | ($history_ena, $history_title, $x) = $pd =~ m/<<history:(\d:)?\s*(\S[^\n]*)?(.*?)>>/s; |
986 | $history = $x if $x; # 2 dd mm yy 3 auth 12.10.2005 |
986 | $history = $x if $x; # 2 dd mm yy 3 auth 12.10.2005 |
987 | @history = split qr{^([\d.-]+):: (\d+[./-]\d+[./-]\d+),\s+(.*?)\s*$}m, $history; |
987 | @history = split qr{^([\d.-]+):: (\d+[./-]\d+[./-]\d+),\s+(.*?)\s*$}m, $history; |
988 | shift @history; |
988 | shift @history; |
989 | if (!@history) { |
989 | if (!@history) { |
990 | # 2 dd mm yy 12. October, 2005 |
990 | # 2 dd mm yy 12. October, 2005 |
991 | @history = split /^([\d.-]+):: (\d+\.\s+\w+,?\s+\d+),\s+(.*?)\s*$/m, $history; |
991 | @history = split /^([\d.-]+):: (\d+\.\s+\w+,?\s+\d+),\s+(.*?)\s*$/m, $history; |
992 | shift @history; |
992 | shift @history; |
993 | } |
993 | } |
994 | 994 | ||
995 | if ($history) { |
995 | if ($history) { |
996 | if ($history_title =~ /^\d/) { |
996 | if ($history_title =~ /^\d/) { |
997 | # *** Process "2.4.2005, description, --Author" style history |
997 | # *** Process "2.4.2005, description, --Author" style history |
998 | } |
998 | } |
999 | $tex_history = $history_title ? "\\subsubsection*{$history_title}" : ''; |
999 | $tex_history = $history_title ? "\\subsubsection*{$history_title}" : ''; |
1000 | $tex_history .= qq({\\small\n\\begin{description}); |
1000 | $tex_history .= qq({\\small\n\\begin{description}); |
1001 | for ($j=0; $j<$#history; $j+=4) { |
1001 | for ($j=0; $j<$#history; $j+=4) { |
1002 | $tex_revdesc = $history[$j+3]; |
1002 | $tex_revdesc = $history[$j+3]; |
1003 | $tex_revdesc =~ s%^\s+\*%\\item%gm; |
1003 | $tex_revdesc =~ s%^\s+\*%\\item%gm; |
1004 | 1004 | ||
1005 | $tex_history .= qq(\\item[$history[$j]] $history[$j+1] $history[$j+2]\n); |
1005 | $tex_history .= qq(\\item[$history[$j]] $history[$j+1] $history[$j+2]\n); |
1006 | $tex_history .= qq(\\begin{itemize}\n$tex_revdesc\n\\end{itemize}\n) |
1006 | $tex_history .= qq(\\begin{itemize}\n$tex_revdesc\n\\end{itemize}\n) |
1007 | unless $tex_revdesc =~ /^\s*$/s; |
1007 | unless $tex_revdesc =~ /^\s*$/s; |
1008 | } |
1008 | } |
1009 | $tex_history .= qq(\\end{description}}); |
1009 | $tex_history .= qq(\\end{description}}); |
1010 | } |
1010 | } |
1011 | 1011 | ||
1012 | if ($history_ena eq '1:') { |
1012 | if ($history_ena eq '1:') { |
1013 | $pd =~ s/<<history:(\d:)?\s+.*?>>/<<tex:\n$tex_history\n>>/sg; |
1013 | $pd =~ s/<<history:(\d:)?\s+.*?>>/<<tex:\n$tex_history\n>>/sg; |
1014 | } else { |
1014 | } else { |
1015 | $pd =~ s/<<history:(\d:)?\s+.*?>>//sg; |
1015 | $pd =~ s/<<history:(\d:)?\s+.*?>>//sg; |
1016 | } |
1016 | } |
1017 | 1017 | ||
1018 | ($credit_title, $x) = $pd =~ m/<<credit:([^\n]*)(.*?)>>/s; |
1018 | ($credit_title, $x) = $pd =~ m/<<credit:([^\n]*)(.*?)>>/s; |
1019 | $credit = $x if $x; |
1019 | $credit = $x if $x; |
1020 | 1020 | ||
1021 | if ($credit) { |
1021 | if ($credit) { |
1022 | @credits = split /\n/, $credit; |
1022 | @credits = split /\n/, $credit; |
1023 | $credit_title =~ s/^\s+//; |
1023 | $credit_title =~ s/^\s+//; |
1024 | $tex_credit = "\\textbf{$credit_title}\\\\"; |
1024 | $tex_credit = "\\textbf{$credit_title}\\\\"; |
1025 | for $x (@credits) { |
1025 | for $x (@credits) { |
1026 | $tex_credit .= tex_para($x); |
1026 | $tex_credit .= tex_para($x); |
1027 | } |
1027 | } |
1028 | } |
1028 | } |
1029 | $pd =~ s/<<credit:\s+.*?>>/<<tex:\n$tex_credit>>/sg; |
1029 | $pd =~ s/<<credit:\s+.*?>>/<<tex:\n$tex_credit>>/sg; |
1030 | 1030 | ||
1031 | ### Generate index entries |
1031 | ### Generate index entries |
1032 | 1032 | ||
1033 | @ix = (); # Words to index |
1033 | @ix = (); # Words to index |
1034 | 1034 | ||
1035 | sub add_to_index { |
1035 | sub add_to_index { |
1036 | my ($x) = @_; |
1036 | my ($x) = @_; |
1037 | my ($w,$ws,@ws,$ww); |
1037 | my ($w,$ws,@ws,$ww); |
1038 | for $ws (split /\n/, $x) { |
1038 | for $ws (split /\n/, $x) { |
1039 | next if $ws =~ /^\s*$/s; |
1039 | next if $ws =~ /^\s*$/s; |
1040 | $ws =~ s/^\s+//; |
1040 | $ws =~ s/^\s+//; |
1041 | $ws =~ s/\s+$//; |
1041 | $ws =~ s/\s+$//; |
1042 | @ws = split /\s*!\s*/, $ws; |
1042 | @ws = split /\s*!\s*/, $ws; |
1043 | for $w (@ws) { |
1043 | for $w (@ws) { |
1044 | ($ww,undef) = split /\@/, $w; |
1044 | ($ww,undef) = split /\@/, $w; |
1045 | next if $ww =~ /^\s*$/s; |
1045 | next if $ww =~ /^\s*$/s; |
1046 | $ix{$ww} = $ws[0]; |
1046 | $ix{$ww} = $ws[0]; |
1047 | } |
1047 | } |
1048 | } |
1048 | } |
1049 | } |
1049 | } |
1050 | 1050 | ||
1051 | $pd =~ s/<<wordix:(.*?)>>/add_to_index($1)/seg; |
1051 | $pd =~ s/<<wordix:(.*?)>>/add_to_index($1)/seg; |
1052 | $pd =~ s/<<conceptix:(.*?)>>/add_to_index($1)/seg; |
1052 | $pd =~ s/<<conceptix:(.*?)>>/add_to_index($1)/seg; |
1053 | $pd =~ s/<<peopleix:(.*?)>>/add_to_index($1)/seg; |
1053 | $pd =~ s/<<peopleix:(.*?)>>/add_to_index($1)/seg; |
1054 | @ix = keys %ix; |
1054 | @ix = keys %ix; |
1055 | 1055 | ||
1056 | ($makeindex) = $pd =~ m/<<makeindex:\s+(\d*)(.*?)>>/s; |
1056 | ($makeindex) = $pd =~ m/<<makeindex:\s+(\d*)(.*?)>>/s; |
1057 | $pd =~ s/<<makeindex:\s+.*?>>/$makeindex?'<<tex: \\printindex>>':''/se; |
1057 | $pd =~ s/<<makeindex:\s+.*?>>/$makeindex?'<<tex: \\printindex>>':''/se; |
1058 | ($maketoc) = $pd =~ m/<<maketoc:\s+(\d*)(.*?)>>/s; |
1058 | ($maketoc) = $pd =~ m/<<maketoc:\s+(\d*)(.*?)>>/s; |
1059 | $pd =~ s/<<maketoc:\s+.*?>>/$maketoc?'<<tex: \\tableofcontents>>':''/se; |
1059 | $pd =~ s/<<maketoc:\s+.*?>>/$maketoc?'<<tex: \\tableofcontents>>':''/se; |
1060 | ($makelof) = $pd =~ m/<<makelof:\s+(\d*)(.*?)>>/s; |
1060 | ($makelof) = $pd =~ m/<<makelof:\s+(\d*)(.*?)>>/s; |
1061 | $pd =~ s/<<makelof:\s+.*?>>/$makelof?'<<tex: \\listoffigures>>':''/se; |
1061 | $pd =~ s/<<makelof:\s+.*?>>/$makelof?'<<tex: \\listoffigures>>':''/se; |
1062 | ($makelot) = $pd =~ m/<<makelot:\s+(\d*)(.*?)>>/s; |
1062 | ($makelot) = $pd =~ m/<<makelot:\s+(\d*)(.*?)>>/s; |
1063 | $pd =~ s/<<makelot:\s+.*?>>/$makelot?'<<tex: \\listoftables>>':''/se; |
1063 | $pd =~ s/<<makelot:\s+.*?>>/$makelot?'<<tex: \\listoftables>>':''/se; |
1064 | #warn "makeindex($makeindex) maketoc($maketoc) makelof($makelof) makelot($makelot)"; |
1064 | #warn "makeindex($makeindex) maketoc($maketoc) makelof($makelof) makelot($makelot)"; |
1065 | 1065 | ||
1066 | ($mktit) = $pd =~ m/<<maketitle:\s+(\d*)(.*?)>>/s; |
1066 | ($mktit) = $pd =~ m/<<maketitle:\s+(\d*)(.*?)>>/s; |
1067 | if (defined($mktit)) { |
1067 | if (defined($mktit)) { |
1068 | $maketitle = $mktit ? "\\maketitle\n" : ''; |
1068 | $maketitle = $mktit ? "\\maketitle\n" : ''; |
1069 | } |
1069 | } |
1070 | $pd =~ s/<<maketitle:\s+.*?>>//s; |
1070 | $pd =~ s/<<maketitle:\s+.*?>>//s; |
1071 | 1071 | ||
1072 | $pd =~ s/^\#.*?-\*-pd-\*-.*?\n//s; |
1072 | $pd =~ s/^\#.*?-\*-pd-\*-.*?\n//s; |
1073 | ($doctitle,$ul) = $pd =~ m/^(\w..+?)\r?\n(\#\#\#+)\r?\n\r?\n/s; |
1073 | ($doctitle,$ul) = $pd =~ m/^(\w..+?)\r?\n(\#\#\#+)\r?\n\r?\n/s; |
1074 | #($doctitle,$version,$ul) = $pd =~ m/^(\w..+?)\nVersion: ([0-9]+\.[0-9]+-[0-9][0-9])\n(\#\#\#+)\n\n/s; |
1074 | #($doctitle,$version,$ul) = $pd =~ m/^(\w..+?)\nVersion: ([0-9]+\.[0-9]+-[0-9][0-9])\n(\#\#\#+)\n\n/s; |
1075 | 1075 | ||
1076 | $pd =~ s/^\w..+?\r?\n\#\#\#+\r?\n\r?\n//s; |
1076 | $pd =~ s/^\w..+?\r?\n\#\#\#+\r?\n\r?\n//s; |
1077 | warn "Wrong length underline" if length($doctitle) != length($ul); |
1077 | warn "Wrong length underline" if length($doctitle) != length($ul); |
1078 | 1078 | ||
1079 | $pd =~ s%<<rawtex:\s*(.*?)>>%hexit($1, 'RAWTEX')%gse; |
1079 | $pd =~ s%<<rawtex:\s*(.*?)>>%hexit($1, 'RAWTEX')%gse; |
1080 | $pd =~ s%<<rawdbx:\s*(.*?)>>%hexit($1, 'RAWDBX')%gse; |
1080 | $pd =~ s%<<rawdbx:\s*(.*?)>>%hexit($1, 'RAWDBX')%gse; |
1081 | $pd =~ s%<<rawrtf:\s*(.*?)>>%hexit($1, 'RAWRTF')%gse; |
1081 | $pd =~ s%<<rawrtf:\s*(.*?)>>%hexit($1, 'RAWRTF')%gse; |
1082 | $pd =~ s%<<rawhtml:\s*(.*?)>>%hexit($1, 'RAWHTML')%gse; |
1082 | $pd =~ s%<<rawhtml:\s*(.*?)>>%hexit($1, 'RAWHTML')%gse; |
1083 | 1083 | ||
1084 | writeall("pd.dump.$$", $pd) if $trace; # Dump file after special tags have been extracted |
1084 | writeall("pd.dump.$$", $pd) if $trace; # Dump file after special tags have been extracted |
1085 | 1085 | ||
1086 | if (1) { |
1086 | if (1) { |
1087 | $x = $pd; |
1087 | $x = $pd; |
1088 | $x =~ s/\\\w+(\[.*?\])*(\{.*?\})*/ /gs; |
1088 | $x =~ s/\\\w+(\[.*?\])*(\{.*?\})*/ /gs; |
1089 | $x =~ s/\$.{1,100}?\$/ /gs; |
1089 | $x =~ s/\$.{1,100}?\$/ /gs; |
1090 | $x =~ s/<<\w+:\s+.*?>>/ /sg; # All special blocks are omitted |
1090 | $x =~ s/<<\w+:\s+.*?>>/ /sg; # All special blocks are omitted |
1091 | $x =~ s/\[.+?\]/ /gs; |
1091 | $x =~ s/\[.+?\]/ /gs; |
1092 | $x =~ s/\d+/ /gs; |
1092 | $x =~ s/\d+/ /gs; |
1093 | $x =~ s|[.,;:!?+*&/%\"\'°º()<>{}^~=-]| |g; # *** primero, segunda |
1093 | $x =~ s|[.,;:!?+*&/%\"\'°º()<>{}^~=-]| |g; # *** primero, segunda |
1094 | my @spell = split /\s+/s, $x; |
1094 | my @spell = split /\s+/s, $x; |
1095 | my %spell; |
1095 | my %spell; |
1096 | for $x (@spell) { ++$spell{$x}; } |
1096 | for $x (@spell) { ++$spell{$x}; } |
1097 | open SPELL, ">${texdir}spell.words" or die "Can't write dump file ${texdir}spell.words: $!"; |
1097 | open SPELL, ">${texdir}spell.words" or die "Can't write dump file ${texdir}spell.words: $!"; |
1098 | warn "Writing ${texdir}spell.words"; |
1098 | warn "Writing ${texdir}spell.words"; |
1099 | @spell = sort keys %spell; |
1099 | @spell = sort keys %spell; |
1100 | for $x (@spell) { |
1100 | for $x (@spell) { |
1101 | print SPELL "$x\n" unless $x =~ /^[A-Z]+$/; |
1101 | print SPELL "$x\n" unless $x =~ /^[A-Z]+$/; |
1102 | } |
1102 | } |
1103 | close SPELL; |
1103 | close SPELL; |
1104 | # aspell --encoding=iso8859-1 --lang=pt list <spell.words >miten.meni *** ei toimi hyvin |
1104 | # aspell --encoding=iso8859-1 --lang=pt list <spell.words >miten.meni *** ei toimi hyvin |
1105 | # aspell --encoding=iso8859-1 --lang=en_GB-ize --personal=./spell.right list <spell.words |
1105 | # aspell --encoding=iso8859-1 --lang=en_GB-ize --personal=./spell.right list <spell.words |
1106 | # aspell --encoding=iso8859-1 --lang=en_US --personal=./spell.right list <tex/spell.words |
1106 | # aspell --encoding=iso8859-1 --lang=en_US --personal=./spell.right list <tex/spell.words |
1107 | # First line of spell.right: personal_ws-1.1 en 350 iso8859-1 |
1107 | # First line of spell.right: personal_ws-1.1 en 350 iso8859-1 |
1108 | # ispell -d portugues -p oikein.dict -l <spell.words >miten.meni # Toimii |
1108 | # ispell -d portugues -p oikein.dict -l <spell.words >miten.meni # Toimii |
1109 | # cd /var/lib/ispell; unzip /t/en_GB-oed.zip; buildhash [-s] dict affix hash # syntax err :-( |
1109 | # cd /var/lib/ispell; unzip /t/en_GB-oed.zip; buildhash [-s] dict affix hash # syntax err :-( |
1110 | } |
1110 | } |
1111 | 1111 | ||
1112 | ### Split into lines and do line processing |
1112 | ### Split into lines and do line processing |
1113 | 1113 | ||
1114 | @pd = split /\r?\n/, $pd; |
1114 | @pd = split /\r?\n/, $pd; |
1115 | $i = 0; |
1115 | $i = 0; |
1116 | #die Dumper \@pd; |
1116 | #die Dumper \@pd; |
1117 | 1117 | ||
1118 | $sec_id[0] = $top_id || $doctitle; |
1118 | $sec_id[0] = $top_id || $doctitle; |
1119 | $sec_id[0] =~ tr[A-Za-z0-9][_]c; |
1119 | $sec_id[0] =~ tr[A-Za-z0-9][_]c; |
1120 | $sec_level = 0; # The section nesting level (0 = doc, 1=sec, 2=subsec, 3=subsubsec, ...) |
1120 | $sec_level = 0; # The section nesting level (0 = doc, 1=sec, 2=subsec, 3=subsubsec, ...) |
1121 | 1121 | ||
1122 | sub sec { |
1122 | sub sec { |
1123 | my ($la, $j, $nndbx, $given_id, $short_title, $new_sec_level, @n_sec); |
1123 | my ($la, $j, $nndbx, $given_id, $short_title, $new_sec_level, @n_sec); |
1124 | while ($i <= $#pd) { |
1124 | while ($i <= $#pd) { |
1125 | warn "$i: sec $sec_level" if $trace; |
1125 | warn "$i: sec $sec_level" if $trace; |
1126 | body('',''); |
1126 | body('',''); |
1127 | if ($i > $#pd) { # end |
1127 | if ($i > $#pd) { # end |
1128 | close_dbx_sections(); |
1128 | close_dbx_sections(); |
1129 | return; |
1129 | return; |
1130 | } |
1130 | } |
1131 | 1131 | ||
1132 | # Ok, now body has detected a section |
1132 | # Ok, now body has detected a section |
1133 | 1133 | ||
1134 | $short_title = $given_id = undef; |
1134 | $short_title = $given_id = undef; |
1135 | $_ = $pd[$i]; # section title |
1135 | $_ = $pd[$i]; # section title |
1136 | # 12 2 1 3 3 4 4 5 5 |
1136 | # 12 2 1 3 3 4 4 5 5 |
1137 | if (/^<<((sub)*)sec:(?:(\w+):(?:([^:>]+):)?)? (.*?)>>/) { # <<sec:ID:short tit: Title>> |
1137 | if (/^<<((sub)*)sec:(?:(\w+):(?:([^:>]+):)?)? (.*?)>>/) { # <<sec:ID:short tit: Title>> |
1138 | warn "$i: section detected list_level=$list_level" if $trace; |
1138 | warn "$i: section detected list_level=$list_level" if $trace; |
1139 | $new_sec_level = (length($1) / 3) + 1; |
1139 | $new_sec_level = (length($1) / 3) + 1; |
1140 | $given_id = $3; |
1140 | $given_id = $3; |
1141 | $short_title = "[$4]"; |
1141 | $short_title = "[$4]"; |
1142 | $_ = $5; |
1142 | $_ = $5; |
1143 | } else { |
1143 | } else { |
1144 | $la = $pd[$i+1]; # underline lookahead |
1144 | $la = $pd[$i+1]; # underline lookahead |
1145 | warn "underline length does not match" if length $_ != length $la; # Sec candidate |
1145 | warn "underline length does not match" if length $_ != length $la; # Sec candidate |
1146 | if ($la =~ /^====+$/) { $new_sec_level = 1; # Section (Chapter) |
1146 | if ($la =~ /^====+$/) { $new_sec_level = 1; # Section (Chapter) |
1147 | } elsif ($la =~ /^----+$/) { $new_sec_level = 2; # Subsection (Section) |
1147 | } elsif ($la =~ /^----+$/) { $new_sec_level = 2; # Subsection (Section) |
1148 | } elsif ($la =~ /^~~~~+$/) { $new_sec_level = 3; # Subsubsection (Subsection) |
1148 | } elsif ($la =~ /^~~~~+$/) { $new_sec_level = 3; # Subsubsection (Subsection) |
1149 | } elsif ($la =~ /^\^\^\^+$/) { $new_sec_level = 4; # Subsubsubsection |
1149 | } elsif ($la =~ /^\^\^\^+$/) { $new_sec_level = 4; # Subsubsubsection |
1150 | } else { warn "false alarm, wrong underline type"; } |
1150 | } else { warn "false alarm, wrong underline type"; } |
1151 | } |
1151 | } |
1152 | s/^[\d.]* //s if $pdflag{'stripsecnum'}; |
1152 | s/^[\d.]* //s if $pdflag{'stripsecnum'}; |
1153 | 1153 | ||
1154 | if ($new_sec_level == $sec_level) { |
1154 | if ($new_sec_level == $sec_level) { |
1155 | print DBX ( (' 'x$sec_level) . "</section><!--$sec_id[$sec_level]-->\n\n\n"); |
1155 | print DBX ( (' 'x$sec_level) . "</section><!--$sec_id[$sec_level]-->\n\n\n"); |
1156 | #print RTF "\\sect}\n\n\n"; |
1156 | #print RTF "\\sect}\n\n\n"; |
1157 | if ($sec_level < 1) { |
1157 | if ($sec_level < 1) { |
1158 | warn "Figures in the previous section: $cap_n_images. Total figures thus far: $n_images.\n"; |
1158 | warn "Figures in the previous section: $cap_n_images. Total figures thus far: $n_images.\n"; |
1159 | $cap_n_images = 0; |
1159 | $cap_n_images = 0; |
1160 | } |
1160 | } |
1161 | } elsif ($new_sec_level > $sec_level) { |
1161 | } elsif ($new_sec_level > $sec_level) { |
1162 | warn "Section level can only ever increase by one ($i:$pd[$i]) ($sec_level $new_sec_level)" if $sec_level != ($new_sec_level-1); |
1162 | warn "Section level can only ever increase by one ($i:$pd[$i]) ($sec_level $new_sec_level)" if $sec_level != ($new_sec_level-1); |
1163 | $sec_level = $new_sec_level; |
1163 | $sec_level = $new_sec_level; |
1164 | $n_sec[$sec_level] = 0; |
1164 | $n_sec[$sec_level] = 0; |
1165 | } else { # section level decreases (by arbitrary amount) |
1165 | } else { # section level decreases (by arbitrary amount) |
1166 | if ($sec_level < 1) { |
1166 | if ($sec_level < 1) { |
1167 | warn "Figures in the previous section: $cap_n_images. Total figures thus far: $n_images.\n"; |
1167 | warn "Figures in the previous section: $cap_n_images. Total figures thus far: $n_images.\n"; |
1168 | $cap_n_images = 0; |
1168 | $cap_n_images = 0; |
1169 | } |
1169 | } |
1170 | for ($j = $sec_level; $j >= $new_sec_level; --$j) { |
1170 | for ($j = $sec_level; $j >= $new_sec_level; --$j) { |
1171 | print DBX ((' 'x$j) . "</section><!--$sec_id[$sec_level]-->\n\n\n"); |
1171 | print DBX ((' 'x$j) . "</section><!--$sec_id[$sec_level]-->\n\n\n"); |
1172 | #print RTF "\\sect}\n\n\n"; |
1172 | #print RTF "\\sect}\n\n\n"; |
1173 | } |
1173 | } |
1174 | $sec_level = $new_sec_level; |
1174 | $sec_level = $new_sec_level; |
1175 | } |
1175 | } |
1176 | 1176 | ||
1177 | ++$n_sec[$sec_level]; |
1177 | ++$n_sec[$sec_level]; |
1178 | $sec_id[$sec_level] = $given_id || $_; |
1178 | $sec_id[$sec_level] = $given_id || $_; |
1179 | $sec_id[$sec_level] =~ s/[^A-Za-z0-9]//gs; |
1179 | $sec_id[$sec_level] =~ s/[^A-Za-z0-9]//gs; |
1180 | $sec_id = join '-', @sec_id[0..$sec_level]; |
1180 | $sec_id = join '-', @sec_id[0..$sec_level]; |
1181 | $nn = ''; |
1181 | $nn = ''; |
1182 | for ($j = 1; $j <= $sec_level; ++$j) { |
1182 | for ($j = 1; $j <= $sec_level; ++$j) { |
1183 | $nn .= $n_sec[$j] . '.'; |
1183 | $nn .= $n_sec[$j] . '.'; |
1184 | } |
1184 | } |
1185 | chop $nn; |
1185 | chop $nn; |
1186 | 1186 | ||
1187 | $link = $sec_id; |
1187 | $link = $sec_id; |
1188 | ##$link = $nn; |
1188 | ##$link = $nn; |
1189 | ##$link =~ s/[^\w.-]//gs; |
1189 | ##$link =~ s/[^\w.-]//gs; |
1190 | ##$link =~ s/[.]/-/gs; |
1190 | ##$link =~ s/[.]/-/gs; |
1191 | #$link = fold_label($_); # fjon |
1191 | #$link = fold_label($_); # fjon |
1192 | 1192 | ||
1193 | $sec_no = $pdflag{'secnum'} ? $nn.' ' : ''; |
1193 | $sec_no = $pdflag{'secnum'} ? $nn.' ' : ''; |
1194 | $sec_no_dbx = $sec_no if $number; |
1194 | $sec_no_dbx = $sec_no if $number; |
1195 | #while ($sec_id_used{$sec_id}) { $sec_id++; } $sec_id_used{$sec_id} = 1; |
1195 | #while ($sec_id_used{$sec_id}) { $sec_id++; } $sec_id_used{$sec_id} = 1; |
1196 | $x = dbx_format($_); |
1196 | $x = dbx_format($_); |
1197 | print DBX ( (' 'x$sec_level) . qq(<section id="$sec_id">\n<title>$sec_no_dbx$x</title>\n)); |
1197 | print DBX ( (' 'x$sec_level) . qq(<section id="$sec_id">\n<title>$sec_no_dbx$x</title>\n)); |
1198 | 1198 | ||
1199 | print NONL "$_\n\n"; |
1199 | print NONL "$_\n\n"; |
1200 | print PDSEAL "$sec_no$_\n\n"; |
1200 | print PDSEAL "$sec_no$_\n\n"; |
1201 | 1201 | ||
1202 | $x = rtf_format($_); |
1202 | $x = rtf_format($_); |
1203 | #print RTF "{\\sectd \\tc\\tcf67\\tcl$sec_level \\ds$sec_level {\\s$sec_level $sec_no$x}\n"; |
1203 | #print RTF "{\\sectd \\tc\\tcf67\\tcl$sec_level \\ds$sec_level {\\s$sec_level $sec_no$x}\n"; |
1204 | my $rtf_style = $rtf_styles{'s'.$sec_level}; |
1204 | my $rtf_style = $rtf_styles{'s'.$sec_level}; |
1205 | warn "----> sec_level=$sec_level style($rtf_style)" if $trace; |
1205 | warn "----> sec_level=$sec_level style($rtf_style)" if $trace; |
1206 | print RTF "{\\pard $rtf_style \\s$sec_level $sec_no$x\\par}\n"; |
1206 | print RTF "{\\pard $rtf_style \\s$sec_level $sec_no$x\\par}\n"; |
1207 | 1207 | ||
1208 | $x = html_format($_); |
1208 | $x = html_format($_); |
1209 | print HTML ((' 'x$sec_level) . qq(<a id="$link"></a><h$sec_level>$sec_no$x</h$sec_level>\n)); |
1209 | print HTML ((' 'x$sec_level) . qq(<a id="$link"></a><h$sec_level>$sec_no$x</h$sec_level>\n)); |
1210 | push @html_toc_title, $sec_level < 2 ? "<b>$sec_no$x</b>" : "$sec_no$x"; |
1210 | push @html_toc_title, $sec_level < 2 ? "<b>$sec_no$x</b>" : "$sec_no$x"; |
1211 | push @html_toc_link, $link; |
1211 | push @html_toc_link, $link; |
1212 | 1212 | ||
1213 | if ($sec_level < $html2_split_threshold && $html2) { |
1213 | if ($sec_level < $html2_split_threshold && $html2) { |
1214 | $prevprev = $prev2; |
1214 | $prevprev = $prev2; |
1215 | $prev2 = $html2; |
1215 | $prev2 = $html2; |
1216 | ($nn_dash = $nn) =~ s/[.]/-/gs; |
1216 | ($nn_dash = $nn) =~ s/[.]/-/gs; |
1217 | $html2 = "$base-$nn_dash$sec_id.html"; |
1217 | $html2 = "$base-$nn_dash$sec_id.html"; |
1218 | #$html2 = $nn.$x; |
1218 | #$html2 = $nn.$x; |
1219 | #$html2 =~ s/[^\w.-]//gs; |
1219 | #$html2 =~ s/[^\w.-]//gs; |
1220 | #$html2 =~ s/[.]/-/gs; |
1220 | #$html2 =~ s/[.]/-/gs; |
1221 | #$html2 = "$base-$html2.html"; |
1221 | #$html2 = "$base-$html2.html"; |
1222 | 1222 | ||
1223 | if (!$nohtmlpreamb) { |
1223 | if (!$nohtmlpreamb) { |
1224 | my $amb = $htmlpostamble2; |
1224 | my $amb = $htmlpostamble2; |
1225 | $amb =~ s/!\?!TITLE/$doctitle: $sec_no$x/gs; |
1225 | $amb =~ s/!\?!TITLE/$doctitle: $sec_no$x/gs; |
1226 | $amb =~ s/!\?!BASE/$base/gs; |
1226 | $amb =~ s/!\?!BASE/$base/gs; |
1227 | $amb =~ s/!\?!PREV/$prevprev/gs; |
1227 | $amb =~ s/!\?!PREV/$prevprev/gs; |
1228 | $amb =~ s/!\?!NEXT/$html2/gs; |
1228 | $amb =~ s/!\?!NEXT/$html2/gs; |
1229 | print HTML2 $amb; |
1229 | print HTML2 $amb; |
1230 | } |
1230 | } |
1231 | close HTML2; |
1231 | close HTML2; |
1232 | open HTML2, ">$htmldir$html2" or die "Can't open $htmldir$html2 for writing new HTML segment: $!"; |
1232 | open HTML2, ">$htmldir$html2" or die "Can't open $htmldir$html2 for writing new HTML segment: $!"; |
1233 | warn "Writing $htmldir$html2"; |
1233 | warn "Writing $htmldir$html2"; |
1234 | if (!$nohtmlpreamb) { |
1234 | if (!$nohtmlpreamb) { |
1235 | my $amb = $htmlpreamble2; |
1235 | my $amb = $htmlpreamble2; |
1236 | $amb =~ s/!\?!TITLE/$doctitle: $sec_no$x/gs; |
1236 | $amb =~ s/!\?!TITLE/$doctitle: $sec_no$x/gs; |
1237 | $amb =~ s/!\?!BASE/$base/gs; |
1237 | $amb =~ s/!\?!BASE/$base/gs; |
1238 | $amb =~ s/!\?!PREV/$prev/gs; |
1238 | $amb =~ s/!\?!PREV/$prev/gs; |
1239 | $amb =~ s/!\?!NEXT/top-next-not-impl/gs; |
1239 | $amb =~ s/!\?!NEXT/top-next-not-impl/gs; |
1240 | print HTML2 $amb; |
1240 | print HTML2 $amb; |
1241 | #warn "amb($amb) base($base)\n\n"; |
1241 | #warn "amb($amb) base($base)\n\n"; |
1242 | } |
1242 | } |
1243 | } |
1243 | } |
1244 | $reflist{$link} = $nn; # Remember caption for later use |
1244 | $reflist{$link} = $nn; # Remember caption for later use |
1245 | $refhtmlpage{$link} = $html2; |
1245 | $refhtmlpage{$link} = $html2; |
1246 | 1246 | ||
1247 | print HTML2 ( (' 'x$sec_level) . qq(<a id="$link"></a><h$sec_level>$sec_no$x</h$sec_level>\n) ); |
1247 | print HTML2 ( (' 'x$sec_level) . qq(<a id="$link"></a><h$sec_level>$sec_no$x</h$sec_level>\n) ); |
1248 | push @html2_toc_link, qq($html2\#$link); # if $sec_level < $html2_split_threshold; # fjon |
1248 | push @html2_toc_link, qq($html2\#$link); # if $sec_level < $html2_split_threshold; # fjon |
1249 | 1249 | ||
1250 | warn "--- SEC $nn $x\n"; |
1250 | warn "--- SEC $nn $x\n"; |
1251 | $x = tex_format($_); |
1251 | $x = tex_format($_); |
1252 | #s/_/\\_/g; # Avoid TeX math mode: Missing $ inserted |
1252 | #s/_/\\_/g; # Avoid TeX math mode: Missing $ inserted |
1253 | print TEX $new_slide . '\\' . $tex_sec[$sec_level] . $short_title . "{$x}\\label{$sec_id}\n"; |
1253 | print TEX $new_slide . '\\' . $tex_sec[$sec_level] . $short_title . "{$x}\\label{$sec_id}\n"; |
1254 | print TEX "\\message{=== SEC $nn}\n"; # Progress reports in LaTeX source |
1254 | print TEX "\\message{=== SEC $nn}\n"; # Progress reports in LaTeX source |
1255 | $i += 2; |
1255 | $i += 2; |
1256 | } |
1256 | } |
1257 | } |
1257 | } |
1258 | 1258 | ||
1259 | $indent = 0; # current indent level |
1259 | $indent = 0; # current indent level |
1260 | $list_level = 0; # Hierarchical level of current list |
1260 | $list_level = 0; # Hierarchical level of current list |
1261 | @list_indent = (0); # Indendation level of different lists |
1261 | @list_indent = (0); # Indendation level of different lists |
1262 | @list_type = (0); # 1 = numeric, a = alpha, * = bullet, : = definition, etc. |
1262 | @list_type = (0); # 1 = numeric, a = alpha, * = bullet, : = definition, etc. |
1263 | 1263 | ||
1264 | sub body { |
1264 | sub body { |
1265 | my ($ind, $first) = @_; |
1265 | my ($ind, $first) = @_; |
1266 | my ($itemstart, $bullet, $item, $la, @para); |
1266 | my ($itemstart, $bullet, $item, $la, @para); |
1267 | my $ind_len = length($ind); |
1267 | my $ind_len = length($ind); |
1268 | push @para, $first if $first; |
1268 | push @para, $first if $first; |
1269 | while ($i <= $#pd) { |
1269 | while ($i <= $#pd) { |
1270 | warn "BODY $i($pd[$i])" if $trace>1; |
1270 | warn "BODY $i($pd[$i])" if $trace>1; |
1271 | if ($pd[$i] =~ /^\s*$/) { # empty line --> close current paragraph |
1271 | if ($pd[$i] =~ /^\s*$/) { # empty line --> close current paragraph |
1272 | @para = para(@para); |
1272 | @para = para(@para); |
1273 | ++$i; |
1273 | ++$i; |
1274 | warn "para done" if $trace>1; |
1274 | warn "para done" if $trace>1; |
1275 | next; |
1275 | next; |
1276 | } |
1276 | } |
1277 | if (substr($pd[$i],0,$ind_len) ne $ind) { # lesser indent terminates current constuct |
1277 | if (substr($pd[$i],0,$ind_len) ne $ind) { # lesser indent terminates current constuct |
1278 | warn "$i: lesser indent >$ind< ind_len=$indlen list_level=$list_level" if $trace; |
1278 | warn "$i: lesser indent >$ind< ind_len=$indlen list_level=$list_level" if $trace; |
1279 | last; |
1279 | last; |
1280 | } |
1280 | } |
1281 | if ($pd[$i]=~/^<<(sub)*sec:.*?>>/) { # section |
1281 | if ($pd[$i]=~/^<<(sub)*sec:.*?>>/) { # section |
1282 | warn "$i: section detected list_level=$list_level" if $trace; |
1282 | warn "$i: section detected list_level=$list_level" if $trace; |
1283 | last; |
1283 | last; |
1284 | } |
1284 | } |
1285 | $la = $pd[$i+1]; |
1285 | $la = $pd[$i+1]; |
1286 | if ((length($pd[$i]) >= 4) && $la =~ /^[=~^-]{4,}$/) { # section |
1286 | if ((length($pd[$i]) >= 4) && $la =~ /^[=~^-]{4,}$/) { # section |
1287 | warn "Section underline wrong length\n$pd[$i]\n$la" if length($pd[$i]) != length($la); |
1287 | warn "Section underline wrong length\n$pd[$i]\n$la" if length($pd[$i]) != length($la); |
1288 | warn "$i: section detected list_level=$list_level" if $trace; |
1288 | warn "$i: section detected list_level=$list_level" if $trace; |
1289 | last; |
1289 | last; |
1290 | } |
1290 | } |
1291 | 1291 | ||
1292 | $_ = $z = substr($pd[$i], $ind_len); # remove indent for rest of processing |
1292 | $_ = $z = substr($pd[$i], $ind_len); # remove indent for rest of processing |
1293 | ($itemstart, $item) = ($z =~ /^(\d+\.\s+)(.*)$/sx); # *** Debug |
1293 | ($itemstart, $item) = ($z =~ /^(\d+\.\s+)(.*)$/sx); # *** Debug |
1294 | warn "list_level=$list_level pd-1($pd[$i-1]),len=".length($pd[$i-1])." z($z) itst($itemstart) item($item) ord1=".ord(substr($z,1,1))." ord2=".ord(substr($z,2,1)) if $trace>1; |
1294 | warn "list_level=$list_level pd-1($pd[$i-1]),len=".length($pd[$i-1])." z($z) itst($itemstart) item($item) ord1=".ord(substr($z,1,1))." ord2=".ord(substr($z,2,1)) if $trace>1; |
1295 | 1295 | ||
1296 | if ((($itemstart, $bullet, $item) = /^(([*+-])\s+)(.*)$/) |
1296 | if ((($itemstart, $bullet, $item) = /^(([*+-])\s+)(.*)$/) |
1297 | && ($list_level || $pd[$i - 1] =~ /^\s*$/)) { # Start bulleted list |
1297 | && ($list_level || $pd[$i - 1] =~ /^\s*$/)) { # Start bulleted list |
1298 | @para = para(@para); |
1298 | @para = para(@para); |
1299 | $list_type[++$list_level] = $bullet; |
1299 | $list_type[++$list_level] = $bullet; |
1300 | $list_indent[$list_level] = $ind_len + length($itemstart); |
1300 | $list_indent[$list_level] = $ind_len + length($itemstart); |
1301 | warn "$i: bullet setting list_indent[$list_level] ind($ind) m1($itemstart) pd[i-1]($pd[$i-1])" if $trace; |
1301 | warn "$i: bullet setting list_indent[$list_level] ind($ind) m1($itemstart) pd[i-1]($pd[$i-1])" if $trace; |
1302 | list($ind_len + length($itemstart), $itemstart, $item); |
1302 | list($ind_len + length($itemstart), $itemstart, $item); |
1303 | warn "$i: bulleted list done" if $trace; |
1303 | warn "$i: bulleted list done" if $trace; |
1304 | next; |
1304 | next; |
1305 | } elsif ((($itemstart, $item) = /^(\d+\.\s+)(.*)$/s) |
1305 | } elsif ((($itemstart, $item) = /^(\d+\.\s+)(.*)$/s) |
1306 | && ($list_level || $pd[$i - 1] =~ /^\s*$/)) { # Start ordered list |
1306 | && ($list_level || $pd[$i - 1] =~ /^\s*$/)) { # Start ordered list |
1307 | @para = para(@para); |
1307 | @para = para(@para); |
1308 | $list_type[++$list_level] = '1'; |
1308 | $list_type[++$list_level] = '1'; |
1309 | $n_list[$list_level] = 1; |
1309 | $n_list[$list_level] = 1; |
1310 | warn "$i: ord setting list_indent[$list_level] ind($ind) m1=>$itemstart< pd[i-1]($pd[$i-1])" if $trace; |
1310 | warn "$i: ord setting list_indent[$list_level] ind($ind) m1=>$itemstart< pd[i-1]($pd[$i-1])" if $trace; |
1311 | $list_indent[$list_level] = $ind_len + length($itemstart); |
1311 | $list_indent[$list_level] = $ind_len + length($itemstart); |
1312 | list($ind_len + length($itemstart), $itemstart, $item); |
1312 | list($ind_len + length($itemstart), $itemstart, $item); |
1313 | warn "$i: ord list done list_level=$list_level" if $trace; |
1313 | warn "$i: ord list done list_level=$list_level" if $trace; |
1314 | next; |
1314 | next; |
1315 | } elsif ((($itemstart, $item) = /^([a-hj-z][.\)]\s+)(.*)$/) |
1315 | } elsif ((($itemstart, $item) = /^([a-hj-z][.\)]\s+)(.*)$/) |
1316 | && ($list_level || $pd[$i - 1] =~ /^\s*$/)) { # Start lower alpha list |
1316 | && ($list_level || $pd[$i - 1] =~ /^\s*$/)) { # Start lower alpha list |
1317 | @para = para(@para); |
1317 | @para = para(@para); |
1318 | $list_type[++$list_level] = 'a'; |
1318 | $list_type[++$list_level] = 'a'; |
1319 | $n_list[$list_level] = 'a'; |
1319 | $n_list[$list_level] = 'a'; |
1320 | warn "$i: lower alpha setting list_indent[$list_level] ind=$ind m1=>$itemstart<" if $trace; |
1320 | warn "$i: lower alpha setting list_indent[$list_level] ind=$ind m1=>$itemstart<" if $trace; |
1321 | $list_indent[$list_level] = $ind_len + length($itemstart); |
1321 | $list_indent[$list_level] = $ind_len + length($itemstart); |
1322 | list($ind_len + length($itemstart), $itemstart, $item); |
1322 | list($ind_len + length($itemstart), $itemstart, $item); |
1323 | warn "$i: lower alpha list done list_level=$list_level" if $trace; |
1323 | warn "$i: lower alpha list done list_level=$list_level" if $trace; |
1324 | next; |
1324 | next; |
1325 | } elsif ((($itemstart, $item) = /^([A-HJ-Z]\.\s+)(.*)$/) |
1325 | } elsif ((($itemstart, $item) = /^([A-HJ-Z]\.\s+)(.*)$/) |
1326 | && ($list_level || $pd[$i - 1] =~ /^\s*$/)) { # Start upper alpha list |
1326 | && ($list_level || $pd[$i - 1] =~ /^\s*$/)) { # Start upper alpha list |
1327 | @para = para(@para); |
1327 | @para = para(@para); |
1328 | $list_type[++$list_level] = 'A'; |
1328 | $list_type[++$list_level] = 'A'; |
1329 | $n_list[$list_level] = 'A'; |
1329 | $n_list[$list_level] = 'A'; |
1330 | $list_indent[$list_level] = $ind_len + length($itemstart); |
1330 | $list_indent[$list_level] = $ind_len + length($itemstart); |
1331 | list($ind_len + length($itemstart), $itemstart, $item); |
1331 | list($ind_len + length($itemstart), $itemstart, $item); |
1332 | warn "$i: upper alpha list done list_level=$list_level" if $trace; |
1332 | warn "$i: upper alpha list done list_level=$list_level" if $trace; |
1333 | next; |
1333 | next; |
1334 | } elsif ((($itemstart, $item) = /^(i[.\)]\s+)(.*)$/) |
1334 | } elsif ((($itemstart, $item) = /^(i[.\)]\s+)(.*)$/) |
1335 | && ($list_level || $pd[$i - 1] =~ /^\s*$/)) { # Start lower roman list |
1335 | && ($list_level || $pd[$i - 1] =~ /^\s*$/)) { # Start lower roman list |
1336 | @para = para(@para); |
1336 | @para = para(@para); |
1337 | $list_type[++$list_level] = 'i'; |
1337 | $list_type[++$list_level] = 'i'; |
1338 | $n_list[$list_level] = 'i'; |
1338 | $n_list[$list_level] = 'i'; |
1339 | warn "$i: lower roman setting list_indent[$list_level] ind=$ind m1=>$itemstart<" if $trace; |
1339 | warn "$i: lower roman setting list_indent[$list_level] ind=$ind m1=>$itemstart<" if $trace; |
1340 | $list_indent[$list_level] = $ind_len + length($itemstart); |
1340 | $list_indent[$list_level] = $ind_len + length($itemstart); |
1341 | list($ind_len + length($itemstart), $itemstart, $item); |
1341 | list($ind_len + length($itemstart), $itemstart, $item); |
1342 | warn "$i: lower roman list done list_level=$list_level" if $trace; |
1342 | warn "$i: lower roman list done list_level=$list_level" if $trace; |
1343 | next; |
1343 | next; |
1344 | } elsif ((($itemstart, $item) = /^(I\.\s+)(.*)$/) |
1344 | } elsif ((($itemstart, $item) = /^(I\.\s+)(.*)$/) |
1345 | && ($list_level || $pd[$i - 1] =~ /^\s*$/)) { # Start upper alpha list |
1345 | && ($list_level || $pd[$i - 1] =~ /^\s*$/)) { # Start upper alpha list |
1346 | @para = para(@para); |
1346 | @para = para(@para); |
1347 | $list_type[++$list_level] = 'I'; |
1347 | $list_type[++$list_level] = 'I'; |
1348 | $n_list[$list_level] = 'I'; |
1348 | $n_list[$list_level] = 'I'; |
1349 | $list_indent[$list_level] = $ind_len + length($itemstart); |
1349 | $list_indent[$list_level] = $ind_len + length($itemstart); |
1350 | list($ind_len + length($itemstart), $itemstart, $item); |
1350 | list($ind_len + length($itemstart), $itemstart, $item); |
1351 | warn "$i: upper Roman list done list_level=$list_level" if $trace; |
1351 | warn "$i: upper Roman list done list_level=$list_level" if $trace; |
1352 | next; |
1352 | next; |
1353 | } elsif ((($itemstart, $bullet, $item) = /^(([^\n]+?)::\s+)(.*)$/) |
1353 | } elsif ((($itemstart, $bullet, $item) = /^(([^\n]+?)::\s+)(.*)$/) |
1354 | && ($list_level || $pd[$i - 1] =~ /^\s*$/)) { # Start definition list |
1354 | && ($list_level || $pd[$i - 1] =~ /^\s*$/)) { # Start definition list |
1355 | @para = para(@para); |
1355 | @para = para(@para); |
1356 | $list_type[++$list_level] = ':'; |
1356 | $list_type[++$list_level] = ':'; |
1357 | #$list_indent[$list_level] = $ind_len + length($itemstart); |
1357 | #$list_indent[$list_level] = $ind_len + length($itemstart); |
1358 | $list_indent[$list_level] = $ind_len + 4; |
1358 | $list_indent[$list_level] = $ind_len + 4; |
1359 | varlist($ind_len + 4, $bullet, $item); |
1359 | varlist($ind_len + 4, $bullet, $item); |
1360 | warn "$i: definition list done list_level=$list_level" if $trace; |
1360 | warn "$i: definition list done list_level=$list_level" if $trace; |
1361 | next; |
1361 | next; |
1362 | } |
1362 | } |
1363 | 1363 | ||
1364 | if (/^> (.*?)$/) { # usenet quoted stuff is block quote |
1364 | if (/^> (.*?)$/) { # usenet quoted stuff is block quote |
1365 | @para = para(@para); |
1365 | @para = para(@para); |
1366 | blockquote($1); |
1366 | blockquote($1); |
1367 | next; |
1367 | next; |
1368 | } |
1368 | } |
1369 | 1369 | ||
1370 | if (/^\s+(.*?)$/) { # indented stuff is verbatim |
1370 | if (/^\s+(.*?)$/) { # indented stuff is verbatim |
1371 | @para = para(@para); |
1371 | @para = para(@para); |
1372 | code($1); |
1372 | code($1); |
1373 | next; |
1373 | next; |
1374 | } |
1374 | } |
1375 | 1375 | ||
1376 | if (/^<<texsections:\s+(.*?)>>$/) { |
1376 | if (/^<<texsections:\s+(.*?)>>$/) { |
1377 | @para = para(@para); |
1377 | @para = para(@para); |
1378 | @tex_sec = split /[,\s]+/, $1; |
1378 | @tex_sec = split /[,\s]+/, $1; |
1379 | ++$i; |
1379 | ++$i; |
1380 | next; |
1380 | next; |
1381 | } |
1381 | } |
1382 | if (/^<<pdflags:\s+(.*?)>>$/) { |
1382 | if (/^<<pdflags:\s+(.*?)>>$/) { |
1383 | @para = para(@para); |
1383 | @para = para(@para); |
1384 | for $flag (split /[,\s]+/, $1) { |
1384 | for $flag (split /[,\s]+/, $1) { |
1385 | ($flagname, $flagvalue) = split /=/, $flag, 2; |
1385 | ($flagname, $flagvalue) = split /=/, $flag, 2; |
1386 | $pdflag{$flagname} = $flagvalue; |
1386 | $pdflag{$flagname} = $flagvalue; |
1387 | } |
1387 | } |
1388 | ++$i; |
1388 | ++$i; |
1389 | next; |
1389 | next; |
1390 | } |
1390 | } |
1391 | 1391 | ||
1392 | # 1 2 2 3 3 4 4 5 legend |
1392 | # 1 2 2 3 3 4 4 5 legend |
1393 | if (/^<<gnuplot:\s*(\S.*?)(?:\,(\S*?)(?:,(\S*?)(?:,(\S*?))?)?)?:\s*(.*)$/) { |
1393 | if (/^<<gnuplot:\s*(\S.*?)(?:\,(\S*?)(?:,(\S*?)(?:,(\S*?))?)?)?:\s*(.*)$/) { |
1394 | @para = para(@para); |
1394 | @para = para(@para); |
1395 | print NONL $_; |
1395 | print NONL $_; |
1396 | print PDSEAL $_; |
1396 | print PDSEAL $_; |
1397 | 1397 | ||
1398 | warn "-----creating temporary gnuplot file $1.gp\n"; |
1398 | warn "-----creating temporary gnuplot file $1.gp\n"; |
1399 | open GNUPLOT, ">$1.gp" or die "Can't create temprary file $1.gp: $!"; |
1399 | open GNUPLOT, ">$1.gp" or die "Can't create temprary file $1.gp: $!"; |
1400 | warn "Writing $1.gp"; |
1400 | warn "Writing $1.gp"; |
1401 | print GNUPLOT "# Generated by pd2tex. DO NOT EDIT. CHANGES WILL BE LOST.\n"; |
1401 | print GNUPLOT "# Generated by pd2tex. DO NOT EDIT. CHANGES WILL BE LOST.\n"; |
1402 | print GNUPLOT qq(set output "$1.eps"\n); |
1402 | print GNUPLOT qq(set output "$1.eps"\n); |
1403 | ++$i; |
1403 | ++$i; |
1404 | if ($pd[$i] !~ /^>>/) { |
1404 | if ($pd[$i] !~ /^>>/) { |
1405 | print GNUPLOT qq(set terminal postscript\n) unless $pd[$i] =~ /set\s+terminal/; |
1405 | print GNUPLOT qq(set terminal postscript\n) unless $pd[$i] =~ /set\s+terminal/; |
1406 | print GNUPLOT qq(set encoding iso_8859_1\n) unless $pd[$i] =~ /set\s+encoding/; |
1406 | print GNUPLOT qq(set encoding iso_8859_1\n) unless $pd[$i] =~ /set\s+encoding/; |
1407 | print GNUPLOT $pd[$i]."\n"; |
1407 | print GNUPLOT $pd[$i]."\n"; |
1408 | for (++$i; $pd[$i] !~ /^>>/; ++$i) { |
1408 | for (++$i; $pd[$i] !~ /^>>/; ++$i) { |
1409 | print GNUPLOT $pd[$i]."\n"; |
1409 | print GNUPLOT $pd[$i]."\n"; |
1410 | } |
1410 | } |
1411 | } |
1411 | } |
1412 | close GNUPLOT; |
1412 | close GNUPLOT; |
1413 | image($1, $5, $2, $3, $4); |
1413 | image($1, $5, $2, $3, $4); |
1414 | ++$i; |
1414 | ++$i; |
1415 | next; |
1415 | next; |
1416 | } |
1416 | } |
1417 | 1417 | ||
1418 | if (($name, $pos, $siz, $trim, $caption) = |
1418 | if (($name, $pos, $siz, $trim, $caption) = |
1419 | # 1 1 2 2 3 3 4 4 5 5 |
1419 | # 1 1 2 2 3 3 4 4 5 5 |
1420 | /^<<dot:\s*(\S.*?)(?:\,(\S*?)(?:,(\S*?)(?:,(\S*?))?)?)?:\s*(.*)$/) { |
1420 | /^<<dot:\s*(\S.*?)(?:\,(\S*?)(?:,(\S*?)(?:,(\S*?))?)?)?:\s*(.*)$/) { |
1421 | @para = para(@para); |
1421 | @para = para(@para); |
1422 | 1422 | ||
1423 | warn "-----creating temporary dot file $name.dot\n"; |
1423 | warn "-----creating temporary dot file $name.dot\n"; |
1424 | open DOT, ">$name.dot" or die "Can't create temprary file $name.dot: $!"; |
1424 | open DOT, ">$name.dot" or die "Can't create temprary file $name.dot: $!"; |
1425 | warn "Writing $name.dot"; |
1425 | warn "Writing $name.dot"; |
1426 | warn `pwd`; |
1426 | warn `pwd`; |
1427 | print DOT "// Generated by pd2tex. DO NOT EDIT. CHANGES WILL BE LOST.\n"; |
1427 | print DOT "// Generated by pd2tex. DO NOT EDIT. CHANGES WILL BE LOST.\n"; |
1428 | for (++$i; $pd[$i] =~ /^\s*\/\//; ++$i) { # comments |
1428 | for (++$i; $pd[$i] =~ /^\s*\/\//; ++$i) { # comments |
1429 | print DOT $pd[$i]."\n"; |
1429 | print DOT $pd[$i]."\n"; |
1430 | } |
1430 | } |
1431 | #warn "DOT name($name) $i: $pd[$i]"; |
1431 | #warn "DOT name($name) $i: $pd[$i]"; |
1432 | if ($pd[$i] !~ /graph\s+\w+\s*\{/) { # not explicitly specified |
1432 | if ($pd[$i] !~ /graph\s+\w+\s*\{/) { # not explicitly specified |
1433 | ($name2 = $name) =~ s/[^a-z0-9]/_/gi; |
1433 | ($name2 = $name) =~ s/[^a-z0-9]/_/gi; |
1434 | print DOT "digraph $name2 {\n"; |
1434 | print DOT "digraph $name2 {\n"; |
1435 | $need_close_curly = 1; |
1435 | $need_close_curly = 1; |
1436 | } else { |
1436 | } else { |
1437 | $need_close_curly = 0; |
1437 | $need_close_curly = 0; |
1438 | } |
1438 | } |
1439 | for (; $pd[$i] !~ /^>>/; ++$i) { |
1439 | for (; $pd[$i] !~ /^>>/; ++$i) { |
1440 | print DOT $pd[$i]."\n"; |
1440 | print DOT $pd[$i]."\n"; |
1441 | } |
1441 | } |
1442 | print DOT "}\n" if $need_close_curly; |
1442 | print DOT "}\n" if $need_close_curly; |
1443 | close DOT; |
1443 | close DOT; |
1444 | image($name, $caption, $pos, $siz, $trim); |
1444 | image($name, $caption, $pos, $siz, $trim); |
1445 | ++$i; |
1445 | ++$i; |
1446 | next; |
1446 | next; |
1447 | } |
1447 | } |
1448 | 1448 | ||
1449 | if (/<<epspdf:\s*(\S+)>>/) { # trigger image generation without rendering image in output |
1449 | if (/<<epspdf:\s*(\S+)>>/) { # trigger image generation without rendering image in output |
1450 | @para = para(@para); |
1450 | @para = para(@para); |
1451 | gen_img($1, "$i epspdf: $pd[$i]"); |
1451 | gen_img($1, "$i epspdf: $pd[$i]"); |
1452 | ++$i; |
1452 | ++$i; |
1453 | next; |
1453 | next; |
1454 | } |
1454 | } |
1455 | 1455 | ||
1456 | # path pos siz trim caption? |
1456 | # path pos siz trim caption? |
1457 | # 1 1 ,2 2 ,3 3 ,4 4 5: 6 65 |
1457 | # 1 1 ,2 2 ,3 3 ,4 4 5: 6 65 |
1458 | if (/^<<img:\s*(\S.*?)(?:\,(\S*?)(?:,(\S*?)(?:,(\S*?))?)?)?(:\s*(.*?))?>>/i) { |
1458 | if (/^<<img:\s*(\S.*?)(?:\,(\S*?)(?:,(\S*?)(?:,(\S*?))?)?)?(:\s*(.*?))?>>/i) { |
1459 | @para = para(@para); |
1459 | @para = para(@para); |
1460 | #warn "IMG IMG IMG [$1/$2/$3/$4/$6]"; |
1460 | #warn "IMG IMG IMG [$1/$2/$3/$4/$6]"; |
1461 | print NONL $_; |
1461 | print NONL $_; |
1462 | print PDSEAL $_; |
1462 | print PDSEAL $_; |
1463 | image($1, $6, $2, $3, $4); |
1463 | image($1, $6, $2, $3, $4); |
1464 | ++$i; |
1464 | ++$i; |
1465 | next; |
1465 | next; |
1466 | } |
1466 | } |
1467 | 1467 | ||
1468 | # path pos siz trim layers caption |
1468 | # path pos siz trim layers caption |
1469 | # 1 1 ,2 2 ,3 3 ,4 4 :5 56: 7 7 |
1469 | # 1 1 ,2 2 ,3 3 ,4 4 :5 56: 7 7 |
1470 | if (/^<<dia:\s*(\S.*?)(?:\,(\S*?)(?:,(\S*?)(?:,(\S*?))?)?)?:([a-z0-9_,-]+)(:\s*(.*?))?>>/i) { |
1470 | if (/^<<dia:\s*(\S.*?)(?:\,(\S*?)(?:,(\S*?)(?:,(\S*?))?)?)?:([a-z0-9_,-]+)(:\s*(.*?))?>>/i) { |
1471 | @para = para(@para); |
1471 | @para = para(@para); |
1472 | print NONL $_; |
1472 | print NONL $_; |
1473 | print PDSEAL $_; |
1473 | print PDSEAL $_; |
1474 | #warn "DIA DIA DIA [$1/$2/$3/$4/$5/$7]"; |
1474 | #warn "DIA DIA DIA [$1/$2/$3/$4/$5/$7]"; |
1475 | image($1, $7, $2, $3, $4, $5); |
1475 | image($1, $7, $2, $3, $4, $5); |
1476 | ++$i; |
1476 | ++$i; |
1477 | next; |
1477 | next; |
1478 | } |
1478 | } |
1479 | 1479 | ||
1480 | # 1 1 2 2 3 3 |
1480 | # 1 1 2 2 3 3 |
1481 | if (($ref, $posspec, $legend) = /^<<doubleimg:\s*(\S.*?)(?:\,(\S*?))?:\s*(.*)$/) { |
1481 | if (($ref, $posspec, $legend) = /^<<doubleimg:\s*(\S.*?)(?:\,(\S*?))?:\s*(.*)$/) { |
1482 | my ($path1, $legend1, $path2, $legend2); |
1482 | my ($path1, $legend1, $path2, $legend2); |
1483 | @para = para(@para); |
1483 | @para = para(@para); |
1484 | print NONL $_; |
1484 | print NONL $_; |
1485 | print PDSEAL $_; |
1485 | print PDSEAL $_; |
1486 | 1486 | ||
1487 | ++$i; |
1487 | ++$i; |
1488 | if (($path1, $legend1) = ($pd[$i] =~ /^([^:>]+):\s*(.*)$/)) { |
1488 | if (($path1, $legend1) = ($pd[$i] =~ /^([^:>]+):\s*(.*)$/)) { |
1489 | ++$i; |
1489 | ++$i; |
1490 | if (($path2, $legend2) = ($pd[$i] =~ /^([^:>]+):\s*(.*)$/)) { |
1490 | if (($path2, $legend2) = ($pd[$i] =~ /^([^:>]+):\s*(.*)$/)) { |
1491 | ++$i; |
1491 | ++$i; |
1492 | } |
1492 | } |
1493 | } |
1493 | } |
1494 | for (; $pd[$i] !~ /^>>/; ++$i) { |
1494 | for (; $pd[$i] !~ /^>>/; ++$i) { |
1495 | warn "doubleimg: skipping excess input($pd[$i])"; |
1495 | warn "doubleimg: skipping excess input($pd[$i])"; |
1496 | } |
1496 | } |
1497 | #warn "doubleimage($path1,$legend1,$path2,$legend2)"; |
1497 | #warn "doubleimage($path1,$legend1,$path2,$legend2)"; |
1498 | doubleimage($ref, $legend, $posspec, $path1, undef, $legend1, $path2, undef, $legend2); |
1498 | doubleimage($ref, $legend, $posspec, $path1, undef, $legend1, $path2, undef, $legend2); |
1499 | ++$i; |
1499 | ++$i; |
1500 | next; |
1500 | next; |
1501 | } |
1501 | } |
1502 | 1502 | ||
1503 | # 1 1 2 2 3 3 |
1503 | # 1 1 2 2 3 3 |
1504 | if (($ref, $posspec, $legend) = /^<<doubledia:\s*(\S.*?)(?:\,(\S*?))?:\s*(.*)$/) { |
1504 | if (($ref, $posspec, $legend) = /^<<doubledia:\s*(\S.*?)(?:\,(\S*?))?:\s*(.*)$/) { |
1505 | my ($path1, $legend1, $path2, $legend2); |
1505 | my ($path1, $legend1, $path2, $legend2); |
1506 | @para = para(@para); |
1506 | @para = para(@para); |
1507 | print NONL $_; |
1507 | print NONL $_; |
1508 | print PDSEAL $_; |
1508 | print PDSEAL $_; |
1509 | 1509 | ||
1510 | ++$i; |
1510 | ++$i; |
1511 | if (($path1, $layers1, $legend1) = ($pd[$i] =~ /^([^:>]+):([a-z0-9_,-]+):\s*(.*)$/i)) { |
1511 | if (($path1, $layers1, $legend1) = ($pd[$i] =~ /^([^:>]+):([a-z0-9_,-]+):\s*(.*)$/i)) { |
1512 | ++$i; |
1512 | ++$i; |
1513 | if (($path2, $layers2, $legend2) = ($pd[$i] =~ /^([^:>]+):([a-z0-9_,-]+):\s*(.*)$/i)) { |
1513 | if (($path2, $layers2, $legend2) = ($pd[$i] =~ /^([^:>]+):([a-z0-9_,-]+):\s*(.*)$/i)) { |
1514 | ++$i; |
1514 | ++$i; |
1515 | } |
1515 | } |
1516 | } |
1516 | } |
1517 | for (; $pd[$i] !~ /^>>/; ++$i) { |
1517 | for (; $pd[$i] !~ /^>>/; ++$i) { |
1518 | warn "doubledia: skipping excess input($pd[$i])"; |
1518 | warn "doubledia: skipping excess input($pd[$i])"; |
1519 | } |
1519 | } |
1520 | #warn "doubleimage($path1,$legend1,$path2,$legend2)"; |
1520 | #warn "doubleimage($path1,$legend1,$path2,$legend2)"; |
1521 | doubleimage($ref, $legend, $posspec, $path1, $layers1, $legend1, $path2, $layers2, $legend2); |
1521 | doubleimage($ref, $legend, $posspec, $path1, $layers1, $legend1, $path2, $layers2, $legend2); |
1522 | ++$i; |
1522 | ++$i; |
1523 | next; |
1523 | next; |
1524 | } |
1524 | } |
1525 | 1525 | ||
1526 | # <<table: Legenda\n ...>> |
1526 | # <<table: Legenda\n ...>> |
1527 | # 123 4 5 2 1 6 7 76 |
1527 | # 123 4 5 2 1 6 7 76 |
1528 | if (/^<<(((long)|(mini)|(raw))?table):(\s*([A-Za-z0-9\xa0-\xff].*))?$/) { |
1528 | if (/^<<(((long)|(mini)|(raw))?table):(\s*([A-Za-z0-9\xa0-\xff].*))?$/) { |
1529 | @para = para(@para); |
1529 | @para = para(@para); |
1530 | table($7,$1); |
1530 | table($7,$1); |
1531 | next; |
1531 | next; |
1532 | } |
1532 | } |
1533 | 1533 | ||
1534 | #<<csv: file1,topleft2,botright3,options4: Legenda6>> |
1534 | #<<csv: file1,topleft2,botright3,options4: Legenda6>> |
1535 | # 1 1 ,2 2 ,3 3 ,4 4 5: 6 65 |
1535 | # 1 1 ,2 2 ,3 3 ,4 4 5: 6 65 |
1536 | if (/^<<csv:\s*(\S.*?)(?:\,(\S*?)(?:,(\S*?)(?:,(\S*?))?)?)?(:\s*(.*?))?>>/i) { |
1536 | if (/^<<csv:\s*(\S.*?)(?:\,(\S*?)(?:,(\S*?)(?:,(\S*?))?)?)?(:\s*(.*?))?>>/i) { |
1537 | @para = para(@para); |
1537 | @para = para(@para); |
1538 | #warn "CSV [$1/$2/$3/$4/$6]"; |
1538 | #warn "CSV [$1/$2/$3/$4/$6]"; |
1539 | csv($1, $6, $2, $3, $4); |
1539 | csv($1, $6, $2, $3, $4); |
1540 | ++$i; |
1540 | ++$i; |
1541 | next; |
1541 | next; |
1542 | } |
1542 | } |
1543 | 1543 | ||
1544 | if (/^<<references(:\d)?:( (\w.*?))?\s*$/) { |
1544 | if (/^<<references(:\d)?:( (\w.*?))?\s*$/) { |
1545 | @para = para(@para); |
1545 | @para = para(@para); |
1546 | warn "Found references"; |
1546 | warn "Found references"; |
1547 | references($3, $1); |
1547 | references($3, $1); |
1548 | next; |
1548 | next; |
1549 | } |
1549 | } |
1550 | 1550 | ||
1551 | # 1 1 2 3 32 |
1551 | # 1 1 2 3 32 |
1552 | if (/^<<xmlfmt:([^:]*):(\s*([A-Za-z0-9\xa0-\xff].*))?$/) { |
1552 | if (/^<<xmlfmt:([^:]*):(\s*([A-Za-z0-9\xa0-\xff].*))?$/) { |
1553 | @para = para(@para); |
1553 | @para = para(@para); |
1554 | xmlfmt($3,$1); |
1554 | xmlfmt($3,$1); |
1555 | next; |
1555 | next; |
1556 | } |
1556 | } |
1557 | 1557 | ||
1558 | # 1file_1 2sec__2 3xsd__3 4Cap4 |
1558 | # 1file_1 2sec__2 3xsd__3 4Cap4 |
1559 | if (/^<<sgfrag:([^:]*):([^:]*):([^:]*):\s*(.+?)\s*>>/) { |
1559 | if (/^<<sgfrag:([^:]*):([^:]*):([^:]*):\s*(.+?)\s*>>/) { |
1560 | @para = para(@para); |
1560 | @para = para(@para); |
1561 | sgfrag($1, $2, $3, $4); |
1561 | sgfrag($1, $2, $3, $4); |
1562 | ++$i; |
1562 | ++$i; |
1563 | next; |
1563 | next; |
1564 | } |
1564 | } |
1565 | 1565 | ||
1566 | # 12 2 1 3 4 43 |
1566 | # 12 2 1 3 4 43 |
1567 | if (/^<<schema:((\S*):)?( (\w.*))?$/) { # XML schema verbatim listing |
1567 | if (/^<<schema:((\S*):)?( (\w.*))?$/) { # XML schema verbatim listing |
1568 | @para = para(@para); |
1568 | @para = para(@para); |
1569 | print DBX qq(<programlisting format="schema"><computeroutput><!\[CDATA\[); |
1569 | print DBX qq(<programlisting format="schema"><computeroutput><!\[CDATA\[); |
1570 | print RTF qq({\\f2); |
1570 | print RTF qq({\\f2); |
1571 | print HTML qq(<pre>); |
1571 | print HTML qq(<pre>); |
1572 | print HTML2 qq(<pre>); |
1572 | print HTML2 qq(<pre>); |
1573 | print TEX qq(\\begin{verbatim}); |
1573 | print TEX qq(\\begin{verbatim}); |
1574 | unindented_code($2, $4); # filespec, first |
1574 | unindented_code($2, $4); # filespec, first |
1575 | print TEX qq(\\end{verbatim}\n); |
1575 | print TEX qq(\\end{verbatim}\n); |
1576 | print DBX qq(\]\]></computeroutput></programlisting>); |
1576 | print DBX qq(\]\]></computeroutput></programlisting>); |
1577 | print RTF qq(}); |
1577 | print RTF qq(}); |
1578 | print HTML "</pre>"; |
1578 | print HTML "</pre>"; |
1579 | print HTML2 "</pre>"; |
1579 | print HTML2 "</pre>"; |
1580 | ++$i; |
1580 | ++$i; |
1581 | next; |
1581 | next; |
1582 | } |
1582 | } |
1583 | 1583 | ||
1584 | # 12 2 1 3 4 43 |
1584 | # 12 2 1 3 4 43 |
1585 | if (/^<<code:((\S*):)?( (\w.*))?$/) { # code verbatim listing |
1585 | if (/^<<code:((\S*):)?( (\w.*))?$/) { # code verbatim listing |
1586 | @para = para(@para); |
1586 | @para = para(@para); |
1587 | print DBX qq(<programlisting format="code"><computeroutput><!\[CDATA\[); |
1587 | print DBX qq(<programlisting format="code"><computeroutput><!\[CDATA\[); |
1588 | print RTF qq({\\f2); |
1588 | print RTF qq({\\f2); |
1589 | print HTML qq(<pre>); |
1589 | print HTML qq(<pre>); |
1590 | print HTML2 qq(<pre>); |
1590 | print HTML2 qq(<pre>); |
1591 | 1591 | ||
1592 | #print TEX qq(\\begin{Verbatim}[fontsize=\\small]); |
1592 | #print TEX qq(\\begin{Verbatim}[fontsize=\\small]); |
1593 | #unindented_code($2,$4); |
1593 | #unindented_code($2,$4); |
1594 | #print TEX qq(\\end{Verbatim}\n); |
1594 | #print TEX qq(\\end{Verbatim}\n); |
1595 | 1595 | ||
1596 | print TEX qq(\\begin{lstlisting}); |
1596 | print TEX qq(\\begin{lstlisting}); |
1597 | unindented_code($2, $4); |
1597 | unindented_code($2, $4); |
1598 | print TEX qq(\\end{lstlisting}\n); |
1598 | print TEX qq(\\end{lstlisting}\n); |
1599 | 1599 | ||
1600 | print DBX qq(\]\]></computeroutput></programlisting>); |
1600 | print DBX qq(\]\]></computeroutput></programlisting>); |
1601 | print RTF qq(}); |
1601 | print RTF qq(}); |
1602 | print HTML "</pre>"; |
1602 | print HTML "</pre>"; |
1603 | print HTML2 "</pre>"; |
1603 | print HTML2 "</pre>"; |
1604 | ++$i; |
1604 | ++$i; |
1605 | next; |
1605 | next; |
1606 | } |
1606 | } |
1607 | 1607 | ||
1608 | # 12 2 1 3 4 43 |
1608 | # 12 2 1 3 4 43 |
1609 | if (/^<<ccode:((\S*):)?( (\w.*))?$/) { # C-style code verbatim listing |
1609 | if (/^<<ccode:((\S*):)?( (\w.*))?$/) { # C-style code verbatim listing |
1610 | @para = para(@para); |
1610 | @para = para(@para); |
1611 | print DBX qq(<programlisting format="code"><computeroutput><!\[CDATA\[); |
1611 | print DBX qq(<programlisting format="code"><computeroutput><!\[CDATA\[); |
1612 | print RTF qq({\\f2); |
1612 | print RTF qq({\\f2); |
1613 | print HTML qq(<pre>); |
1613 | print HTML qq(<pre>); |
1614 | print HTML2 qq(<pre>); |
1614 | print HTML2 qq(<pre>); |
1615 | 1615 | ||
1616 | print TEX qq(\\begin{lstlisting}); |
1616 | print TEX qq(\\begin{lstlisting}); |
1617 | unindented_code($2, $4); |
1617 | unindented_code($2, $4); |
1618 | print TEX qq(\\end{lstlisting}\n); |
1618 | print TEX qq(\\end{lstlisting}\n); |
1619 | 1619 | ||
1620 | print DBX qq(\]\]></computeroutput></programlisting>); |
1620 | print DBX qq(\]\]></computeroutput></programlisting>); |
1621 | print RTF qq(}); |
1621 | print RTF qq(}); |
1622 | print HTML "</pre>"; |
1622 | print HTML "</pre>"; |
1623 | print HTML2 "</pre>"; |
1623 | print HTML2 "</pre>"; |
1624 | ++$i; |
1624 | ++$i; |
1625 | next; |
1625 | next; |
1626 | } |
1626 | } |
1627 | 1627 | ||
1628 | # 12 2 1 3 4 43 |
1628 | # 12 2 1 3 4 43 |
1629 | if (/^<<console:((\S*):)?( (\w.*))?$/) { # console output verbatim listing |
1629 | if (/^<<console:((\S*):)?( (\w.*))?$/) { # console output verbatim listing |
1630 | @para = para(@para); |
1630 | @para = para(@para); |
1631 | print DBX qq(<programlisting format="code"><computeroutput><!\[CDATA\[); |
1631 | print DBX qq(<programlisting format="code"><computeroutput><!\[CDATA\[); |
1632 | print RTF qq({\\f2); |
1632 | print RTF qq({\\f2); |
1633 | print HTML qq(<pre>); |
1633 | print HTML qq(<pre>); |
1634 | print HTML2 qq(<pre>); |
1634 | print HTML2 qq(<pre>); |
1635 | 1635 | ||
1636 | print TEX qq(\\begin{lstlisting}); |
1636 | print TEX qq(\\begin{lstlisting}); |
1637 | unindented_code($2, $4); |
1637 | unindented_code($2, $4); |
1638 | print TEX qq(\\end{lstlisting}\n); |
1638 | print TEX qq(\\end{lstlisting}\n); |
1639 | 1639 | ||
1640 | print DBX qq(\]\]></computeroutput></programlisting>); |
1640 | print DBX qq(\]\]></computeroutput></programlisting>); |
1641 | print RTF qq(}); |
1641 | print RTF qq(}); |
1642 | print HTML "</pre>"; |
1642 | print HTML "</pre>"; |
1643 | print HTML2 "</pre>"; |
1643 | print HTML2 "</pre>"; |
1644 | ++$i; |
1644 | ++$i; |
1645 | next; |
1645 | next; |
1646 | } |
1646 | } |
1647 | 1647 | ||
1648 | # 12 2 1 3 4 43 |
1648 | # 12 2 1 3 4 43 |
1649 | if (/^<<diffout:((\S*):)?( (\w.*))?$/) { # diff outoput verbatim listing |
1649 | if (/^<<diffout:((\S*):)?( (\w.*))?$/) { # diff outoput verbatim listing |
1650 | @para = para(@para); |
1650 | @para = para(@para); |
1651 | print DBX qq(<programlisting format="code"><computeroutput><!\[CDATA\[); |
1651 | print DBX qq(<programlisting format="code"><computeroutput><!\[CDATA\[); |
1652 | print RTF qq({\\f2); |
1652 | print RTF qq({\\f2); |
1653 | print HTML qq(<pre>); |
1653 | print HTML qq(<pre>); |
1654 | print HTML2 qq(<pre>); |
1654 | print HTML2 qq(<pre>); |
1655 | 1655 | ||
1656 | print TEX qq(\\begin{lstlisting}); |
1656 | print TEX qq(\\begin{lstlisting}); |
1657 | unindented_code($2, $4); |
1657 | unindented_code($2, $4); |
1658 | print TEX qq(\\end{lstlisting}\n); |
1658 | print TEX qq(\\end{lstlisting}\n); |
1659 | 1659 | ||
1660 | print DBX qq(\]\]></computeroutput></programlisting>); |
1660 | print DBX qq(\]\]></computeroutput></programlisting>); |
1661 | print RTF qq(}); |
1661 | print RTF qq(}); |
1662 | print HTML "</pre>"; |
1662 | print HTML "</pre>"; |
1663 | print HTML2 "</pre>"; |
1663 | print HTML2 "</pre>"; |
1664 | ++$i; |
1664 | ++$i; |
1665 | next; |
1665 | next; |
1666 | } |
1666 | } |
1667 | 1667 | ||
1668 | # 12 2 1 3 4 43 |
1668 | # 12 2 1 3 4 43 |
1669 | if (/^<<email:((\S*):)?( (\w.*))?$/) { # email, bug tracker, or wiki post verbatim |
1669 | if (/^<<email:((\S*):)?( (\w.*))?$/) { # email, bug tracker, or wiki post verbatim |
1670 | @para = para(@para); |
1670 | @para = para(@para); |
1671 | print DBX qq(<programlisting format="code"><computeroutput><!\[CDATA\[); |
1671 | print DBX qq(<programlisting format="code"><computeroutput><!\[CDATA\[); |
1672 | print RTF qq({\\f2); |
1672 | print RTF qq({\\f2); |
1673 | print HTML qq(<pre>); |
1673 | print HTML qq(<pre>); |
1674 | print HTML2 qq(<pre>); |
1674 | print HTML2 qq(<pre>); |
1675 | 1675 | ||
1676 | print TEX qq(\\begin{verbatim}); |
1676 | print TEX qq(\\begin{verbatim}); |
1677 | unindented_code($2, $4); |
1677 | unindented_code($2, $4); |
1678 | print TEX qq(\\end{verbatim}\n); |
1678 | print TEX qq(\\end{verbatim}\n); |
1679 | 1679 | ||
1680 | print DBX qq(\]\]></computeroutput></programlisting>); |
1680 | print DBX qq(\]\]></computeroutput></programlisting>); |
1681 | print RTF qq(}); |
1681 | print RTF qq(}); |
1682 | print HTML "</pre>"; |
1682 | print HTML "</pre>"; |
1683 | print HTML2 "</pre>"; |
1683 | print HTML2 "</pre>"; |
1684 | ++$i; |
1684 | ++$i; |
1685 | next; |
1685 | next; |
1686 | } |
1686 | } |
1687 | 1687 | ||
1688 | # 12 2 1 3 4 43 |
1688 | # 12 2 1 3 4 43 |
1689 | if (/^<<logoutput:((\S*):)?( (\w.*))?$/) { # logoutput verbatim listing |
1689 | if (/^<<logoutput:((\S*):)?( (\w.*))?$/) { # logoutput verbatim listing |
1690 | @para = para(@para); |
1690 | @para = para(@para); |
1691 | print DBX qq(<programlisting format="logoutput"><computeroutput><!\[CDATA\[); |
1691 | print DBX qq(<programlisting format="logoutput"><computeroutput><!\[CDATA\[); |
1692 | print RTF qq({\\f2); |
1692 | print RTF qq({\\f2); |
1693 | print HTML qq(<pre>); |
1693 | print HTML qq(<pre>); |
1694 | print HTML2 qq(<pre>); |
1694 | print HTML2 qq(<pre>); |
1695 | print TEX qq(\\begin{verbatim}); |
1695 | print TEX qq(\\begin{verbatim}); |
1696 | unindented_code($2, $4); |
1696 | unindented_code($2, $4); |
1697 | print TEX qq(\\end{verbatim}\n); |
1697 | print TEX qq(\\end{verbatim}\n); |
1698 | print DBX qq(\]\]></computeroutput></programlisting>); |
1698 | print DBX qq(\]\]></computeroutput></programlisting>); |
1699 | print RTF qq(}); |
1699 | print RTF qq(}); |
1700 | print HTML "</pre>"; |
1700 | print HTML "</pre>"; |
1701 | print HTML2 "</pre>"; |
1701 | print HTML2 "</pre>"; |
1702 | ++$i; |
1702 | ++$i; |
1703 | next; |
1703 | next; |
1704 | } |
1704 | } |
1705 | 1705 | ||
1706 | if (/^<<newpage:.*?>>\s*$/) { |
1706 | if (/^<<newpage:.*?>>\s*$/) { |
1707 | @para = para(@para); |
1707 | @para = para(@para); |
1708 | if ($class eq 'slide') { |
1708 | if ($class eq 'slide') { |
1709 | print DBX "\n<!--newpage-->\n"; |
1709 | print DBX "\n<!--newpage-->\n"; |
1710 | print NONL "\n\n"; |
1710 | print NONL "\n\n"; |
1711 | print PDSEAL "\n\n"; |
1711 | print PDSEAL "\n\n"; |
1712 | print RTF "\n\\page\n"; |
1712 | print RTF "\n\\page\n"; |
1713 | #print HTML "\n<hr><!--newpage-->\n"; |
1713 | #print HTML "\n<hr><!--newpage-->\n"; |
1714 | #print HTML2 "\n<hr><!--newpage-->\n"; |
1714 | #print HTML2 "\n<hr><!--newpage-->\n"; |
1715 | print HTML "\n<!--newpage-->\n"; |
1715 | print HTML "\n<!--newpage-->\n"; |
1716 | print HTML2 "\n<!--newpage-->\n"; |
1716 | print HTML2 "\n<!--newpage-->\n"; |
1717 | print TEX "\n\\end{slide}\n\n\\begin{slide}\n"; |
1717 | print TEX "\n\\end{slide}\n\n\\begin{slide}\n"; |
1718 | } else { |
1718 | } else { |
1719 | print DBX "\n<!--newpage-->\n"; |
1719 | print DBX "\n<!--newpage-->\n"; |
1720 | print NONL "\n\n"; |
1720 | print NONL "\n\n"; |
1721 | print PDSEAL "\n\n"; |
1721 | print PDSEAL "\n\n"; |
1722 | print RTF "\n\\page\n"; |
1722 | print RTF "\n\\page\n"; |
1723 | #print HTML "\n<hr><!--newpage-->\n"; |
1723 | #print HTML "\n<hr><!--newpage-->\n"; |
1724 | #print HTML2 "\n<hr><!--newpage-->\n"; |
1724 | #print HTML2 "\n<hr><!--newpage-->\n"; |
1725 | print HTML "\n<!--newpage-->\n"; |
1725 | print HTML "\n<!--newpage-->\n"; |
1726 | print HTML2 "\n<!--newpage-->\n"; |
1726 | print HTML2 "\n<!--newpage-->\n"; |
1727 | print TEX "\n\\clearpage\n"; |
1727 | print TEX "\n\\clearpage\n"; |
1728 | } |
1728 | } |
1729 | warn "newpage done" if $trace; |
1729 | warn "newpage done" if $trace; |
1730 | ++$i; |
1730 | ++$i; |
1731 | next; |
1731 | next; |
1732 | } |
1732 | } |
1733 | 1733 | ||
1734 | if (/^<<closesec:.*?>>\s*$/) { |
1734 | if (/^<<closesec:.*?>>\s*$/) { |
1735 | @para = para(@para); |
1735 | @para = para(@para); |
1736 | close_dbx_sections(); |
1736 | close_dbx_sections(); |
1737 | warn "closesec done" if $trace; |
1737 | warn "closesec done" if $trace; |
1738 | ++$i; |
1738 | ++$i; |
1739 | next; |
1739 | next; |
1740 | } |
1740 | } |
1741 | 1741 | ||
1742 | if (/<<eqn:(.*?):(.*?)>>/) { # direct TeX code for an equation (fjon) |
1742 | if (/<<eqn:(.*?):(.*?)>>/) { # direct TeX code for an equation (fjon) |
1743 | @para = para(@para); |
1743 | @para = para(@para); |
1744 | plot_eqn($1, $2, ++$eq_nr); |
1744 | plot_eqn($1, $2, ++$eq_nr); |
1745 | ++$i; |
1745 | ++$i; |
1746 | warn "eqn done" if $trace; |
1746 | warn "eqn done" if $trace; |
1747 | next; |
1747 | next; |
1748 | } |
1748 | } |
1749 | if (/<<eqn:(.*?)>>/) { # direct TeX code for an equation |
1749 | if (/<<eqn:(.*?)>>/) { # direct TeX code for an equation |
1750 | @para = para(@para); |
1750 | @para = para(@para); |
1751 | ++$eq_nr; |
1751 | ++$eq_nr; |
1752 | plot_eqn($1, $eq_nr, $eq_nr); |
1752 | plot_eqn($1, $eq_nr, $eq_nr); |
1753 | #print TEX "\\begin{equation}$1\\end{equation}" if $1; |
1753 | #print TEX "\\begin{equation}$1\\end{equation}" if $1; |
1754 | ++$i; |
1754 | ++$i; |
1755 | warn "eqn done" if $trace; |
1755 | warn "eqn done" if $trace; |
1756 | next; |
1756 | next; |
1757 | } |
1757 | } |
1758 | if (/^<<eqn:( (.*?))?$/) { # direct TeX code for an equation |
1758 | if (/^<<eqn:( (.*?))?$/) { # direct TeX code for an equation |
1759 | @para = para(@para); |
1759 | @para = para(@para); |
1760 | ++$eq_nr; |
1760 | ++$eq_nr; |
1761 | print TEX "\\begin{equation}"; |
1761 | print TEX "\\begin{equation}"; |
1762 | print TEX $2 if $2; |
1762 | print TEX $2 if $2; |
1763 | for (++$i; $pd[$i] !~ /^>>/; ++$i) { |
1763 | for (++$i; $pd[$i] !~ /^>>/; ++$i) { |
1764 | print TEX $pd[$i]."\n"; |
1764 | print TEX $pd[$i]."\n"; |
1765 | } |
1765 | } |
1766 | print TEX "\\end{equation}"; |
1766 | print TEX "\\end{equation}"; |
1767 | ++$i; |
1767 | ++$i; |
1768 | warn "eqn done" if $trace; |
1768 | warn "eqn done" if $trace; |
1769 | next; |
1769 | next; |
1770 | } |
1770 | } |
1771 | 1771 | ||
1772 | if (/<<comment:(.*?)>>/) { # Backend comment pass-thru |
1772 | if (/<<comment:(.*?)>>/) { # Backend comment pass-thru |
1773 | @para = para(@para); |
1773 | @para = para(@para); |
1774 | #warn "=========== comment one($1)"; |
1774 | #warn "=========== comment one($1)"; |
1775 | print TEX "% $1\n"; |
1775 | print TEX "% $1\n"; |
1776 | print NONL "# $1\n"; |
1776 | print NONL "# $1\n"; |
1777 | #print PDSEAL ""; |
1777 | #print PDSEAL ""; |
1778 | print RTF "<!-- $1 -->\n"; |
1778 | print RTF "<!-- $1 -->\n"; |
1779 | print DBX "<!-- $1 -->\n"; |
1779 | print DBX "<!-- $1 -->\n"; |
1780 | print HTML "<!-- $1 -->\n"; |
1780 | print HTML "<!-- $1 -->\n"; |
1781 | print HTML2 "<!-- $1 -->\n"; |
1781 | print HTML2 "<!-- $1 -->\n"; |
1782 | ++$i; |
1782 | ++$i; |
1783 | warn "comment done" if $trace; |
1783 | warn "comment done" if $trace; |
1784 | next; |
1784 | next; |
1785 | } |
1785 | } |
1786 | if (/^<<comment:(.*?)$/) { # Backend comment pass-thru |
1786 | if (/^<<comment:(.*?)$/) { # Backend comment pass-thru |
1787 | warn "comment start i=$i ($pd[$i])" if $trace; |
1787 | warn "comment start i=$i ($pd[$i])" if $trace; |
1788 | @para = para(@para); |
1788 | @para = para(@para); |
1789 | #warn "=========== comment two($2)"; |
1789 | #warn "=========== comment two($2)"; |
1790 | print TEX "% $1\n"; |
1790 | print TEX "% $1\n"; |
1791 | print NONL "# $1\n"; |
1791 | print NONL "# $1\n"; |
1792 | #print PDSEAL ""; |
1792 | #print PDSEAL ""; |
1793 | print RTF "<!-- $1\n"; |
1793 | print RTF "<!-- $1\n"; |
1794 | print DBX "<!-- $1\n"; |
1794 | print DBX "<!-- $1\n"; |
1795 | print HTML "<!-- $1\n"; |
1795 | print HTML "<!-- $1\n"; |
1796 | print HTML2 "<!-- $1\n"; |
1796 | print HTML2 "<!-- $1\n"; |
1797 | for (++$i; $pd[$i] !~ /^>>/; ++$i) { |
1797 | for (++$i; $pd[$i] !~ /^>>/; ++$i) { |
1798 | #warn "=========== comment two bis($pd[$i])"; |
1798 | #warn "=========== comment two bis($pd[$i])"; |
1799 | print TEX "% $pd[$i]\n"; |
1799 | print TEX "% $pd[$i]\n"; |
1800 | print NONL "# $pd[$i]\n"; |
1800 | print NONL "# $pd[$i]\n"; |
1801 | #print PDSEAL ""; |
1801 | #print PDSEAL ""; |
1802 | print RTF $pd[$i]."\n"; |
1802 | print RTF $pd[$i]."\n"; |
1803 | print DBX $pd[$i]."\n"; |
1803 | print DBX $pd[$i]."\n"; |
1804 | print HTML $pd[$i]."\n"; |
1804 | print HTML $pd[$i]."\n"; |
1805 | print HTML2 $pd[$i]."\n"; |
1805 | print HTML2 $pd[$i]."\n"; |
1806 | } |
1806 | } |
1807 | if ($pd[$i] =~ /^>>/) { |
1807 | if ($pd[$i] =~ /^>>/) { |
1808 | print RTF "-->\n"; |
1808 | print RTF "-->\n"; |
1809 | print DBX "-->\n"; |
1809 | print DBX "-->\n"; |
1810 | print HTML "-->\n"; |
1810 | print HTML "-->\n"; |
1811 | print HTML2 "-->\n"; |
1811 | print HTML2 "-->\n"; |
1812 | } |
1812 | } |
1813 | ++$i; |
1813 | ++$i; |
1814 | warn "comment done i=$i ($pd[$i])" if $trace; |
1814 | warn "comment done i=$i ($pd[$i])" if $trace; |
1815 | next; |
1815 | next; |
1816 | } |
1816 | } |
1817 | 1817 | ||
1818 | # 1 2 3 4 5 6 7 8 |
1818 | # 1 2 3 4 5 6 7 8 |
1819 | # <<feedback:0!7!20081107-2259!idtype!identifier!remote addr!user agent! Title>> body... <<endfeedback: >> |
1819 | # <<feedback:0!7!20081107-2259!idtype!identifier!remote addr!user agent! Title>> body... <<endfeedback: >> |
1820 | # 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 |
1820 | # 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 |
1821 | if (/<<feedback:(\w+)!(\w+)!([^!]+)!([^!]*)!([^!]*)!([^!]*)!([^!]*)!\s*(.*?)\s*>>/) { # Blog feedback |
1821 | if (/<<feedback:(\w+)!(\w+)!([^!]+)!([^!]*)!([^!]*)!([^!]*)!([^!]*)!\s*(.*?)\s*>>/) { # Blog feedback |
1822 | @para = para(@para); |
1822 | @para = para(@para); |
1823 | warn "=========== feedback($1,$2,$3,$4,$5,$6,$7,$8)"; |
1823 | warn "=========== feedback($1,$2,$3,$4,$5,$6,$7,$8)"; |
1824 | if ($1 eq '1') { |
1824 | if ($1 eq '1') { |
1825 | print TEX "% feedback: $1 $2 $3 $4 $5 $6 $7 $8\n"; |
1825 | print TEX "% feedback: $1 $2 $3 $4 $5 $6 $7 $8\n"; |
1826 | print NONL "# feedback: $1 $2 $3 $4 $5 $6 $7 $8\n"; |
1826 | print NONL "# feedback: $1 $2 $3 $4 $5 $6 $7 $8\n"; |
1827 | #print PDSEAL ""; |
1827 | #print PDSEAL ""; |
1828 | print RTF "<!-- feedback: $1 $2 $3 $4 $5 $6 $7 $8 -->\n"; |
1828 | print RTF "<!-- feedback: $1 $2 $3 $4 $5 $6 $7 $8 -->\n"; |
1829 | print DBX "<!-- feedback: $1 $2 $3 $4 $5 $6 $7 $8 -->\n"; |
1829 | print DBX "<!-- feedback: $1 $2 $3 $4 $5 $6 $7 $8 -->\n"; |
1830 | my $fb_class = ($2 && ($2 & 0x01)) ? 'pdblogfbo' : 'pdblogfb'; |
1830 | my $fb_class = ($2 && ($2 & 0x01)) ? 'pdblogfbo' : 'pdblogfb'; |
1831 | my $num = $2 ? "#$2" : ''; |
1831 | my $num = $2 ? "#$2" : ''; |
1832 | my $fb_html = <<HTML; |
1832 | my $fb_html = <<HTML; |
1833 | <p> |
1833 | <p> |
1834 | <table class=$fb_class> |
1834 | <table class=$fb_class> |
1835 | <tr><th class=$fb_class> |
1835 | <tr><th class=$fb_class> |
1836 | <b class=${fb_class}t>$8</b><br class=${fb_class}t><i class=${fb_class}ts>$3, by $5</i> |
1836 | <b class=${fb_class}t>$8</b><br class=${fb_class}t><i class=${fb_class}ts>$3, by $5</i> |
1837 | </th><th class=${fb_class}num>$num</th></tr><tr><td class=$fb_class colspan=2> |
1837 | </th><th class=${fb_class}num>$num</th></tr><tr><td class=$fb_class colspan=2> |
1838 | <p class=$fb_class> |
1838 | <p class=$fb_class> |
1839 | HTML |
1839 | HTML |
1840 | ; |
1840 | ; |
1841 | print HTML $fb_html; |
1841 | print HTML $fb_html; |
1842 | print HTML2 $fb_html; |
1842 | print HTML2 $fb_html; |
1843 | #print HTML qq(<hr class=pdblogfb><b class=pdblogfbt>$8</b><br class=pdblogfbt><i class=pdblogfbts>$3, by $5</i><p class=pdblogfb>); |
1843 | #print HTML qq(<hr class=pdblogfb><b class=pdblogfbt>$8</b><br class=pdblogfbt><i class=pdblogfbts>$3, by $5</i><p class=pdblogfb>); |
1844 | #print HTML2 qq(<hr class=pdblogfb><b class=pdblogfbt>$8</b><br class=pdblogfbt><i class=pdblogfbts>$3, by $5</i><p class=pdblogfb>); |
1844 | #print HTML2 qq(<hr class=pdblogfb><b class=pdblogfbt>$8</b><br class=pdblogfbt><i class=pdblogfbts>$3, by $5</i><p class=pdblogfb>); |
1845 | ++$i; |
1845 | ++$i; |
1846 | warn "tex done" if $trace; |
1846 | warn "tex done" if $trace; |
1847 | } else { |
1847 | } else { |
1848 | for (++$i; $pd[$i] !~ /<<endfeedback:/; ++$i) { |
1848 | for (++$i; $pd[$i] !~ /<<endfeedback:/; ++$i) { |
1849 | #warn "hidden feedback($pd[$i])"; |
1849 | #warn "hidden feedback($pd[$i])"; |
1850 | } |
1850 | } |
1851 | } |
1851 | } |
1852 | next; |
1852 | next; |
1853 | } |
1853 | } |
1854 | if (/<<endfeedback:.*?>>/) { # Close feedback block |
1854 | if (/<<endfeedback:.*?>>/) { # Close feedback block |
1855 | @para = para(@para); |
1855 | @para = para(@para); |
1856 | warn "=========== endfeedback"; |
1856 | warn "=========== endfeedback"; |
1857 | print HTML "</td></tr></table>\n\n"; |
1857 | print HTML "</td></tr></table>\n\n"; |
1858 | print HTML2 "</td></tr></table>\n\n"; |
1858 | print HTML2 "</td></tr></table>\n\n"; |
1859 | ++$i; |
1859 | ++$i; |
1860 | next; |
1860 | next; |
1861 | } |
1861 | } |
1862 | 1862 | ||
1863 | if (/<<multicolstart:\s*(.*?)>>/) { # Open Multicolumn block |
1863 | if (/<<multicolstart:\s*(.*?)>>/) { # Open Multicolumn block |
1864 | @para = para(@para); |
1864 | @para = para(@para); |
1865 | my $wid = $1 || '70mm'; |
1865 | my $wid = $1 || '70mm'; |
1866 | print TEX "\\parbox[t]{$wid}{"; |
1866 | print TEX "\\parbox[t]{$wid}{"; |
1867 | print NONL "<!-- multicolstart($wid) -->\n"; |
1867 | print NONL "<!-- multicolstart($wid) -->\n"; |
1868 | #print PDSEAL ""; |
1868 | #print PDSEAL ""; |
1869 | print RTF "<!-- multicolstart($wid) -->\n"; |
1869 | print RTF "<!-- multicolstart($wid) -->\n"; |
1870 | print DBX "<!-- multicolstart($wid) -->\n"; |
1870 | print DBX "<!-- multicolstart($wid) -->\n"; |
1871 | print HTML "<table><tr><td>\n"; |
1871 | print HTML "<table><tr><td>\n"; |
1872 | print HTML2 "<table><tr><td>\n"; |
1872 | print HTML2 "<table><tr><td>\n"; |
1873 | ++$i; |
1873 | ++$i; |
1874 | warn "mc1 done" if $trace; |
1874 | warn "mc1 done" if $trace; |
1875 | next; |
1875 | next; |
1876 | } |
1876 | } |
1877 | 1877 | ||
1878 | if (/<<multicolnext:\s*(.*?)(,(.*?))?>>/) { # close prev, start next col |
1878 | if (/<<multicolnext:\s*(.*?)(,(.*?))?>>/) { # close prev, start next col |
1879 | @para = para(@para); |
1879 | @para = para(@para); |
1880 | my $wid = $1 || '70mm'; |
1880 | my $wid = $1 || '70mm'; |
1881 | my $sepwid = $3 || '5mm'; |
1881 | my $sepwid = $3 || '5mm'; |
1882 | print TEX "}\\rule{$sepwid}{0mm}\\parbox[t]{$wid}{"; |
1882 | print TEX "}\\rule{$sepwid}{0mm}\\parbox[t]{$wid}{"; |
1883 | print NONL "<!-- multicolnext($wid) -->\n"; |
1883 | print NONL "<!-- multicolnext($wid) -->\n"; |
1884 | #print PDSEAL ""; |
1884 | #print PDSEAL ""; |
1885 | print RTF "<!-- multicolnext($wid) -->\n"; |
1885 | print RTF "<!-- multicolnext($wid) -->\n"; |
1886 | print DBX "<!-- multicolnext($wid) -->\n"; |
1886 | print DBX "<!-- multicolnext($wid) -->\n"; |
1887 | print HTML "</td><td>\n"; |
1887 | print HTML "</td><td>\n"; |
1888 | print HTML2 "</td><td>\n"; |
1888 | print HTML2 "</td><td>\n"; |
1889 | ++$i; |
1889 | ++$i; |
1890 | warn "mc1 done" if $trace; |
1890 | warn "mc1 done" if $trace; |
1891 | next; |
1891 | next; |
1892 | } |
1892 | } |
1893 | 1893 | ||
1894 | if (/<<multicolend:\s*>>/) { # Close Multicolumn block |
1894 | if (/<<multicolend:\s*>>/) { # Close Multicolumn block |
1895 | @para = para(@para); |
1895 | @para = para(@para); |
1896 | print TEX "}\n"; |
1896 | print TEX "}\n"; |
1897 | print NONL "<!-- multicolend() -->\n"; |
1897 | print NONL "<!-- multicolend() -->\n"; |
1898 | #print PDSEAL ""; |
1898 | #print PDSEAL ""; |
1899 | print RTF "<!-- multicolend() -->\n"; |
1899 | print RTF "<!-- multicolend() -->\n"; |
1900 | print DBX "<!-- multicolend() -->\n"; |
1900 | print DBX "<!-- multicolend() -->\n"; |
1901 | print HTML "</td></tr></table>\n\n"; |
1901 | print HTML "</td></tr></table>\n\n"; |
1902 | print HTML2 "</td></tr></table>\n\n"; |
1902 | print HTML2 "</td></tr></table>\n\n"; |
1903 | ++$i; |
1903 | ++$i; |
1904 | warn "mc1 done" if $trace; |
1904 | warn "mc1 done" if $trace; |
1905 | next; |
1905 | next; |
1906 | } |
1906 | } |
1907 | 1907 | ||
1908 | if (/<<tex:(.*?)>>/) { # direct TeX code |
1908 | if (/<<tex:(.*?)>>/) { # direct TeX code |
1909 | @para = para(@para); |
1909 | @para = para(@para); |
1910 | #warn "=========== tex one($1)"; |
1910 | #warn "=========== tex one($1)"; |
1911 | print TEX $1 if $1; |
1911 | print TEX $1 if $1; |
1912 | ++$i; |
1912 | ++$i; |
1913 | warn "tex done" if $trace; |
1913 | warn "tex done" if $trace; |
1914 | next; |
1914 | next; |
1915 | } |
1915 | } |
1916 | if (/^<<tex:(.*?)$/) { # direct TeX code |
1916 | if (/^<<tex:(.*?)$/) { # direct TeX code |
1917 | warn "tex start i=$i ($pd[$i])" if $trace; |
1917 | warn "tex start i=$i ($pd[$i])" if $trace; |
1918 | @para = para(@para); |
1918 | @para = para(@para); |
1919 | #warn "=========== tex two($2)"; |
1919 | #warn "=========== tex two($2)"; |
1920 | print TEX $1 if $1; |
1920 | print TEX $1 if $1; |
1921 | for (++$i; $pd[$i] !~ /^>>/; ++$i) { |
1921 | for (++$i; $pd[$i] !~ /^>>/; ++$i) { |
1922 | #warn "=========== tex two bis($pd[$i])"; |
1922 | #warn "=========== tex two bis($pd[$i])"; |
1923 | print TEX $pd[$i]."\n"; |
1923 | print TEX $pd[$i]."\n"; |
1924 | } |
1924 | } |
1925 | ++$i; |
1925 | ++$i; |
1926 | warn "tex done i=$i ($pd[$i])" if $trace; |
1926 | warn "tex done i=$i ($pd[$i])" if $trace; |
1927 | next; |
1927 | next; |
1928 | } |
1928 | } |
1929 | 1929 | ||
1930 | if (/^<<dbx:\s*(.*)$/) { # direct DocBook code |
1930 | if (/^<<dbx:\s*(.*)$/) { # direct DocBook code |
1931 | @para = para(@para); |
1931 | @para = para(@para); |
1932 | #warn "Entering dbx($1)"; |
1932 | #warn "Entering dbx($1)"; |
1933 | print DBX $1 if $1; |
1933 | print DBX $1 if $1; |
1934 | for (++$i; $pd[$i] !~ /^>>/; ++$i) { |
1934 | for (++$i; $pd[$i] !~ /^>>/; ++$i) { |
1935 | #warn "dbx i=$i ($pd[$i])"; |
1935 | #warn "dbx i=$i ($pd[$i])"; |
1936 | print DBX $pd[$i]."\n"; |
1936 | print DBX $pd[$i]."\n"; |
1937 | } |
1937 | } |
1938 | ++$i; |
1938 | ++$i; |
1939 | warn "dbx done" if $trace; |
1939 | warn "dbx done" if $trace; |
1940 | next; |
1940 | next; |
1941 | } |
1941 | } |
1942 | 1942 | ||
1943 | if (/^<<rtf:\s*(.*)$/) { # direct RTF code |
1943 | if (/^<<rtf:\s*(.*)$/) { # direct RTF code |
1944 | @para = para(@para); |
1944 | @para = para(@para); |
1945 | #warn "Entering dbx($1)"; |
1945 | #warn "Entering dbx($1)"; |
1946 | print RTF $1 if $1; |
1946 | print RTF $1 if $1; |
1947 | for (++$i; $pd[$i] !~ /^>>/; ++$i) { |
1947 | for (++$i; $pd[$i] !~ /^>>/; ++$i) { |
1948 | #warn "rtf i=$i ($pd[$i])"; |
1948 | #warn "rtf i=$i ($pd[$i])"; |
1949 | print RTF $pd[$i]."\n"; |
1949 | print RTF $pd[$i]."\n"; |
1950 | } |
1950 | } |
1951 | ++$i; |
1951 | ++$i; |
1952 | warn "rtf done" if $trace; |
1952 | warn "rtf done" if $trace; |
1953 | next; |
1953 | next; |
1954 | } |
1954 | } |
1955 | 1955 | ||
1956 | if (/^<<odt:\s*(.*)$/) { # direct ODT code |
1956 | if (/^<<odt:\s*(.*)$/) { # direct ODT code |
1957 | @para = para(@para); |
1957 | @para = para(@para); |
1958 | #warn "Entering dbx($1)"; |
1958 | #warn "Entering dbx($1)"; |
1959 | print ODT $1 if $1; |
1959 | print ODT $1 if $1; |
1960 | for (++$i; $pd[$i] !~ /^>>/; ++$i) { |
1960 | for (++$i; $pd[$i] !~ /^>>/; ++$i) { |
1961 | #warn "rtf i=$i ($pd[$i])"; |
1961 | #warn "rtf i=$i ($pd[$i])"; |
1962 | print ODT $pd[$i]."\n"; |
1962 | print ODT $pd[$i]."\n"; |
1963 | } |
1963 | } |
1964 | ++$i; |
1964 | ++$i; |
1965 | warn "odt done" if $trace; |
1965 | warn "odt done" if $trace; |
1966 | next; |
1966 | next; |
1967 | } |
1967 | } |
1968 | 1968 | ||
1969 | if (/^<<html:\s*(.*)$/) { # direct HTML code |
1969 | if (/^<<html:\s*(.*)$/) { # direct HTML code |
1970 | @para = para(@para); |
1970 | @para = para(@para); |
1971 | print HTML $2 if $1; |
1971 | print HTML $2 if $1; |
1972 | print HTML2 $2 if $1; |
1972 | print HTML2 $2 if $1; |
1973 | for (++$i; $pd[$i] !~ /^>>/; ++$i) { |
1973 | for (++$i; $pd[$i] !~ /^>>/; ++$i) { |
1974 | print HTML $pd[$i]."\n"; |
1974 | print HTML $pd[$i]."\n"; |
1975 | print HTML2 $pd[$i]."\n"; |
1975 | print HTML2 $pd[$i]."\n"; |
1976 | } |
1976 | } |
1977 | ++$i; |
1977 | ++$i; |
1978 | warn "html done" if $trace; |
1978 | warn "html done" if $trace; |
1979 | next; |
1979 | next; |
1980 | } |
1980 | } |
1981 | 1981 | ||
1982 | if (/<<cvssig:(.*?)>>/) { |
1982 | if (/<<cvssig:(.*?)>>/) { |
1983 | @para = para(@para); |
1983 | @para = para(@para); |
1984 | open BZ, "|bzip2 -9>cvssig" or die "cvssig tag failed to invoke bzip2: $!"; |
1984 | open BZ, "|bzip2 -9>cvssig" or die "cvssig tag failed to invoke bzip2: $!"; |
1985 | #print BZ $1; |
1985 | #print BZ $1; |
1986 | print BZ $cvsid; |
1986 | print BZ $cvsid; |
1987 | close BZ; |
1987 | close BZ; |
1988 | $cvssig = ''; |
1988 | $cvssig = ''; |
1989 | $cvssigraw = readall('cvssig'); |
1989 | $cvssigraw = readall('cvssig'); |
1990 | $cvssigraw =~ s/(.)(.)(.)/$cvssig.=b64enc($1,$2,$3),''/ges; |
1990 | $cvssigraw =~ s/(.)(.)(.)/$cvssig.=b64enc($1,$2,$3),''/ges; |
1991 | $cvssigraw =~ s/(.)/sprintf("%02x",ord($1))/ges; # last 0, 1, or 2 bytes |
1991 | $cvssigraw =~ s/(.)/sprintf("%02x",ord($1))/ges; # last 0, 1, or 2 bytes |
1992 | $cvssig =~ s/(.{64})/$1\n/g; # line wrap to 64 cols |
1992 | $cvssig =~ s/(.{64})/$1\n/g; # line wrap to 64 cols |
1993 | print DBX "$cvssig=$cvssigraw"; |
1993 | print DBX "$cvssig=$cvssigraw"; |
1994 | print NONL "$cvssig=$cvssigraw"; |
1994 | print NONL "$cvssig=$cvssigraw"; |
1995 | print PDSEAL "$cvssig=$cvssigraw"; |
1995 | print PDSEAL "$cvssig=$cvssigraw"; |
1996 | print RTF "$cvssig=$cvssigraw"; |
1996 | print RTF "$cvssig=$cvssigraw"; |
1997 | print HTML "$cvssig=$cvssigraw"; |
1997 | print HTML "$cvssig=$cvssigraw"; |
1998 | print HTML2 "$cvssig=$cvssigraw"; |
1998 | print HTML2 "$cvssig=$cvssigraw"; |
1999 | print TEX "$cvssig=$cvssigraw"; |
1999 | print TEX "$cvssig=$cvssigraw"; |
2000 | ++$i; |
2000 | ++$i; |
2001 | warn "cvssig done" if $trace; |
2001 | warn "cvssig done" if $trace; |
2002 | next; |
2002 | next; |
2003 | } |
2003 | } |
2004 | 2004 | ||
2005 | if (/<<pdseal:\s*(.*?)>>/) { |
2005 | if (/<<pdseal:\s*(.*?)>>/) { |
2006 | $salt=$1; |
2006 | $salt=$1; |
2007 | @para = para(@para); |
2007 | @para = para(@para); |
2008 | close PDSEAL; |
2008 | close PDSEAL; |
2009 | $pdseal = readall("$texdir$base.seal"); |
2009 | $pdseal = readall("$texdir$base.seal"); |
2010 | $pdseal = pdseal1($pdseal); |
2010 | $pdseal = pdseal1($pdseal); |
2011 | writeall("$texdir$base.norm", $pdseal_norm); |
2011 | writeall("$texdir$base.norm", $pdseal_norm); |
2012 | print DBX $pdseal; |
2012 | print DBX $pdseal; |
2013 | print NONL $pdseal; |
2013 | print NONL $pdseal; |
2014 | print RTF $pdseal; |
2014 | print RTF $pdseal; |
2015 | print HTML $pdseal; |
2015 | print HTML $pdseal; |
2016 | print HTML2 $pdseal; |
2016 | print HTML2 $pdseal; |
2017 | print TEX $pdseal; |
2017 | print TEX $pdseal; |
2018 | ++$i; |
2018 | ++$i; |
2019 | warn "pdseal done" if $trace; |
2019 | warn "pdseal done" if $trace; |
2020 | next; |
2020 | next; |
2021 | } |
2021 | } |
2022 | 2022 | ||
2023 | ### Special segments for EDDA. Added by Fredrik Jonsson |
2023 | ### Special segments for EDDA. Added by Fredrik Jonsson |
2024 | 2024 | ||
2025 | # 1 1 2 3 32 |
2025 | # 1 1 2 3 32 |
2026 | if (/^<<desvar:\s*([\w.\/]*)\s*(:(.*))?>>/) { |
2026 | if (/^<<desvar:\s*([\w.\/]*)\s*(:(.*))?>>/) { |
2027 | desvar($1,$3); |
2027 | desvar($1,$3); |
2028 | ++$i; |
2028 | ++$i; |
2029 | next; |
2029 | next; |
2030 | } |
2030 | } |
2031 | if (/^<<plot:/) { |
2031 | if (/^<<plot:/) { |
2032 | plot_waves(); |
2032 | plot_waves(); |
2033 | next; |
2033 | next; |
2034 | } |
2034 | } |
2035 | if (/^<<data:/) { |
2035 | if (/^<<data:/) { |
2036 | print_data(); |
2036 | print_data(); |
2037 | next; |
2037 | next; |
2038 | } |
2038 | } |
2039 | if (/^<<sch:/) { |
2039 | if (/^<<sch:/) { |
2040 | plot_schematics(); |
2040 | plot_schematics(); |
2041 | next; |
2041 | next; |
2042 | } |
2042 | } |
2043 | 2043 | ||
2044 | if (/^<<logfile:\s*([\w.\/]*)\s*(:(.*))?>>/) { |
2044 | if (/^<<logfile:\s*([\w.\/]*)\s*(:(.*))?>>/) { |
2045 | print DBX qq(<programlisting format="schema"><computeroutput><!\[CDATA\[); |
2045 | print DBX qq(<programlisting format="schema"><computeroutput><!\[CDATA\[); |
2046 | print HTML qq(<pre>); |
2046 | print HTML qq(<pre>); |
2047 | print HTML2 qq(<pre>); |
2047 | print HTML2 qq(<pre>); |
2048 | print TEX qq(\\begin{Verbatim}[fontsize=\\small]\n); |
2048 | print TEX qq(\\begin{Verbatim}[fontsize=\\small]\n); |
2049 | #print TEX qq(\\begin{verbatim}\n); |
2049 | #print TEX qq(\\begin{verbatim}\n); |
2050 | 2050 | ||
2051 | if(-r $1){ |
2051 | if(-r $1){ |
2052 | $/ = "\n"; # Disable "slurp" mode |
2052 | $/ = "\n"; # Disable "slurp" mode |
2053 | open(LOGFILE,$1); |
2053 | open(LOGFILE,$1); |
2054 | while(<LOGFILE>){ |
2054 | while(<LOGFILE>){ |
2055 | print DBX dbx_entity_escape_lite($_); |
2055 | print DBX dbx_entity_escape_lite($_); |
2056 | my $x = $_; |
2056 | my $x = $_; |
2057 | while(length($x) > $maxlogline){ |
2057 | while(length($x) > $maxlogline){ |
2058 | my $xx = substr($x,0,$maxlogline); |
2058 | my $xx = substr($x,0,$maxlogline); |
2059 | print TEX tex_esc_verbatim($xx)."\n"; |
2059 | print TEX tex_esc_verbatim($xx)."\n"; |
2060 | print HTML $xx."\n"; |
2060 | print HTML $xx."\n"; |
2061 | print HTML2 $xx."\n"; |
2061 | print HTML2 $xx."\n"; |
2062 | $x = substr($x, $maxlogline, length($x)); |
2062 | $x = substr($x, $maxlogline, length($x)); |
2063 | } |
2063 | } |
2064 | print TEX tex_esc_verbatim($x); |
2064 | print TEX tex_esc_verbatim($x); |
2065 | print HTML $x; |
2065 | print HTML $x; |
2066 | print HTML2 $x; |
2066 | print HTML2 $x; |
2067 | } |
2067 | } |
2068 | close(LOGFILE); |
2068 | close(LOGFILE); |
2069 | undef $/; # Enable "slurp" mode again |
2069 | undef $/; # Enable "slurp" mode again |
2070 | } else { |
2070 | } else { |
2071 | warn("Unable to open $1"); |
2071 | warn("Unable to open $1"); |
2072 | print HTML "Missing file $1\n"; |
2072 | print HTML "Missing file $1\n"; |
2073 | print HTML2 "Missing file $1\n"; |
2073 | print HTML2 "Missing file $1\n"; |
2074 | print TEX "Missing file $1\n"; |
2074 | print TEX "Missing file $1\n"; |
2075 | } |
2075 | } |
2076 | 2076 | ||
2077 | print DBX qq(\]\]></computeroutput></programlisting>); |
2077 | print DBX qq(\]\]></computeroutput></programlisting>); |
2078 | print HTML "</pre>"; |
2078 | print HTML "</pre>"; |
2079 | print HTML2 "</pre>"; |
2079 | print HTML2 "</pre>"; |
2080 | print TEX qq(\n\\end{Verbatim}\n); |
2080 | print TEX qq(\n\\end{Verbatim}\n); |
2081 | #print TEX qq(\\end{verbatim}\n); |
2081 | #print TEX qq(\\end{verbatim}\n); |
2082 | ++$i; |
2082 | ++$i; |
2083 | next; |
2083 | next; |
2084 | } |
2084 | } |
2085 | 2085 | ||
2086 | if (($name) = /^<<ect:\s*(.*)?/) { |
2086 | if (($name) = /^<<ect:\s*(.*)?/) { |
2087 | @para = para(@para); |
2087 | @para = para(@para); |
2088 | $name = $base if !$name; |
2088 | $name = $base if !$name; |
2089 | open ECT, ">.pd/pd.lim" or die "Can't create temprary file .pd/pd.lim: $!"; |
2089 | open ECT, ">.pd/pd.lim" or die "Can't create temprary file .pd/pd.lim: $!"; |
2090 | warn "Writing .pd/pd.lim"; |
2090 | warn "Writing .pd/pd.lim"; |
2091 | ++$i; |
2091 | ++$i; |
2092 | for (; $pd[$i] !~ /^>>/; ++$i) { |
2092 | for (; $pd[$i] !~ /^>>/; ++$i) { |
2093 | print ECT $pd[$i]."\n"; |
2093 | print ECT $pd[$i]."\n"; |
2094 | } |
2094 | } |
2095 | close ECT; |
2095 | close ECT; |
2096 | system_cmd('pd_data'); # What command? Where? --Sampo |
2096 | system_cmd('pd_data'); # What command? Where? --Sampo |
2097 | 2097 | ||
2098 | my $ref = fold_label($name); |
2098 | my $ref = fold_label($name); |
2099 | 2099 | ||
2100 | if(-e ".pd/ectable.html"){ |
2100 | if(-e ".pd/ectable.html"){ |
2101 | my $x = readall('.pd/ectable.html'); |
2101 | my $x = readall('.pd/ectable.html'); |
2102 | ++$table_no; |
2102 | ++$table_no; |
2103 | print HTML "<p><a id=\"$ref\"></a>Table $table_no:$name</p><br>"; |
2103 | print HTML "<p><a id=\"$ref\"></a>Table $table_no:$name</p><br>"; |
2104 | print HTML2 "<p><a id=\"$ref\"></a>Table $table_no:$name</p><br>"; |
2104 | print HTML2 "<p><a id=\"$ref\"></a>Table $table_no:$name</p><br>"; |
2105 | $reflist{$ref} = $table_no; |
2105 | $reflist{$ref} = $table_no; |
2106 | $refhtmlpage{$ref} = $html2; |
2106 | $refhtmlpage{$ref} = $html2; |
2107 | } |
2107 | } |
2108 | if(-e ".pd/ectable.tex"){ |
2108 | if(-e ".pd/ectable.tex"){ |
2109 | my $x = readall('.pd/ectable.tex'); |
2109 | my $x = readall('.pd/ectable.tex'); |
2110 | #print TEX "\\begin{landscape}\n"; |
2110 | #print TEX "\\begin{landscape}\n"; |
2111 | #print TEX "\\ref{$ref}\n"; |
2111 | #print TEX "\\ref{$ref}\n"; |
2112 | $x =~ s/!!REFERENCE/$ref/gse; |
2112 | $x =~ s/!!REFERENCE/$ref/gse; |
2113 | print TEX $x; |
2113 | print TEX $x; |
2114 | #print TEX "\\end{landscape}\n"; |
2114 | #print TEX "\\end{landscape}\n"; |
2115 | } |
2115 | } |
2116 | 2116 | ||
2117 | ++$i; |
2117 | ++$i; |
2118 | #++$sec_float_obj; |
2118 | #++$sec_float_obj; |
2119 | next; |
2119 | next; |
2120 | } |
2120 | } |
2121 | # end EDDA |
2121 | # end EDDA |
2122 | 2122 | ||
2123 | if (/^<<EOF: .*?>>/) { |
2123 | if (/^<<EOF: .*?>>/) { |
2124 | $i = $#pd + 1; |
2124 | $i = $#pd + 1; |
2125 | last; |
2125 | last; |
2126 | } |
2126 | } |
2127 | 2127 | ||
2128 | warn "push to para" if $trace>1; |
2128 | warn "push to para" if $trace>1; |
2129 | push @para, "$_\n"; |
2129 | push @para, "$_\n"; |
2130 | ++$i; |
2130 | ++$i; |
2131 | } |
2131 | } |
2132 | warn "$i: end of body list_level=$list_level" if $trace; |
2132 | warn "$i: end of body list_level=$list_level" if $trace; |
2133 | para(@para); |
2133 | para(@para); |
2134 | return; |
2134 | return; |
2135 | } |
2135 | } |
2136 | 2136 | ||
2137 | ### Base64 encoder so we avoid dependency on MIME::Base64 module. |
2137 | ### Base64 encoder so we avoid dependency on MIME::Base64 module. |
2138 | 2138 | ||
2139 | sub b64enc { |
2139 | sub b64enc { |
2140 | my ($b1, $b2, $b3) = @_; |
2140 | my ($b1, $b2, $b3) = @_; |
2141 | #warn "b1($b1) b2($b2) b3($b3)"; |
2141 | #warn "b1($b1) b2($b2) b3($b3)"; |
2142 | my $x1 = (ord($b1) >> 2) & 0x3f; |
2142 | my $x1 = (ord($b1) >> 2) & 0x3f; |
2143 | my $x2 = (ord($b1) & 3) | ((ord($b2) >> 2) & 0x3c); |
2143 | my $x2 = (ord($b1) & 3) | ((ord($b2) >> 2) & 0x3c); |
2144 | my $x3 = (ord($b2) & 0xf) | ((ord($b3) >> 2) & 0x30); |
2144 | my $x3 = (ord($b2) & 0xf) | ((ord($b3) >> 2) & 0x30); |
2145 | my $x4 = ord($b3) & 0x3f; |
2145 | my $x4 = ord($b3) & 0x3f; |
2146 | #warn "x1($x1) x2($x2) x3($x3) x4($x4)"; |
2146 | #warn "x1($x1) x2($x2) x3($x3) x4($x4)"; |
2147 | my $b64str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-.'; # safish b64 |
2147 | my $b64str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-.'; # safish b64 |
2148 | return substr($b64str,$x1,1).substr($b64str,$x2,1).substr($b64str,$x3,1).substr($b64str,$x4,1); |
2148 | return substr($b64str,$x1,1).substr($b64str,$x2,1).substr($b64str,$x3,1).substr($b64str,$x4,1); |
2149 | } |
2149 | } |
2150 | 2150 | ||
2151 | sub pdseal_normalize { |
2151 | sub pdseal_normalize { |
2152 | my ($x) = @_; |
2152 | my ($x) = @_; |
2153 | #warn "INPUT for pdseal_normalize($x)"; |
2153 | #warn "INPUT for pdseal_normalize($x)"; |
2154 | $x =~ s/[ \t]+/ /g; |
2154 | $x =~ s/[ \t]+/ /g; |
2155 | $x =~ s/\r\n/\n/g; |
2155 | $x =~ s/\r\n/\n/g; |
2156 | $x =~ s/\r/\n/g; |
2156 | $x =~ s/\r/\n/g; |
2157 | $x =~ s/\n +/\n/g; |
2157 | $x =~ s/\n +/\n/g; |
2158 | $x =~ s/ +\n/\n/g; |
2158 | $x =~ s/ +\n/\n/g; |
2159 | $x =~ s/\n{2,}/\n\n/g; |
2159 | $x =~ s/\n{2,}/\n\n/g; |
2160 | $x =~ s/([^\n])\n([^\n])/$1 $2/sg; # Single newlines are insignificant |
2160 | $x =~ s/([^\n])\n([^\n])/$1 $2/sg; # Single newlines are insignificant |
2161 | $x =~ s/ +/ /g; |
2161 | $x =~ s/ +/ /g; |
2162 | $x =~ s/^[ \n]+//s; # zap initial whitespace |
2162 | $x =~ s/^[ \n]+//s; # zap initial whitespace |
2163 | $x =~ s/[ \n]+$/\n/s; # normalize to end in single newline |
2163 | $x =~ s/[ \n]+$/\n/s; # normalize to end in single newline |
2164 | #warn "OUTPUT for pdseal_normalize($x)"; |
2164 | #warn "OUTPUT for pdseal_normalize($x)"; |
2165 | return $x; |
2165 | return $x; |
2166 | } |
2166 | } |
2167 | 2167 | ||
2168 | sub pdseal1 { |
2168 | sub pdseal1 { |
2169 | my ($x) = @_; |
2169 | my ($x) = @_; |
2170 | $pdseal_norm = $x = pdseal_normalize($x); |
2170 | $pdseal_norm = $x = pdseal_normalize($x); |
2171 | require Digest::SHA1; |
2171 | require Digest::SHA1; |
2172 | $x = Digest::SHA1::sha1($x); |
2172 | $x = Digest::SHA1::sha1($x); |
2173 | $x .= '1'; # Make it 21 bytes so it will give 28 base64 chars with no padding |
2173 | $x .= '1'; # Make it 21 bytes so it will give 28 base64 chars with no padding |
2174 | $x =~ s/(.)(.)(.)/b64enc($1,$2,$3)/ges; |
2174 | $x =~ s/(.)(.)(.)/b64enc($1,$2,$3)/ges; |
2175 | return "PDSEAL1$x"; |
2175 | return "PDSEAL1$x"; |
2176 | } |
2176 | } |
2177 | 2177 | ||
2178 | ### Process a definition list. The list has just been detected in body. Now we |
2178 | ### Process a definition list. The list has just been detected in body. Now we |
2179 | ### need to proceed to next level of indent. |
2179 | ### need to proceed to next level of indent. |
2180 | 2180 | ||
2181 | sub varlist { |
2181 | sub varlist { |
2182 | my ($ind_len, $prefix, $first) = @_; |
2182 | my ($ind_len, $prefix, $first) = @_; |
2183 | print DBX ((' 'x$list_level) . $dbx_list_open{$list_type[$list_level]}); |
2183 | print DBX ((' 'x$list_level) . $dbx_list_open{$list_type[$list_level]}); |
2184 | #print RTF ((' 'x$list_level) . $rtf_list_open{$list_type[$list_level]}); |
2184 | #print RTF ((' 'x$list_level) . $rtf_list_open{$list_type[$list_level]}); |
2185 | print HTML ((' 'x$list_level) . $html_list_open{$list_type[$list_level]}); |
2185 | print HTML ((' 'x$list_level) . $html_list_open{$list_type[$list_level]}); |
2186 | print HTML2 ((' 'x$list_level) . $html_list_open{$list_type[$list_level]}); |
2186 | print HTML2 ((' 'x$list_level) . $html_list_open{$list_type[$list_level]}); |
2187 | print TEX ((' 'x$list_level) . $tex_list_open{$list_type[$list_level]}); |
2187 | print TEX ((' 'x$list_level) . $tex_list_open{$list_type[$list_level]}); |
2188 | while (1) { |
2188 | while (1) { |
2189 | warn "$i: start varlist $ind_len ($prefix) --[$first]-- list_level=$list_level" if $trace; |
2189 | warn "$i: start varlist $ind_len ($prefix) --[$first]-- list_level=$list_level" if $trace; |
2190 | my $dbx_prefix = dbx_format($prefix); |
2190 | my $dbx_prefix = dbx_format($prefix); |
2191 | print DBX ((' 'x$list_level) . qq(<varlistentry><term>$dbx_prefix</term><listitem>\n)); |
2191 | print DBX ((' 'x$list_level) . qq(<varlistentry><term>$dbx_prefix</term><listitem>\n)); |
2192 | print NONL "$prefix: "; |
2192 | print NONL "$prefix: "; |
2193 | print PDSEAL "$prefix "; |
2193 | print PDSEAL "$prefix "; |
2194 | my $rtf_prefix = rtf_format($prefix); |
2194 | my $rtf_prefix = rtf_format($prefix); |
2195 | my $rtf_style = $rtf_styles{'s3'.$list_level}; |
2195 | my $rtf_style = $rtf_styles{'s3'.$list_level}; |
2196 | print RTF "{$rtf_style \\s3$list_level \\b\n$rtf_prefix\\par}\\fi0\n"; |
2196 | print RTF "{$rtf_style \\s3$list_level \\b\n$rtf_prefix\\par}\\fi0\n"; |
2197 | my $html_prefix = html_format($prefix); # allow formatting in list item title |
2197 | my $html_prefix = html_format($prefix); # allow formatting in list item title |
2198 | print HTML "<dt>$html_prefix<dd>"; |
2198 | print HTML "<dt>$html_prefix<dd>"; |
2199 | print HTML2 "<dt>$html_prefix<dd>"; |
2199 | print HTML2 "<dt>$html_prefix<dd>"; |
2200 | my $tex_prefix = tex_format($prefix); # allow formatting in list item title |
2200 | my $tex_prefix = tex_format($prefix); # allow formatting in list item title |
2201 | #$prefix = tex_esc($prefix); |
2201 | #$prefix = tex_esc($prefix); |
2202 | print TEX "\\item[$tex_prefix] "; |
2202 | print TEX "\\item[$tex_prefix] "; |
2203 | ++$i; |
2203 | ++$i; |
2204 | 2204 | ||
2205 | body(' 'x$ind_len, $first); # Process paragraphs for this list item (the definition) |
2205 | body(' 'x$ind_len, $first); # Process paragraphs for this list item (the definition) |
2206 | warn "$i: back from body --[$first]-- list_level=$list_level" if $trace; |
2206 | warn "$i: back from body --[$first]-- list_level=$list_level" if $trace; |
2207 | print DBX ((' 'x$list_level) . "</listitem></varlistentry>\n"); |
2207 | print DBX ((' 'x$list_level) . "</listitem></varlistentry>\n"); |
2208 | 2208 | ||
2209 | $la = $pd[$i+1]; |
2209 | $la = $pd[$i+1]; |
2210 | if ((length($pd[$i]) == length($la)) && $la =~ /^[=~^-]{3,}$/) { # section |
2210 | if ((length($pd[$i]) == length($la)) && $la =~ /^[=~^-]{3,}$/) { # section |
2211 | warn "$i: section detected list_level=$list_level" if $trace; |
2211 | warn "$i: section detected list_level=$list_level" if $trace; |
2212 | last; |
2212 | last; |
2213 | } |
2213 | } |
2214 | 2214 | ||
2215 | ### Can either be list item at same level or list item continuation at any |
2215 | ### Can either be list item at same level or list item continuation at any |
2216 | ### previous level (i.e. new paragraph) or new item at any previous level |
2216 | ### previous level (i.e. new paragraph) or new item at any previous level |
2217 | 2217 | ||
2218 | $_ = $pd[$i]; |
2218 | $_ = $pd[$i]; |
2219 | ($indent) = /^(\s*)/; |
2219 | ($indent) = /^(\s*)/; |
2220 | $indent = length($indent); |
2220 | $indent = length($indent); |
2221 | warn "***** indent=$indent prev_indent=".$list_indent[$list_level-1]." level=$list_level" if $trace; |
2221 | warn "***** indent=$indent prev_indent=".$list_indent[$list_level-1]." level=$list_level" if $trace; |
2222 | if ($indent == $list_indent[$list_level-1]) { |
2222 | if ($indent == $list_indent[$list_level-1]) { |
2223 | my $typ = $list_type[$list_level]; |
2223 | my $typ = $list_type[$list_level]; |
2224 | warn "checking for another item at same level typ($typ) --[$_]--" if $trace; |
2224 | warn "checking for another item at same level typ($typ) --[$_]--" if $trace; |
2225 | if (($typ eq ':') && /^(\s*(([^\n]+?)::\s+))(.*)$/) { |
2225 | if (($typ eq ':') && /^(\s*(([^\n]+?)::\s+))(.*)$/) { |
2226 | $prefix = $3; |
2226 | $prefix = $3; |
2227 | $first = $4; |
2227 | $first = $4; |
2228 | warn "$i: another item list_level=$list_level --[$first]--" if $trace; |
2228 | warn "$i: another item list_level=$list_level --[$first]--" if $trace; |
2229 | next; |
2229 | next; |
2230 | } |
2230 | } |
2231 | warn "$i: same level didn't match --[$pd[$i]]--" if $trace; |
2231 | warn "$i: same level didn't match --[$pd[$i]]--" if $trace; |
2232 | } |
2232 | } |
2233 | last; # Was not an item of the same list |
2233 | last; # Was not an item of the same list |
2234 | } |
2234 | } |
2235 | print DBX ((' 'x$list_level) . $dbx_list_close{$list_type[$list_level]}); |
2235 | print DBX ((' 'x$list_level) . $dbx_list_close{$list_type[$list_level]}); |
2236 | #print RTF ((' 'x$list_level) . $rtf_list_close{$list_type[$list_level]}); |
2236 | #print RTF ((' 'x$list_level) . $rtf_list_close{$list_type[$list_level]}); |
2237 | print HTML ((' 'x$list_level) . $html_list_close{$list_type[$list_level]}); |
2237 | print HTML ((' 'x$list_level) . $html_list_close{$list_type[$list_level]}); |
2238 | print HTML2 ((' 'x$list_level) . $html_list_close{$list_type[$list_level]}); |
2238 | print HTML2 ((' 'x$list_level) . $html_list_close{$list_type[$list_level]}); |
2239 | print TEX ((' 'x$list_level) . $tex_list_close{$list_type[$list_level]}); |
2239 | print TEX ((' 'x$list_level) . $tex_list_close{$list_type[$list_level]}); |
2240 | --$list_level; |
2240 | --$list_level; |
2241 | warn "$i: list closed list_level=$list_level" if $trace; |
2241 | warn "$i: list closed list_level=$list_level" if $trace; |
2242 | } |
2242 | } |
2243 | 2243 | ||
2244 | ### Process a list. The list has just been detected in body. Now we need to proceed |
2244 | ### Process a list. The list has just been detected in body. Now we need to proceed |
2245 | ### to next level of indent. |
2245 | ### to next level of indent. |
2246 | 2246 | ||
2247 | sub list { |
2247 | sub list { |
2248 | my ($ind_len, $prefix, $first) = @_; |
2248 | my ($ind_len, $prefix, $first) = @_; |
2249 | print DBX ((' 'x$list_level) . $dbx_list_open{$list_type[$list_level]}); |
2249 | print DBX ((' 'x$list_level) . $dbx_list_open{$list_type[$list_level]}); |
2250 | #print RTF ((' 'x$list_level) . $rtf_list_open{$list_type[$list_level]}); |
2250 | #print RTF ((' 'x$list_level) . $rtf_list_open{$list_type[$list_level]}); |
2251 | print HTML ((' 'x$list_level) . $html_list_open{$list_type[$list_level]}); |
2251 | print HTML ((' 'x$list_level) . $html_list_open{$list_type[$list_level]}); |
2252 | print HTML2 ((' 'x$list_level) . $html_list_open{$list_type[$list_level]}); |
2252 | print HTML2 ((' 'x$list_level) . $html_list_open{$list_type[$list_level]}); |
2253 | print TEX ((' 'x$list_level) . $tex_list_open{$list_type[$list_level]}); |
2253 | print TEX ((' 'x$list_level) . $tex_list_open{$list_type[$list_level]}); |
2254 | while (1) { |
2254 | while (1) { |
2255 | warn "$i: start list body $ind_len ($prefix) --[$first]-- list_lvl=$list_level type($list_type[$list_level]) n($n_list[$list_level])" if $trace; |
2255 | warn "$i: start list body $ind_len ($prefix) --[$first]-- list_lvl=$list_level type($list_type[$list_level]) n($n_list[$list_level])" if $trace; |
2256 | 2256 | ||
2257 | #$first = "$n_list[$list_level]. $first" if $number && $list_type[$list_level]=~/^[Aa1]$/; |
2257 | #$first = "$n_list[$list_level]. $first" if $number && $list_type[$list_level]=~/^[Aa1]$/; |
2258 | print DBX ((' 'x$list_level) . qq(<listitem>\n)); |
2258 | print DBX ((' 'x$list_level) . qq(<listitem>\n)); |
2259 | my $rtf_item = $rtf_list_item{$list_type[$list_level]}; |
2259 | my $rtf_item = $rtf_list_item{$list_type[$list_level]}; |
2260 | $rtf_item =~ s/!!N/$list_level/; |
2260 | $rtf_item =~ s/!!N/$list_level/; |
2261 | $rtf_item =~ s/!!S/$rtf_styles{"s3$list_level"}/; |
2261 | $rtf_item =~ s/!!S/$rtf_styles{"s3$list_level"}/; |
2262 | $rtf_item =~ s/!!M/$ord_mark{$list_type[$list_level]}[$n_list[$list_level]]/; |
2262 | $rtf_item =~ s/!!M/$ord_mark{$list_type[$list_level]}[$n_list[$list_level]]/; |
2263 | #print RTF (("\\tab"x$list_level) . $rtf_item); |
2263 | #print RTF (("\\tab"x$list_level) . $rtf_item); |
2264 | print RTF $rtf_item; |
2264 | print RTF $rtf_item; |
2265 | print HTML ((' 'x$list_level) . qq(<li>\n)); |
2265 | print HTML ((' 'x$list_level) . qq(<li>\n)); |
2266 | print HTML2 ((' 'x$list_level) . qq(<li>\n)); |
2266 | print HTML2 ((' 'x$list_level) . qq(<li>\n)); |
2267 | print TEX ((' 'x$list_level) . $tex_list_item{$list_type[$list_level]}); |
2267 | print TEX ((' 'x$list_level) . $tex_list_item{$list_type[$list_level]}); |
2268 | if ($list_type[$list_level] =~ /^[*+-]$/) { |
2268 | if ($list_type[$list_level] =~ /^[*+-]$/) { |
2269 | print PDSEAL "$list_type[$list_level] "; |
2269 | print PDSEAL "$list_type[$list_level] "; |
2270 | } else { |
2270 | } else { |
2271 | print PDSEAL $ord_mark{$list_type[$list_level]}[$n_list[$list_level]].". "; |
2271 | print PDSEAL $ord_mark{$list_type[$list_level]}[$n_list[$list_level]].". "; |
2272 | } |
2272 | } |
2273 | ++$i; |
2273 | ++$i; |
2274 | body(' 'x$ind_len, $first); # Process paragraphs for this list item |
2274 | body(' 'x$ind_len, $first); # Process paragraphs for this list item |
2275 | warn "$i: back from body --[$first]-- list_level=$list_level" if $trace; |
2275 | warn "$i: back from body --[$first]-- list_level=$list_level" if $trace; |
2276 | print DBX ((' 'x$list_level) . "</listitem>\n"); |
2276 | print DBX ((' 'x$list_level) . "</listitem>\n"); |
2277 | print RTF "}\n\n"; |
2277 | print RTF "}\n\n"; |
2278 | 2278 | ||
2279 | $la = $pd[$i+1]; |
2279 | $la = $pd[$i+1]; |
2280 | if ((length($pd[$i]) == length($la)) && $la =~ /^[=~^-]{3,}$/) { # section |
2280 | if ((length($pd[$i]) == length($la)) && $la =~ /^[=~^-]{3,}$/) { # section |
2281 | warn "$i: section detected list_level=$list_level" if $trace; |
2281 | warn "$i: section detected list_level=$list_level" if $trace; |
2282 | last; |
2282 | last; |
2283 | } |
2283 | } |
2284 | 2284 | ||
2285 | ### Can either be list item at same level or list item continuation at any |
2285 | ### Can either be list item at same level or list item continuation at any |
2286 | ### previous level (i.e. new paragraph) or new item at any previous level |
2286 | ### previous level (i.e. new paragraph) or new item at any previous level |
2287 | 2287 | ||
2288 | $_ = $pd[$i]; |
2288 | $_ = $pd[$i]; |
2289 | ($indent) = /^(\s*)/; |
2289 | ($indent) = /^(\s*)/; |
2290 | $indent = length($indent); |
2290 | $indent = length($indent); |
2291 | warn "***** indent=$indent prev_indent=".$list_indent[$list_level-1]." level=$list_level" if $trace; |
2291 | warn "***** indent=$indent prev_indent=".$list_indent[$list_level-1]." level=$list_level" if $trace; |
2292 | if ($indent == $list_indent[$list_level-1]) { |
2292 | if ($indent == $list_indent[$list_level-1]) { |
2293 | my $typ = $list_type[$list_level]; |
2293 | my $typ = $list_type[$list_level]; |
2294 | my $cur_ind = $list_indent[$list_level]; |
2294 | my $cur_ind = $list_indent[$list_level]; |
2295 | warn "checking for another item at same level typ=$typ cur_ind=$cur_ind --[$_]--" if $trace; |
2295 | warn "checking for another item at same level typ=$typ cur_ind=$cur_ind --[$_]--" if $trace; |
2296 | if (($typ eq '1') && /^(\s*\d+\.\s+)(.*)/) { |
2296 | if (($typ eq '1') && /^(\s*\d+\.\s+)(.*)/) { |
2297 | if (length($1) == $cur_ind) { |
2297 | if (length($1) == $cur_ind) { |
2298 | ++$n_list[$list_level]; |
2298 | ++$n_list[$list_level]; |
2299 | $first = $2; |
2299 | $first = $2; |
2300 | warn "$i: another item list_level=$list_level --[$first]--" if $trace; |
2300 | warn "$i: another item list_level=$list_level --[$first]--" if $trace; |
2301 | next; |
2301 | next; |
2302 | } else { |
2302 | } else { |
2303 | warn "$i: Indent does not match ($_)"; |
2303 | warn "$i: Indent does not match ($_)"; |
2304 | } |
2304 | } |
2305 | } elsif (($typ eq 'a') && /^(\s*[a-z]+[.\)]\s+)(.*)/) { |
2305 | } elsif (($typ eq 'a') && /^(\s*[a-z]+[.\)]\s+)(.*)/) { |
2306 | if (length($1) == $cur_ind) { |
2306 | if (length($1) == $cur_ind) { |
2307 | ++$n_list[$list_level]; |
2307 | ++$n_list[$list_level]; |
2308 | $first = $2; |
2308 | $first = $2; |
2309 | warn "$i: another item list_level=$list_level --[$first]--" if $trace; |
2309 | warn "$i: another item list_level=$list_level --[$first]--" if $trace; |
2310 | next; |
2310 | next; |
2311 | } else { |
2311 | } else { |
2312 | warn "$i: Indent does not match ($_)"; |
2312 | warn "$i: Indent does not match ($_)"; |
2313 | } |
2313 | } |
2314 | } elsif (($typ eq 'A') && /^(\s*[A-Z]+\.\s+)(.*)/) { |
2314 | } elsif (($typ eq 'A') && /^(\s*[A-Z]+\.\s+)(.*)/) { |
2315 | if (length($1) == $cur_ind) { |
2315 | if (length($1) == $cur_ind) { |
2316 | ++$n_list[$list_level]; |
2316 | ++$n_list[$list_level]; |
2317 | $first = $2; |
2317 | $first = $2; |
2318 | warn "$i: another item list_level=$list_level --[$first]--" if $trace; |
2318 | warn "$i: another item list_level=$list_level --[$first]--" if $trace; |
2319 | next; |
2319 | next; |
2320 | } else { |
2320 | } else { |
2321 | warn "$i: Indent does not match ($_)"; |
2321 | warn "$i: Indent does not match ($_)"; |
2322 | } |
2322 | } |
2323 | } elsif (($typ eq 'i') && /^(\s*[ivxlcdm]+[.\)]\s+)(.*)/) { |
2323 | } elsif (($typ eq 'i') && /^(\s*[ivxlcdm]+[.\)]\s+)(.*)/) { |
2324 | if (length($1) == $cur_ind) { |
2324 | if (length($1) == $cur_ind) { |
2325 | ++$n_list[$list_level]; |
2325 | ++$n_list[$list_level]; |
2326 | $first = $2; |
2326 | $first = $2; |
2327 | warn "$i: another item list_level=$list_level --[$first]--" if $trace; |
2327 | warn "$i: another item list_level=$list_level --[$first]--" if $trace; |
2328 | next; |
2328 | next; |
2329 | } else { |
2329 | } else { |
2330 | warn "$i: Indent does not match ($_)"; |
2330 | warn "$i: Indent does not match ($_)"; |
2331 | } |
2331 | } |
2332 | } elsif (($typ eq 'I') && /^(\s*[IVXLCDM]+\.\s+)(.*)/) { |
2332 | } elsif (($typ eq 'I') && /^(\s*[IVXLCDM]+\.\s+)(.*)/) { |
2333 | if (length($1) == $cur_ind) { |
2333 | if (length($1) == $cur_ind) { |
2334 | ++$n_list[$list_level]; |
2334 | ++$n_list[$list_level]; |
2335 | $first = $2; |
2335 | $first = $2; |
2336 | warn "$i: another item list_level=$list_level --[$first]--" if $trace; |
2336 | warn "$i: another item list_level=$list_level --[$first]--" if $trace; |
2337 | next; |
2337 | next; |
2338 | } else { |
2338 | } else { |
2339 | warn "$i: Indent does not match ($_)"; |
2339 | warn "$i: Indent does not match ($_)"; |
2340 | } |
2340 | } |
2341 | } elsif (/^(\s*([*+-])\s+)(.*)/) { |
2341 | } elsif (/^(\s*([*+-])\s+)(.*)/) { |
2342 | if ((length($1) == $cur_ind) && ($typ eq $2)) { |
2342 | if ((length($1) == $cur_ind) && ($typ eq $2)) { |
2343 | ++$n_list[$list_level]; |
2343 | ++$n_list[$list_level]; |
2344 | $first = $3; |
2344 | $first = $3; |
2345 | warn "$i: another item list_level=$list_level --[$first]--" if $trace; |
2345 | warn "$i: another item list_level=$list_level --[$first]--" if $trace; |
2346 | next; |
2346 | next; |
2347 | } else { |
2347 | } else { |
2348 | warn "$i: Indent does not match ($_)"; |
2348 | warn "$i: Indent does not match ($_)"; |
2349 | } |
2349 | } |
2350 | } |
2350 | } |
2351 | warn "$i: same level didn't match --[$pd[$i]]--" if $trace; |
2351 | warn "$i: same level didn't match --[$pd[$i]]--" if $trace; |
2352 | } |
2352 | } |
2353 | 2353 | ||
2354 | last; # Was not an item of the same list |
2354 | last; # Was not an item of the same list |
2355 | } |
2355 | } |
2356 | print DBX ((' 'x$list_level) . $dbx_list_close{$list_type[$list_level]}); |
2356 | print DBX ((' 'x$list_level) . $dbx_list_close{$list_type[$list_level]}); |
2357 | #print RTF ((' 'x$list_level) . $rtf_list_close{$list_type[$list_level]}); |
2357 | #print RTF ((' 'x$list_level) . $rtf_list_close{$list_type[$list_level]}); |
2358 | print HTML ((' 'x$list_level) . $html_list_close{$list_type[$list_level]}); |
2358 | print HTML ((' 'x$list_level) . $html_list_close{$list_type[$list_level]}); |
2359 | print HTML2 ((' 'x$list_level) . $html_list_close{$list_type[$list_level]}); |
2359 | print HTML2 ((' 'x$list_level) . $html_list_close{$list_type[$list_level]}); |
2360 | print TEX ((' 'x$list_level) . $tex_list_close{$list_type[$list_level]}); |
2360 | print TEX ((' 'x$list_level) . $tex_list_close{$list_type[$list_level]}); |
2361 | --$list_level; |
2361 | --$list_level; |
2362 | warn "$i: list closed list_level=$list_level" if $trace; |
2362 | warn "$i: list closed list_level=$list_level" if $trace; |
2363 | } |
2363 | } |
2364 | 2364 | ||
2365 | sub sgfrag { |
2365 | sub sgfrag { |
2366 | my ($in, $sec, $out, $caption) = @_; |
2366 | my ($in, $sec, $out, $caption) = @_; |
2367 | my ($sg,$dbx); |
2367 | my ($sg,$dbx); |
2368 | if ($pdflag{'showsgasxsd'} eq '1') { |
2368 | if ($pdflag{'showsgasxsd'} eq '1') { |
2369 | $sg = readall($out, 1); |
2369 | $sg = readall($out, 1); |
2370 | $dbx = qq(<programlisting format="schema"><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="./$out" parse="text"/></programlisting>); |
2370 | $dbx = qq(<programlisting format="schema"><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="./$out" parse="text"/></programlisting>); |
2371 | } elsif ($pdflag{'showsgasxsd'} eq '2') { |
2371 | } elsif ($pdflag{'showsgasxsd'} eq '2') { |
2372 | $sg = readall($out, 1); |
2372 | $sg = readall($out, 1); |
2373 | $dbx = '<programlisting format="schema"><computeroutput><!\[CDATA\[' . |
2373 | $dbx = '<programlisting format="schema"><computeroutput><!\[CDATA\[' . |
2374 | dbx_entity_escape_lite($sg) . ']]></computeroutput></programlisting>'; |
2374 | dbx_entity_escape_lite($sg) . ']]></computeroutput></programlisting>'; |
2375 | } else { |
2375 | } else { |
2376 | $sg = readall($in, 1); |
2376 | $sg = readall($in, 1); |
2377 | $sg ||= readall("$in.sg", 1); |
2377 | $sg ||= readall("$in.sg", 1); |
2378 | #my $xs = readall("$in.xsd"); |
2378 | #my $xs = readall("$in.xsd"); |
2379 | if ($sec) { |
2379 | if ($sec) { |
2380 | ($sg) = $sg =~ /\#sec\($sec\)\s*(.*?)\s*\#endsec\($sec\)/s; |
2380 | ($sg) = $sg =~ /\#sec\($sec\)\s*(.*?)\s*\#endsec\($sec\)/s; |
2381 | #($xs) = $xs =~ /sec\($sec\)\s*(.*?)\s*endsec\($sec\)/s; |
2381 | #($xs) = $xs =~ /sec\($sec\)\s*(.*?)\s*endsec\($sec\)/s; |
2382 | } |
2382 | } |
2383 | $dbx = qq(<programlisting format="schemagrammar"><computeroutput><!\[CDATA\[) |
2383 | $dbx = qq(<programlisting format="schemagrammar"><computeroutput><!\[CDATA\[) |
2384 | . dbx_entity_escape_lite($sg) . qq(\]\]></computeroutput></programlisting>); |
2384 | . dbx_entity_escape_lite($sg) . qq(\]\]></computeroutput></programlisting>); |
2385 | } |
2385 | } |
2386 | ++$img_no; |
2386 | ++$img_no; |
2387 | my $dbx_caption = dbx_format($caption); |
2387 | my $dbx_caption = dbx_format($caption); |
2388 | my $rtf_caption = rtf_format($caption); |
2388 | my $rtf_caption = rtf_format($caption); |
2389 | my $html_caption = html_format($caption); |
2389 | my $html_caption = html_format($caption); |
2390 | my $tex_caption = tex_caption($caption); |
2390 | my $tex_caption = tex_caption($caption); |
2391 | my $label = "$in-$sec"; |
2391 | my $label = "$in-$sec"; |
2392 | 2392 | ||
2393 | print DBX qq(<figure id="$label" label="$img_no"><title>$dbx_caption</title>); |
2393 | print DBX qq(<figure id="$label" label="$img_no"><title>$dbx_caption</title>); |
2394 | print RTF qq(figstart $rtf_caption); |
2394 | print RTF qq(figstart $rtf_caption); |
2395 | print HTML qq(<pre>); |
2395 | print HTML qq(<pre>); |
2396 | print HTML2 qq(<pre>); |
2396 | print HTML2 qq(<pre>); |
2397 | print TEX qq(\\begin{figure}\\begin{verbatim}); |
2397 | print TEX qq(\\begin{figure}\\begin{verbatim}); |
2398 | print DBX $dbx; |
2398 | print DBX $dbx; |
2399 | print NONL $sg; |
2399 | print NONL $sg; |
2400 | print PDSEAL $sg; |
2400 | print PDSEAL $sg; |
2401 | print RTF $sg; |
2401 | print RTF $sg; |
2402 | print HTML $sg; |
2402 | print HTML $sg; |
2403 | print HTML2 $sg; |
2403 | print HTML2 $sg; |
2404 | print TEX $sg; |
2404 | print TEX $sg; |
2405 | print DBX qq(</figure>); |
2405 | print DBX qq(</figure>); |
2406 | print RTF qq(figend); |
2406 | print RTF qq(figend); |
2407 | print HTML "</pre>Fig-$img_no: $html_caption<p>"; |
2407 | print HTML "</pre>Fig-$img_no: $html_caption<p>"; |
2408 | print HTML2 "</pre>Fig-$img_no: $html_caption<p>"; |
2408 | print HTML2 "</pre>Fig-$img_no: $html_caption<p>"; |
2409 | print TEX qq(\\end{verbatim}$tex_caption\\label{$label}\\end{figure}); |
2409 | print TEX qq(\\end{verbatim}$tex_caption\\label{$label}\\end{figure}); |
2410 | } |
2410 | } |
2411 | 2411 | ||
2412 | sub xmlfmt_html { |
2412 | sub xmlfmt_html { |
2413 | my ($x) = @_; |
2413 | my ($x) = @_; |
2414 | } |
2414 | } |
2415 | 2415 | ||
2416 | sub xmlfmt { |
2416 | sub xmlfmt { |
2417 | my ($frag_name, $opts) = @_; |
2417 | my ($frag_name, $opts) = @_; |
2418 | my $x = ''; |
2418 | my $x = ''; |
2419 | my @opts = split /\s*,\s*/, $opts; |
2419 | my @opts = split /\s*,\s*/, $opts; |
2420 | 2420 | ||
2421 | for ($row = 0; $i<=$#pd && $pd[$i] !~ /^>>/; ++$i) { |
2421 | for ($row = 0; $i<=$#pd && $pd[$i] !~ /^>>/; ++$i) { |
2422 | $x .= $pd[$i] . "\n"; |
2422 | $x .= $pd[$i] . "\n"; |
2423 | } |
2423 | } |
2424 | 2424 | ||
2425 | print DBX qq(<programlisting format="$opts[0]"><computeroutput><!\[CDATA\[); |
2425 | print DBX qq(<programlisting format="$opts[0]"><computeroutput><!\[CDATA\[); |
2426 | print RTF qq({\\f2); |
2426 | print RTF qq({\\f2); |
2427 | print HTML qq(<pre>); |
2427 | print HTML qq(<pre>); |
2428 | print HTML2 qq(<pre>); |
2428 | print HTML2 qq(<pre>); |
2429 | print TEX qq(\\begin{verbatim}); |
2429 | print TEX qq(\\begin{verbatim}); |
2430 | print DBX dbx_entity_escape_lite($x); |
2430 | print DBX dbx_entity_escape_lite($x); |
2431 | print RTF $x; |
2431 | print RTF $x; |
2432 | print RTF xmlfmt_html($x); |
2432 | print RTF xmlfmt_html($x); |
2433 | print HTML xmlfmt_html($x); |
2433 | print HTML xmlfmt_html($x); |
2434 | print HTML2 xmlfmt_html($x); |
2434 | print HTML2 xmlfmt_html($x); |
2435 | print TEX texfmt_html($x); |
2435 | print TEX texfmt_html($x); |
2436 | print DBX qq(\]\]></computeroutput></programlisting>); |
2436 | print DBX qq(\]\]></computeroutput></programlisting>); |
2437 | print RTF "}"; |
2437 | print RTF "}"; |
2438 | print HTML "</pre>"; |
2438 | print HTML "</pre>"; |
2439 | print HTML2 "</pre>"; |
2439 | print HTML2 "</pre>"; |
2440 | print TEX qq(\\end{verbatim}); |
2440 | print TEX qq(\\end{verbatim}); |
2441 | } |
2441 | } |
2442 | 2442 | ||
2443 | ### Tables |
2443 | ### Tables |
2444 | 2444 | ||
2445 | sub table { |
2445 | sub table { |
2446 | my ($table_name,$tablekind) = @_; |
2446 | my ($table_name,$tablekind) = @_; |
2447 | # globals: @pd, $i |
2447 | # globals: @pd, $i |
2448 | $i+=2; |
2448 | $i+=2; |
2449 | my (@table, @col_beg, @col_wid, @col_hdr, @row1, @vis_wid); |
2449 | my (@table, @col_beg, @col_wid, @col_hdr, @row1, @vis_wid); |
2450 | my ($j, $row, $cols, $line, $wid); |
2450 | my ($j, $row, $cols, $line, $wid); |
2451 | my @align = (); |
2451 | my @align = (); |
2452 | my $cur_col = 0; |
2452 | my $cur_col = 0; |
2453 | if ($table_name) { |
2453 | if ($table_name) { |
2454 | my $table_n = $table_no+1; |
2454 | my $table_n = $table_no+1; |
2455 | print NONL "Table $table_n: $table_name\n"; |
2455 | print NONL "Table $table_n: $table_name\n"; |
2456 | print PDSEAL "Table $table_n: $table_name\n"; |
2456 | print PDSEAL "Table $table_n: $table_name\n"; |
2457 | } |
2457 | } |
2458 | print NONL $pd[$i-1]."\n"; |
2458 | print NONL $pd[$i-1]."\n"; |
2459 | print NONL $pd[$i]."\n"; |
2459 | print NONL $pd[$i]."\n"; |
2460 | print PDSEAL $pd[$i-1]."\n"; |
2460 | print PDSEAL $pd[$i-1]."\n"; |
2461 | #print PDSEAL $pd[$i]."\n"; # No equals signs in pdseal |
2461 | #print PDSEAL $pd[$i]."\n"; # No equals signs in pdseal |
2462 | @row1 = split / /, $pd[$i]; # Line of equals signs to set width of columns |
2462 | @row1 = split / /, $pd[$i]; # Line of equals signs to set width of columns |
2463 | $cols = $#row1+1; |
2463 | $cols = $#row1+1; |
2464 | $line = $pd[$i-1]; # Line of column titles |
2464 | $line = $pd[$i-1]; # Line of column titles |
2465 | for ($j = 0; $j < $cols; ++$j) { |
2465 | for ($j = 0; $j < $cols; ++$j) { |
2466 | $wid = length($row1[$j]); |
2466 | $wid = length($row1[$j]); |
2467 | $col_hdr[$j] = substr($line, $cur_col, $wid); |
2467 | $col_hdr[$j] = substr($line, $cur_col, $wid); |
2468 | $vis_wid[$j] = $col_wid[$j] = $wid; |
2468 | $vis_wid[$j] = $col_wid[$j] = $wid; |
2469 | $col_beg[$j] = $cur_col; |
2469 | $col_beg[$j] = $cur_col; |
2470 | warn "col $j: >$row1[$j]< wid=$wid cur_col=$cur_col hdr: >>$col_hdr[$j]<<"; # if $trace>1; |
2470 | warn "col $j: >$row1[$j]< wid=$wid cur_col=$cur_col hdr: >>$col_hdr[$j]<<"; # if $trace>1; |
2471 | $cur_col += $wid + 1; |
2471 | $cur_col += $wid + 1; |
2472 | } |
2472 | } |
2473 | for (++$i; ; ++$i) { |
2473 | for (++$i; ; ++$i) { |
2474 | if ($pd[$i]=~/^WIDTHS:\s*(.*?)\s*$/) { |
2474 | if ($pd[$i]=~/^WIDTHS:\s*(.*?)\s*$/) { |
2475 | $j = 0; |
2475 | $j = 0; |
2476 | for $wid (split /,/, $1) { |
2476 | for $wid (split /,/, $1) { |
2477 | ++$j; |
2477 | ++$j; |
2478 | my ($plusminus, $viswid,$ali) = $wid =~ /^([+-])?(\d*)([lrc])?$/; |
2478 | my ($plusminus, $viswid,$ali) = $wid =~ /^([+-])?(\d*)([lrc])?$/; |
2479 | $align[$j] = $ali; |
2479 | $align[$j] = $ali; |
2480 | warn "TAB COL $j: ($plusminus)($viswid)($ali)"; |
2480 | warn "TAB COL $j: ($plusminus)($viswid)($ali)"; |
2481 | if (length $viswid) { |
2481 | if (length $viswid) { |
2482 | if (length $plusminus) { |
2482 | if (length $plusminus) { |
2483 | $vis_wid[$j-1] += $plusminus.$viswid; |
2483 | $vis_wid[$j-1] += $plusminus.$viswid; |
2484 | } else { |
2484 | } else { |
2485 | $vis_wid[$j-1] = $viswid; |
2485 | $vis_wid[$j-1] = $viswid; |
2486 | } |
2486 | } |
2487 | } |
2487 | } |
2488 | } |
2488 | } |
2489 | next; |
2489 | next; |
2490 | } |
2490 | } |
2491 | if ($pd[$i]=~/^OPTIONS:\s*(.*?)\s*/) { |
2491 | if ($pd[$i]=~/^OPTIONS:\s*(.*?)\s*/) { |
2492 | next; |
2492 | next; |
2493 | } |
2493 | } |
2494 | last; |
2494 | last; |
2495 | } |
2495 | } |
2496 | for ($row = 0; $i<=$#pd && $pd[$i] !~ /^>>/;) { |
2496 | for ($row = 0; $i<=$#pd && $pd[$i] !~ /^>>/;) { |
2497 | warn "$i: $pd[$i]" if $trace>1; |
2497 | warn "$i: $pd[$i]" if $trace>1; |
2498 | print NONL $pd[$i]."\n"; |
2498 | print NONL $pd[$i]."\n"; |
2499 | print PDSEAL $pd[$i]."\n"; |
2499 | print PDSEAL $pd[$i]."\n"; |
2500 | if ($pd[$i] =~ /^:$/) { # end of col by line mode |
2500 | if ($pd[$i] =~ /^:$/) { # end of col by line mode |
2501 | warn "$i: end of col by line marker" if $trace>1; |
2501 | warn "$i: end of col by line marker" if $trace>1; |
2502 | ++$i; |
2502 | ++$i; |
2503 | next; |
2503 | next; |
2504 | } |
2504 | } |
2505 | if ($pd[$i] =~ /^\s*$/) { # col by line mode |
2505 | if ($pd[$i] =~ /^\s*$/) { # col by line mode |
2506 | warn "$i: col by line mode cols=$cols" if $trace>1; |
2506 | warn "$i: col by line mode cols=$cols" if $trace>1; |
2507 | ++$i; |
2507 | ++$i; |
2508 | for ($j = 0; $j < $cols; ++$j, ++$i) { |
2508 | for ($j = 0; $j < $cols; ++$j, ++$i) { |
2509 | if ($pd[$i] =~ /^>>/) { |
2509 | if ($pd[$i] =~ /^>>/) { |
2510 | warn "Wrong number of lines in end of table in col-by-line mode: [$pd[$i-1]]"; |
2510 | warn "Wrong number of lines in end of table in col-by-line mode: [$pd[$i-1]]"; |
2511 | last; |
2511 | last; |
2512 | } |
2512 | } |
2513 | $table[$row][$j] = $pd[$i]; |
2513 | $table[$row][$j] = $pd[$i]; |
2514 | } |
2514 | } |
2515 | ++$row; |
2515 | ++$row; |
2516 | next; |
2516 | next; |
2517 | } |
2517 | } |
2518 | 2518 | ||
2519 | # row by line mode |
2519 | # row by line mode |
2520 | $line = $pd[$i]; |
2520 | $line = $pd[$i]; |
2521 | for ($j = 0; $j < $cols-1; ++$j) { |
2521 | for ($j = 0; $j < $cols-1; ++$j) { |
2522 | $table[$row][$j] = substr($line, $col_beg[$j], $col_wid[$j]); |
2522 | $table[$row][$j] = substr($line, $col_beg[$j], $col_wid[$j]); |
2523 | warn "$i: col $j: ($table[$row][$j]) --[$line]--" if $trace>1; |
2523 | warn "$i: col $j: ($table[$row][$j]) --[$line]--" if $trace>1; |
2524 | } |
2524 | } |
2525 | $table[$row][$cols-1] = substr($line, $col_beg[$cols-1]); # last col takes the rest |
2525 | $table[$row][$cols-1] = substr($line, $col_beg[$cols-1]); # last col takes the rest |
2526 | ++$i; |
2526 | ++$i; |
2527 | ++$row; |
2527 | ++$row; |
2528 | } |
2528 | } |
2529 | ++$i; |
2529 | ++$i; |
2530 | 2530 | ||
2531 | # Ok, now we got table in @table and @col_hdr. Format it into Lib docbook table. The |
2531 | # Ok, now we got table in @table and @col_hdr. Format it into Lib docbook table. The |
2532 | # Liberty DocBook tools require two special columns to be added to sides and require namest. |
2532 | # Liberty DocBook tools require two special columns to be added to sides and require namest. |
2533 | 2533 | ||
2534 | #warn "table1 ".Dumper \@col_hdr; |
2534 | #warn "table1 ".Dumper \@col_hdr; |
2535 | #warn "table2 ".Dumper \@vis_wid; |
2535 | #warn "table2 ".Dumper \@vis_wid; |
2536 | table_output(\@table, \@col_hdr, \@vis_wid, $row, $cols, $table_name, $tablekind); |
2536 | table_output(\@table, \@col_hdr, \@vis_wid, $row, $cols, $table_name, $tablekind); |
2537 | } |
2537 | } |
2538 | 2538 | ||
2539 | sub table_output { |
2539 | sub table_output { |
2540 | my ($tabr, $col_hdrr, $vis_widr, $rows, $cols, $table_name, $tablekind) = @_; |
2540 | my ($tabr, $col_hdrr, $vis_widr, $rows, $cols, $table_name, $tablekind) = @_; |
2541 | my ($j, $rr, $dbx, $html, $tex, $colspecs, $tex_colspec, $wid); |
2541 | my ($j, $rr, $dbx, $html, $tex, $colspecs, $tex_colspec, $wid); |
2542 | 2542 | ||
2543 | $colspecs = ''; |
2543 | $colspecs = ''; |
2544 | $tex_colspec = $tex_left_bar; |
2544 | $tex_colspec = $tex_left_bar; |
2545 | $dbx = qq(<thead>\n<row>\n); |
2545 | $dbx = qq(<thead>\n<row>\n); |
2546 | $html = "<tr>\n"; |
2546 | $html = "<tr>\n"; |
2547 | $colspecs = qq(<colspec colname="c0" colwidth="0pt"/>\n); # left extra col |
2547 | $colspecs = qq(<colspec colname="c0" colwidth="0pt"/>\n); # left extra col |
2548 | for ($j = 1; $j <= $cols; ++$j) { |
2548 | for ($j = 1; $j <= $cols; ++$j) { |
2549 | #warn "table_output2($$col_hdrr[$j-1])"; |
2549 | #warn "table_output2($$col_hdrr[$j-1])"; |
2550 | $dbx .= qq( <entry namest="c$j">) . dbx_para_raw($$col_hdrr[$j-1]) . "</entry>\n"; |
2550 | $dbx .= qq( <entry namest="c$j">) . dbx_para_raw($$col_hdrr[$j-1]) . "</entry>\n"; |
2551 | $html .= qq( <th$th_align{$align[$j]}>) . html_format($$col_hdrr[$j-1]) . "</th>\n"; |
2551 | $html .= qq( <th$th_align{$align[$j]}>) . html_format($$col_hdrr[$j-1]) . "</th>\n"; |
2552 | $wid = sprintf('%.1f', $$vis_widr[$j-1] * $dbx_col_wid_factor); |
2552 | $wid = sprintf('%.1f', $$vis_widr[$j-1] * $dbx_col_wid_factor); |
2553 | $colspecs .= qq(<colspec colname="c$j" colwidth="${wid}in"/>\n); |
2553 | $colspecs .= qq(<colspec colname="c$j" colwidth="${wid}in"/>\n); |
2554 | 2554 | ||
2555 | $tp = tex_format($$col_hdrr[$j-1]); |
2555 | $tp = tex_format($$col_hdrr[$j-1]); |
2556 | $tex .= "$tp &"; |
2556 | $tex .= "$tp &"; |
2557 | $wid = sprintf('%.1f', $$vis_widr[$j-1] * $tex_col_wid_factor); |
2557 | $wid = sprintf('%.1f', $$vis_widr[$j-1] * $tex_col_wid_factor); |
2558 | $tex_colspec .= $tex_boxed_tab ? "p{${wid}mm}|" : "p{${wid}mm}"; |
2558 | $tex_colspec .= $tex_boxed_tab ? "p{${wid}mm}|" : "p{${wid}mm}"; |
2559 | } |
2559 | } |
2560 | $colspecs .= qq(<colspec colname="c$j" colwidth="0pt"/>\n); # right extra col |
2560 | $colspecs .= qq(<colspec colname="c$j" colwidth="0pt"/>\n); # right extra col |
2561 | 2561 | ||
2562 | $dbx .= "</row>\n</thead>\n<tbody>\n"; |
2562 | $dbx .= "</row>\n</thead>\n<tbody>\n"; |
2563 | $html .= "</tr>\n"; |
2563 | $html .= "</tr>\n"; |
2564 | chop $tex; |
2564 | chop $tex; |
2565 | $tex .= $tex_tab_hdr_sep; |
2565 | $tex .= $tex_tab_hdr_sep; |
2566 | 2566 | ||
2567 | # Generate Table Body |
2567 | # Generate Table Body |
2568 | 2568 | ||
2569 | print TEX "\\message{===TAB}"; |
2569 | print TEX "\\message{===TAB}"; |
2570 | 2570 | ||
2571 | for ($rr = 0; $rr < $rows; ++$rr) { |
2571 | for ($rr = 0; $rr < $rows; ++$rr) { |
2572 | if ($$tabr[$rr][0] eq '-----') { |
2572 | if ($$tabr[$rr][0] eq '-----') { |
2573 | $tex .= "\\hline\n"; |
2573 | $tex .= "\\hline\n"; |
2574 | next; |
2574 | next; |
2575 | } |
2575 | } |
2576 | $dbx .= qq(<row>\n); |
2576 | $dbx .= qq(<row>\n); |
2577 | $html .= "<tr>\n"; |
2577 | $html .= "<tr>\n"; |
2578 | for ($j = 1; $j <= $cols; ++$j) { |
2578 | for ($j = 1; $j <= $cols; ++$j) { |
2579 | $dbx .= qq( <entry namest="c$j">) . dbx_para_raw($$tabr[$rr][$j-1]) . "</entry>\n"; |
2579 | $dbx .= qq( <entry namest="c$j">) . dbx_para_raw($$tabr[$rr][$j-1]) . "</entry>\n"; |
2580 | $html .= qq( <td$td_align{$align[$j]}>) . html_format($$tabr[$rr][$j-1]) . "</td>\n"; |
2580 | $html .= qq( <td$td_align{$align[$j]}>) . html_format($$tabr[$rr][$j-1]) . "</td>\n"; |
2581 | $tp = tex_format($$tabr[$rr][$j-1]); |
2581 | $tp = tex_format($$tabr[$rr][$j-1]); |
2582 | #$tex .= "$tp &"; |
2582 | #$tex .= "$tp &"; |
2583 | $tex .= $tex_align{$align[$j]}."$tp &"; |
2583 | $tex .= $tex_align{$align[$j]}."$tp &"; |
2584 | } |
2584 | } |
2585 | chop $tex; |
2585 | chop $tex; |
2586 | $tex .= $tex_tab_line_sep; |
2586 | $tex .= $tex_tab_line_sep; |
2587 | $dbx .= "</row>\n"; |
2587 | $dbx .= "</row>\n"; |
2588 | $html .= "</tr>\n"; |
2588 | $html .= "</tr>\n"; |
2589 | } |
2589 | } |
2590 | substr($tex, -length($tex_tab_line_sep)) = '' if $tex_tab_line_sep; |
2590 | substr($tex, -length($tex_tab_line_sep)) = '' if $tex_tab_line_sep; |
2591 | $dbx .= "</tbody>\n"; |
2591 | $dbx .= "</tbody>\n"; |
2592 | $cols += 2; # account for extra cols |
2592 | $cols += 2; # account for extra cols |
2593 | 2593 | ||
2594 | $html =~ s|<th>\s*</th>|<th> </th>|gs; # Make empty cells appear correctly on firefox |
2594 | $html =~ s|<th>\s*</th>|<th> </th>|gs; # Make empty cells appear correctly on firefox |
2595 | $html =~ s|<td>\s*</td>|<td> </td>|gs; # Make empty cells appear correctly on firefox |
2595 | $html =~ s|<td>\s*</td>|<td> </td>|gs; # Make empty cells appear correctly on firefox |
2596 | 2596 | ||
2597 | # Wrap the table into necessary top level tags |
2597 | # Wrap the table into necessary top level tags |
2598 | 2598 | ||
2599 | print TEX "\\hbadness=10000\n"; # Disable warnings |
2599 | print TEX "\\hbadness=10000\n"; # Disable warnings |
2600 | if ($table_name) { |
2600 | if ($table_name) { |
2601 | ++$table_no; |
2601 | ++$table_no; |
2602 | my $label = fold_label($table_name); |
2602 | my $label = fold_label($table_name); |
2603 | $reflist{$label} = $table_no; |
2603 | $reflist{$label} = $table_no; |
2604 | $refhtmlpage{$label} = $html2; |
2604 | $refhtmlpage{$label} = $html2; |
2605 | my $dbx_caption = dbx_format($table_name); |
2605 | my $dbx_caption = dbx_format($table_name); |
2606 | my $tex_caption = tex_caption($table_name); |
2606 | my $tex_caption = tex_caption($table_name); |
2607 | my $html_caption = html_format($table_name); |
2607 | my $html_caption = html_format($table_name); |
2608 | print DBX qq(<table id="$label" tocentry="1" frame="all"><title>$dbx_caption</title><tgroup cols="$cols" align="left">\n$colspecs$dbx</tgroup></table>\n); |
2608 | print DBX qq(<table id="$label" tocentry="1" frame="all"><title>$dbx_caption</title><tgroup cols="$cols" align="left">\n$colspecs$dbx</tgroup></table>\n); |
2609 | #print HTML qq(<p><i>$html_caption</i><br><table border=1>\n$html</table>\n); |
2609 | #print HTML qq(<p><i>$html_caption</i><br><table border=1>\n$html</table>\n); |
2610 | #print HTML2 qq(<p><i>$html_caption</i><br><table border=1>\n$html</table>\n); |
2610 | #print HTML2 qq(<p><i>$html_caption</i><br><table border=1>\n$html</table>\n); |
2611 | print HTML qq(<p>Table $table_no:<i>$html_caption</i><br><table border=0>\n$html</table>\n); |
2611 | print HTML qq(<p>Table $table_no:<i>$html_caption</i><br><table border=0>\n$html</table>\n); |
2612 | print HTML2 qq(<p>Table $table_no:<i>$html_caption</i><br><table border=0>\n$html</table>\n); |
2612 | print HTML2 qq(<p>Table $table_no:<i>$html_caption</i><br><table border=0>\n$html</table>\n); |
2613 | 2613 | ||
2614 | if ($tablekind eq 'longtable') { |
2614 | if ($tablekind eq 'longtable') { |
2615 | print TEX qq(\\begin{longtable}[$tex_flt_place]{$tex_colspec}\n$tex_caption\\label{tab:$label} \\\\ \n$tex_top_line\\endfirsthead\n\\caption[]{\\small (continuation)} \\\\ \n$tex_top_line\\endhead\n$tex\n$tex_bot_line\\end{longtable}\n); |
2615 | print TEX qq(\\begin{longtable}[$tex_flt_place]{$tex_colspec}\n$tex_caption\\label{tab:$label} \\\\ \n$tex_top_line\\endfirsthead\n\\caption[]{\\small (continuation)} \\\\ \n$tex_top_line\\endhead\n$tex\n$tex_bot_line\\end{longtable}\n); |
2616 | } elsif ($tablekind eq 'minitable') { |
2616 | } elsif ($tablekind eq 'minitable') { |
2617 | print TEX qq(\\begin{floatingtable}{\\begin{tabular}{$tex_colspec}\n$tex_top_line$tex\n$tex_bot_line\\end{tabular}}\n$tex_caption\\label{tab:$label}\n\\end{floatingtable}\n); |
2617 | print TEX qq(\\begin{floatingtable}{\\begin{tabular}{$tex_colspec}\n$tex_top_line$tex\n$tex_bot_line\\end{tabular}}\n$tex_caption\\label{tab:$label}\n\\end{floatingtable}\n); |
2618 | } elsif ($tablekind eq 'rawtable') { |
2618 | } elsif ($tablekind eq 'rawtable') { |
2619 | print TEX qq($tex_caption\\label{tab:$label}\\\\\n\\begin{tabular}{$tex_colspec}\n$tex_top_line$tex\n$tex_bot_line\\end{tabular}\n); |
2619 | print TEX qq($tex_caption\\label{tab:$label}\\\\\n\\begin{tabular}{$tex_colspec}\n$tex_top_line$tex\n$tex_bot_line\\end{tabular}\n); |
2620 | } else { |
2620 | } else { |
2621 | print TEX qq(\\begin{table}[$tex_flt_place]\n\\centering$tex_caption\\label{tab:$label}\n\\vspace{3mm}\\begin{tabular}{$tex_colspec}\n$tex_top_line$tex\n$tex_bot_line\\end{tabular}\\end{table}\n); |
2621 | print TEX qq(\\begin{table}[$tex_flt_place]\n\\centering$tex_caption\\label{tab:$label}\n\\vspace{3mm}\\begin{tabular}{$tex_colspec}\n$tex_top_line$tex\n$tex_bot_line\\end{tabular}\\end{table}\n); |
2622 | } |
2622 | } |
2623 | } else { |
2623 | } else { |
2624 | print DBX qq(<informaltable><tgroup cols="$cols" align="left">\n$colspecs$dbx</tgroup></informaltable>\n); |
2624 | print DBX qq(<informaltable><tgroup cols="$cols" align="left">\n$colspecs$dbx</tgroup></informaltable>\n); |
2625 | print HTML qq(<table border=1>\n$html</table>\n); |
2625 | print HTML qq(<table border=1>\n$html</table>\n); |
2626 | print HTML2 qq(<table border=1>\n$html</table>\n); |
2626 | print HTML2 qq(<table border=1>\n$html</table>\n); |
2627 | if ($tablekind eq 'longtable') { |
2627 | if ($tablekind eq 'longtable') { |
2628 | print TEX qq(\\begin{longtable}[$tex_flt_place]{$tex_colspec}\n$tex_top_line$tex\n$tex_bot_line\\end{longtable}\n); |
2628 | print TEX qq(\\begin{longtable}[$tex_flt_place]{$tex_colspec}\n$tex_top_line$tex\n$tex_bot_line\\end{longtable}\n); |
2629 | } elsif ($tablekind eq 'minitable') { |
2629 | } elsif ($tablekind eq 'minitable') { |
2630 | print TEX qq(\\begin{floatingtable}{\\begin{tabular}{$tex_colspec}\n$tex_top_line$tex\n$tex_bot_line\\end{tabular}}\\end{floatingtable}\n); |
2630 | print TEX qq(\\begin{floatingtable}{\\begin{tabular}{$tex_colspec}\n$tex_top_line$tex\n$tex_bot_line\\end{tabular}}\\end{floatingtable}\n); |
2631 | } elsif ($tablekind eq 'rawtable') { |
2631 | } elsif ($tablekind eq 'rawtable') { |
2632 | print TEX qq(\\begin{tabular}{$tex_colspec}\n$tex_top_line$tex\n$tex_bot_line\\end{tabular}\n); |
2632 | print TEX qq(\\begin{tabular}{$tex_colspec}\n$tex_top_line$tex\n$tex_bot_line\\end{tabular}\n); |
2633 | } else { |
2633 | } else { |
2634 | print TEX qq(\\begin{table}[$tex_flt_place]\\centering\\begin{tabular}{$tex_colspec}\n$tex_top_line$tex\n$tex_bot_line\\end{tabular}\\end{table}\n); |
2634 | print TEX qq(\\begin{table}[$tex_flt_place]\\centering\\begin{tabular}{$tex_colspec}\n$tex_top_line$tex\n$tex_bot_line\\end{tabular}\\end{table}\n); |
2635 | } |
2635 | } |
2636 | } |
2636 | } |
2637 | print TEX "\\hbadness=$hbadness\n"; # Restore normal warning level |
2637 | print TEX "\\hbadness=$hbadness\n"; # Restore normal warning level |
2638 | } |
2638 | } |
2639 | 2639 | ||
2640 | ### Comma separated values tables |
2640 | ### Comma separated values tables |
2641 | 2641 | ||
2642 | sub read_csv { |
2642 | sub read_csv { |
2643 | my ($path, $topleft, $botright, $opts) = @_; |
2643 | my ($path, $topleft, $botright, $opts) = @_; |
2644 | my ($i,$j); |
2644 | my ($i,$j); |
2645 | my $csv = readall("$path.csv", 1); |
2645 | my $csv = readall("$path.csv", 1); |
2646 | $csv =~ s/\"//g; # Zap double quotes |
2646 | $csv =~ s/\"//g; # Zap double quotes |
2647 | my @x = split /\r?\n/, $csv; |
2647 | my @x = split /\r?\n/, $csv; |
2648 | #warn "CSV0 ".Dumper \@x; |
2648 | #warn "CSV0 ".Dumper \@x; |
2649 | for ($i = 0; $i <= $#x; ++$i) { |
2649 | for ($i = 0; $i <= $#x; ++$i) { |
2650 | if ($opts eq 'pipeysep') { |
2650 | if ($opts eq 'pipeysep') { |
2651 | $x[$i] = [ split '\|', $x[$i] ]; |
2651 | $x[$i] = [ split '\|', $x[$i] ]; |
2652 | } else { |
2652 | } else { |
2653 | $x[$i] = [ split ',', $x[$i] ]; |
2653 | $x[$i] = [ split ',', $x[$i] ]; |
2654 | } |
2654 | } |
2655 | } |
2655 | } |
2656 | my ($left, $top) = $topleft =~ /^([a-z]+)(\d+)$/i; |
2656 | my ($left, $top) = $topleft =~ /^([a-z]+)(\d+)$/i; |
2657 | my ($right, $bot) = $botright =~ /^([a-z]+)(\d+)$/i; |
2657 | my ($right, $bot) = $botright =~ /^([a-z]+)(\d+)$/i; |
2658 | $left = ord(lc($left)) - ord('a'); |
2658 | $left = ord(lc($left)) - ord('a'); |
2659 | $right = ord(lc($right)) - ord('a'); |
2659 | $right = ord(lc($right)) - ord('a'); |
2660 | --$top; |
2660 | --$top; |
2661 | --$bot; |
2661 | --$bot; |
2662 | warn "csv ($left,$top), ($right,$bot)"; |
2662 | warn "csv ($left,$top), ($right,$bot)"; |
2663 | #warn "CSV1 ".Dumper \@x; |
2663 | #warn "CSV1 ".Dumper \@x; |
2664 | @x = splice @x, $top, $bot+1-$top; |
2664 | @x = splice @x, $top, $bot+1-$top; |
2665 | #warn "CSV2 ".Dumper \@x; |
2665 | #warn "CSV2 ".Dumper \@x; |
2666 | for ($i = 0; $i <= $#x; ++$i) { |
2666 | for ($i = 0; $i <= $#x; ++$i) { |
2667 | $x[$i] = [ splice(@{$x[$i]}, $left, $right+1-$left) ]; |
2667 | $x[$i] = [ splice(@{$x[$i]}, $left, $right+1-$left) ]; |
2668 | } |
2668 | } |
2669 | #warn "CSV3 ".Dumper \@x; |
2669 | #warn "CSV3 ".Dumper \@x; |
2670 | return \@x; |
2670 | return \@x; |
2671 | } |
2671 | } |
2672 | 2672 | ||
2673 | sub csv { |
2673 | sub csv { |
2674 | my ($path, $caption, $topleft, $botright, $opts) = @_; |
2674 | my ($path, $caption, $topleft, $botright, $opts) = @_; |
2675 | my $xr = read_csv($path, $topleft, $botright, $opts); |
2675 | my $xr = read_csv($path, $topleft, $botright, $opts); |
2676 | my $col_hdrr = shift @{$xr}; |
2676 | my $col_hdrr = shift @{$xr}; |
2677 | my $vis_widr = shift @{$xr}; |
2677 | my $vis_widr = shift @{$xr}; |
2678 | for (my $i = 0; $i <= $#{$vis_widr}; ++$i) { |
2678 | for (my $i = 0; $i <= $#{$vis_widr}; ++$i) { |
2679 | $$vis_widr[$i] = length($$vis_widr[$i]); |
2679 | $$vis_widr[$i] = length($$vis_widr[$i]); |
2680 | } |
2680 | } |
2681 | #warn "CSV4 ".Dumper $xr; |
2681 | #warn "CSV4 ".Dumper $xr; |
2682 | table_output($xr, $col_hdrr, $vis_widr, $#{$xr}+1, $#{$col_hdrr}+1, $table_name, ''); |
2682 | table_output($xr, $col_hdrr, $vis_widr, $#{$xr}+1, $#{$col_hdrr}+1, $table_name, ''); |
2683 | } |
2683 | } |
2684 | 2684 | ||
2685 | ### Refs |
2685 | ### Refs |
2686 | 2686 | ||
2687 | sub close_dbx_sections { |
2687 | sub close_dbx_sections { |
2688 | while ($sec_level) { |
2688 | while ($sec_level) { |
2689 | print DBX ( (' 'x$sec_level) . "</section><!--$sec_id[$sec_level]-->\n\n\n"); |
2689 | print DBX ( (' 'x$sec_level) . "</section><!--$sec_id[$sec_level]-->\n\n\n"); |
2690 | --$sec_level; |
2690 | --$sec_level; |
2691 | } |
2691 | } |
2692 | } |
2692 | } |
2693 | 2693 | ||
2694 | sub references { |
2694 | sub references { |
2695 | my ($ref_name, $ena) = @_; |
2695 | my ($ref_name, $ena) = @_; |
2696 | my ($ii, $labwid); |
2696 | my ($ii, $labwid); |
2697 | # globals: @pd, $i |
2697 | # globals: @pd, $i |
2698 | $ref_id = $dbx_ref_name = $ref_name || 'References'; |
2698 | $ref_id = $dbx_ref_name = $ref_name || 'References'; |
2699 | $ref_id =~ tr[A-Za-z0-9][_]c; |
2699 | $ref_id =~ tr[A-Za-z0-9][_]c; |
2700 | 2700 | ||
2701 | close_dbx_sections(); |
2701 | close_dbx_sections(); |
2702 | print DBX <<DBX if $ena ne ':0'; # <section id="$ref_id"><bibliography id="references-$ref_id"> |
2702 | print DBX <<DBX if $ena ne ':0'; # <section id="$ref_id"><bibliography id="references-$ref_id"> |
2703 | <bibliodiv id="references-$ref_id"> |
2703 | <bibliodiv id="references-$ref_id"> |
2704 | <title>$dbx_ref_name</title> |
2704 | <title>$dbx_ref_name</title> |
2705 | DBX |
2705 | DBX |
2706 | ; |
2706 | ; |
2707 | if ($ena ne ':0') { |
2707 | if ($ena ne ':0') { |
2708 | if ($ref_name) { |
2708 | if ($ref_name) { |
2709 | print TEX "\\renewcommand\\refname{$ref_name}\n"; # article |
2709 | print TEX "\\renewcommand\\refname{$ref_name}\n"; # article |
2710 | #print TEX "\\renewcommand\\bibname{$ref_name}\n"; # book |
2710 | #print TEX "\\renewcommand\\bibname{$ref_name}\n"; # book |
2711 | print HTML "<H2>$ref_name</H2>\n<dl>\n"; |
2711 | print HTML "<H2>$ref_name</H2>\n<dl>\n"; |
2712 | print HTML2 "<H2>$ref_name</H2>\n<dl>\n"; |
2712 | print HTML2 "<H2>$ref_name</H2>\n<dl>\n"; |
2713 | print NONL "$ref_name\n\n"; |
2713 | print NONL "$ref_name\n\n"; |
2714 | print PDSEAL "$ref_name\n\n"; |
2714 | print PDSEAL "$ref_name\n\n"; |
2715 | } else { |
2715 | } else { |
2716 | print HTML "<H2>References</H2>\n<dl>\n"; |
2716 | print HTML "<H2>References</H2>\n<dl>\n"; |
2717 | print HTML2 "<H2>References</H2>\n<dl>\n"; |
2717 | print HTML2 "<H2>References</H2>\n<dl>\n"; |
2718 | print NONL "$ref_name\n\n"; |
2718 | print NONL "$ref_name\n\n"; |
2719 | print PDSEAL "$ref_name\n\n"; |
2719 | print PDSEAL "$ref_name\n\n"; |
2720 | } |
2720 | } |
2721 | } |
2721 | } |
2722 | 2722 | ||
2723 | $labwid = 4; |
2723 | $labwid = 4; |
2724 | for ($ii = $i+1; $ii<=$#pd && $pd[$ii] !~ /^>>/; ++$ii) { |
2724 | for ($ii = $i+1; $ii<=$#pd && $pd[$ii] !~ /^>>/; ++$ii) { |
2725 | warn "$ii: $pd[$i]" if $trace>1; |
2725 | warn "$ii: $pd[$i]" if $trace>1; |
2726 | if (($lab,$rest) = $pd[$i] =~ /^\s*\[(.*?)\]\s+(.*?)\s*$/) { |
2726 | if (($lab,$rest) = $pd[$i] =~ /^\s*\[(.*?)\]\s+(.*?)\s*$/) { |
2727 | $labwid = length($lab) if length($lab) > $labwid; |
2727 | $labwid = length($lab) if length($lab) > $labwid; |
2728 | } |
2728 | } |
2729 | } |
2729 | } |
2730 | 2730 | ||
2731 | print TEX "\\begin{thebibliography}{XXXX".('X'x$labwid)."}\n" if $ena ne ':0'; |
2731 | print TEX "\\begin{thebibliography}{XXXX".('X'x$labwid)."}\n" if $ena ne ':0'; |
2732 | for (++$i; $i<=$#pd && $pd[$i] !~ /^>>/; ++$i) { |
2732 | for (++$i; $i<=$#pd && $pd[$i] !~ /^>>/; ++$i) { |
2733 | warn "$i: $pd[$i]" if $trace>1; |
2733 | warn "$i: $pd[$i]" if $trace>1; |
2734 | next if $ena eq ':0'; |
2734 | next if $ena eq ':0'; |
2735 | 2735 | ||
2736 | print NONL $pd[$i]; |
2736 | print NONL $pd[$i]; |
2737 | print PDSEAL $pd[$i]; |
2737 | print PDSEAL $pd[$i]; |
2738 | if (($lab,$rest) = $pd[$i] =~ /^\s*\[(.*?)\]\s+(.*?)\s*$/) { |
2738 | if (($lab,$rest) = $pd[$i] =~ /^\s*\[(.*?)\]\s+(.*?)\s*$/) { |
2739 | $lab = tex_esc($lab); |
2739 | $lab = tex_esc($lab); |
2740 | $rest = tex_esc($rest); |
2740 | $rest = tex_esc($rest); |
2741 | print DBX qq( <bibliomixed id="$lab"/>\n); |
2741 | print DBX qq( <bibliomixed id="$lab"/>\n); |
2742 | print TEX "\\bibitem[$lab]{$lab} $rest\n"; |
2742 | print TEX "\\bibitem[$lab]{$lab} $rest\n"; |
2743 | print HTML qq(<dt>[<a id="$lab" class=ref>$lab</a>] <dd>$rest\n); |
2743 | print HTML qq(<dt>[<a id="$lab" class=ref>$lab</a>] <dd>$rest\n); |
2744 | print HTML2 qq(<dt>[<a id="$lab" class=ref>$lab</a>] <dd>$rest\n); |
2744 | print HTML2 qq(<dt>[<a id="$lab" class=ref>$lab</a>] <dd>$rest\n); |
2745 | } else { |
2745 | } else { |
2746 | $rest = tex_esc($pd[$i]); |
2746 | $rest = tex_esc($pd[$i]); |
2747 | print TEX "$rest\n"; |
2747 | print TEX "$rest\n"; |
2748 | print HTML "$pd[$i]\n"; |
2748 | print HTML "$pd[$i]\n"; |
2749 | print HTML2 "$pd[$i]\n"; |
2749 | print HTML2 "$pd[$i]\n"; |
2750 | } |
2750 | } |
2751 | } |
2751 | } |
2752 | ++$i; |
2752 | ++$i; |
2753 | if ($ena ne ':0') { |
2753 | if ($ena ne ':0') { |
2754 | #print DBX qq(</bibliography>\n </section>\n); |
2754 | #print DBX qq(</bibliography>\n </section>\n); |
2755 | print DBX qq(</bibliodiv>\n); |
2755 | print DBX qq(</bibliodiv>\n); |
2756 | print TEX "\\end{thebibliography}\n"; |
2756 | print TEX "\\end{thebibliography}\n"; |
2757 | print HTML "</dl>\n"; |
2757 | print HTML "</dl>\n"; |
2758 | print HTML2 "</dl>\n"; |
2758 | print HTML2 "</dl>\n"; |
2759 | } |
2759 | } |
2760 | } |
2760 | } |
2761 | 2761 | ||
2762 | # Output verbatim material to all output streams, even to an external file |
2762 | # Output verbatim material to all output streams, even to an external file |
2763 | 2763 | ||
2764 | sub unindented_code { |
2764 | sub unindented_code { |
2765 | my ($filespec, $first) = @_; |
2765 | my ($filespec, $first) = @_; |
2766 | if ($filespec) { |
2766 | if ($filespec) { |
2767 | open OUT, ">$filespec" or die "Can't write file($filespec): $!"; |
2767 | open OUT, ">$filespec" or die "Can't write file($filespec): $!"; |
2768 | } |
2768 | } |
2769 | print DBX dbx_entity_escape_lite($first) if $first; |
2769 | print DBX dbx_entity_escape_lite($first) if $first; |
2770 | print NONL $first if $first; |
2770 | print NONL $first if $first; |
2771 | print PDSEAL $first if $first; |
2771 | print PDSEAL $first if $first; |
2772 | print RTF $first if $first; |
2772 | print RTF $first if $first; |
2773 | print HTML $first if $first; |
2773 | print HTML $first if $first; |
2774 | print HTML2 $first if $first; |
2774 | print HTML2 $first if $first; |
2775 | print OUT $first if $first && $filespec; |
2775 | print OUT $first if $first && $filespec; |
2776 | print TEX tex_esc_verbatim($first."\n") if $first; |
2776 | print TEX tex_esc_verbatim($first."\n") if $first; |
2777 | for (++$i; $pd[$i] !~ /^>>/; ++$i) { |
2777 | for (++$i; $pd[$i] !~ /^>>/; ++$i) { |
2778 | print DBX dbx_entity_escape_lite($pd[$i])."\n"; |
2778 | print DBX dbx_entity_escape_lite($pd[$i])."\n"; |
2779 | print NONL $pd[$i]."\n"; |
2779 | print NONL $pd[$i]."\n"; |
2780 | print PDSEAL $pd[$i]."\n"; |
2780 | print PDSEAL $pd[$i]."\n"; |
2781 | print RTF $pd[$i]."\n"; |
2781 | print RTF $pd[$i]."\n"; |
2782 | print HTML $pd[$i]."\n"; |
2782 | print HTML $pd[$i]."\n"; |
2783 | print HTML2 $pd[$i]."\n"; |
2783 | print HTML2 $pd[$i]."\n"; |
2784 | print OUT $pd[$i]."\n" if $filespec; |
2784 | print OUT $pd[$i]."\n" if $filespec; |
2785 | #print TEX (tex_esc_verbatim($pd[$i])."\n"); |
2785 | #print TEX (tex_esc_verbatim($pd[$i])."\n"); |
2786 | my $x = $pd[$i]; # Line wrap code from fjon |
2786 | my $x = $pd[$i]; # Line wrap code from fjon |
2787 | while(length($x) > $maxlogline){ |
2787 | while(length($x) > $maxlogline){ |
2788 | print TEX (tex_esc_verbatim(substr($x,0,$maxlogline-1))."\\\n"); |
2788 | print TEX (tex_esc_verbatim(substr($x,0,$maxlogline-1))."\\\n"); |
2789 | $x = substr($x, ($maxlogline-1), length($x)); |
2789 | $x = substr($x, ($maxlogline-1), length($x)); |
2790 | } |
2790 | } |
2791 | print TEX (tex_esc_verbatim($x)."\n"); |
2791 | print TEX (tex_esc_verbatim($x)."\n"); |
2792 | } |
2792 | } |
2793 | close OUT; |
2793 | close OUT; |
2794 | } |
2794 | } |
2795 | 2795 | ||
2796 | sub code { |
2796 | sub code { |
2797 | my ($first_line) = @_; |
2797 | my ($first_line) = @_; |
2798 | my ($ind) = $pd[$i] =~ /^(\s+)/; |
2798 | my ($ind) = $pd[$i] =~ /^(\s+)/; |
2799 | my $code = $pd[$i] . "\n"; |
2799 | my $code = $pd[$i] . "\n"; |
2800 | #warn "CODE0($code)"; |
2800 | #warn "CODE0($code)"; |
2801 | for (++$i; |
2801 | for (++$i; |
2802 | ($i<=$#pd) && ((substr($pd[$i],0,length($ind)) eq $ind) || $pd[$i]=~/^\s*$/); |
2802 | ($i<=$#pd) && ((substr($pd[$i],0,length($ind)) eq $ind) || $pd[$i]=~/^\s*$/); |
2803 | ++$i) { |
2803 | ++$i) { |
2804 | warn "$i code $#pd: line($pd[$i])" if $trace>2; |
2804 | warn "$i code $#pd: line($pd[$i])" if $trace>2; |
2805 | $code .= $pd[$i] . "\n"; |
2805 | $code .= $pd[$i] . "\n"; |
2806 | } |
2806 | } |
2807 | if ($first_line =~ /^NOTE: (.*)$/) { |
2807 | if ($first_line =~ /^NOTE: (.*)$/) { |
2808 | $first_line = $1; |
2808 | $first_line = $1; |
2809 | $code =~ s/^\s*NOTE: .*?\n//s; |
2809 | $code =~ s/^\s*NOTE: .*?\n//s; |
2810 | my $dbx_code = dbx_para($code); |
2810 | my $dbx_code = dbx_para($code); |
2811 | my $tex_code = tex_para($code); |
2811 | my $tex_code = tex_para($code); |
2812 | print DBX qq(<note><title>$first_line</title>$dbx_code</note>\n); |
2812 | print DBX qq(<note><title>$first_line</title>$dbx_code</note>\n); |
2813 | print TEX qq(\\quote{\\emph{$first_line}\n$tex_code}\n); |
2813 | print TEX qq(\\quote{\\emph{$first_line}\n$tex_code}\n); |
2814 | return; |
2814 | return; |
2815 | } |
2815 | } |
2816 | print NONL $code; |
2816 | print NONL $code; |
2817 | print PDSEAL $code; |
2817 | print PDSEAL $code; |
2818 | print DBX "$code_open_tag<![CDATA[".dbx_entity_escape_lite($code)."]]>$code_close_tag\n"; |
2818 | print DBX "$code_open_tag<![CDATA[".dbx_entity_escape_lite($code)."]]>$code_close_tag\n"; |
2819 | #warn "CODE($code)"; |
2819 | #warn "CODE($code)"; |
2820 | $code = tex_esc_verbatim($code); |
2820 | $code = tex_esc_verbatim($code); |
2821 | #warn "CODE1($code)"; |
2821 | #warn "CODE1($code)"; |
2822 | $code =~ s/(\r?\n)+$//gs; |
2822 | $code =~ s/(\r?\n)+$//gs; |
2823 | #warn "CODE2($code)"; |
2823 | #warn "CODE2($code)"; |
2824 | print TEX "\\begin{verbatim}$code\\end{verbatim}\n\n"; |
2824 | print TEX "\\begin{verbatim}$code\\end{verbatim}\n\n"; |
2825 | $code =~ s/</</g; |
2825 | $code =~ s/</</g; |
2826 | print HTML "<pre>$code</pre>\n"; |
2826 | print HTML "<pre>$code</pre>\n"; |
2827 | print HTML2 "<pre>$code</pre>\n"; |
2827 | print HTML2 "<pre>$code</pre>\n"; |
2828 | } |
2828 | } |
2829 | 2829 | ||
2830 | sub blockquote { |
2830 | sub blockquote { |
2831 | my ($first_line) = @_; |
2831 | my ($first_line) = @_; |
2832 | my ($ind) = $pd[$i] =~ /^(\s*> )/; |
2832 | my ($ind) = $pd[$i] =~ /^(\s*> )/; |
2833 | my $len_ind = length($ind); |
2833 | my $len_ind = length($ind); |
2834 | my $code = $first_line; |
2834 | my $code = $first_line; |
2835 | my ($dbx_quote, $tex_quote, $html_quote, $rtf_quote); |
2835 | my ($dbx_quote, $tex_quote, $html_quote, $rtf_quote); |
2836 | for (++$i; ($i<=$#pd) && (substr($pd[$i],0,$len_ind) eq $ind); ++$i) { |
2836 | for (++$i; ($i<=$#pd) && (substr($pd[$i],0,$len_ind) eq $ind); ++$i) { |
2837 | warn "$i: $pd[$i]" if $trace; |
2837 | warn "$i: $pd[$i]" if $trace; |
2838 | $line = substr($pd[$i], $len_ind-1); # include space between lines |
2838 | $line = substr($pd[$i], $len_ind-1); # include space between lines |
2839 | if ($line =~ /^\s*$/) { # empty line signifies paragraph break |
2839 | if ($line =~ /^\s*$/) { # empty line signifies paragraph break |
2840 | $dbx_quote .= dbx_para($code) . "\n\n"; |
2840 | $dbx_quote .= dbx_para($code) . "\n\n"; |
2841 | $tex_quote .= tex_para($code) . "\n\n"; |
2841 | $tex_quote .= tex_para($code) . "\n\n"; |
2842 | $code = ''; |
2842 | $code = ''; |
2843 | } else { |
2843 | } else { |
2844 | $code .= $line; |
2844 | $code .= $line; |
2845 | } |
2845 | } |
2846 | } |
2846 | } |
2847 | print NONL $code; |
2847 | print NONL $code; |
2848 | print PDSEAL $code; |
2848 | print PDSEAL $code; |
2849 | $dbx_quote .= dbx_para($code); |
2849 | $dbx_quote .= dbx_para($code); |
2850 | print DBX "<blockquote>$dbx_quote</blockquote>\n"; |
2850 | print DBX "<blockquote>$dbx_quote</blockquote>\n"; |
2851 | 2851 | ||
2852 | $rtf_quote .= rtf_format($code); |
2852 | $rtf_quote .= rtf_format($code); |
2853 | print RTF "{\\pard $rtf_styles{'s21'} \\s21\n$rtf_quote\\par}\n"; |
2853 | print RTF "{\\pard $rtf_styles{'s21'} \\s21\n$rtf_quote\\par}\n"; |
2854 | 2854 | ||
2855 | $html_quote .= html_format($code); |
2855 | $html_quote .= html_format($code); |
2856 | print HTML "<blockquote>$html_quote</blockquote>\n"; |
2856 | print HTML "<blockquote>$html_quote</blockquote>\n"; |
2857 | print HTML2 "<blockquote>$html_quote</blockquote>\n"; |
2857 | print HTML2 "<blockquote>$html_quote</blockquote>\n"; |
2858 | 2858 | ||
2859 | $tex_quote .= tex_format($code); |
2859 | $tex_quote .= tex_format($code); |
2860 | print TEX "\\begin{quote}$tex_quote\n\\end{quote}\n"; |
2860 | print TEX "\\begin{quote}$tex_quote\n\\end{quote}\n"; |
2861 | } |
2861 | } |
2862 | 2862 | ||
2863 | ### |
2863 | ### |
2864 | ### Material from fjon, some very specific to ocean wave simulation |
2864 | ### Material from fjon, some very specific to ocean wave simulation |
2865 | ### |
2865 | ### |
2866 | 2866 | ||
2867 | sub desvar { |
2867 | sub desvar { |
2868 | # Extract design variables from ocean script |
2868 | # Extract design variables from ocean script |
2869 | # Put variables in table |
2869 | # Put variables in table |
2870 | 2870 | ||
2871 | my($filename,$comment) = @_; |
2871 | my($filename,$comment) = @_; |
2872 | open(INFILE, $filename) or warn "Can't open desvar file '$filename':$!"; |
2872 | open(INFILE, $filename) or warn "Can't open desvar file '$filename':$!"; |
2873 | 2873 | ||
2874 | my $x_html = "<p><i>" . html_format($comment) . "</i><br><table>\n" . |
2874 | my $x_html = "<p><i>" . html_format($comment) . "</i><br><table>\n" . |
2875 | "<tr><th>Variable</th><th>Value</th><th>Comment</th></tr>\n"; |
2875 | "<tr><th>Variable</th><th>Value</th><th>Comment</th></tr>\n"; |
2876 | print HTML $x_html; |
2876 | print HTML $x_html; |
2877 | print HTML2 $x_html; |
2877 | print HTML2 $x_html; |
2878 | my $x_comm = tex_format($comment); |
2878 | my $x_comm = tex_format($comment); |
2879 | my $x_tex = <<TEX; |
2879 | my $x_tex = <<TEX; |
2880 | \\begin{longtable}[ht]{|l|l|l|} |
2880 | \\begin{longtable}[ht]{|l|l|l|} |
2881 | \\caption{\\small $x_comm}\\\\ |
2881 | \\caption{\\small $x_comm}\\\\ |
2882 | \\endfirsthead |
2882 | \\endfirsthead |
2883 | \\caption[]{\\small (continuation)} \\\\ |
2883 | \\caption[]{\\small (continuation)} \\\\ |
2884 | \\endhead |
2884 | \\endhead |
2885 | \\hline |
2885 | \\hline |
2886 | Variable & Value & comment \\\\\\hline\\hline |
2886 | Variable & Value & comment \\\\\\hline\\hline |
2887 | TEX |
2887 | TEX |
2888 | ; |
2888 | ; |
2889 | print TEX $x_tex; |
2889 | print TEX $x_tex; |
2890 | 2890 | ||
2891 | $/ = "\n"; # Disable "slurp" mode |
2891 | $/ = "\n"; # Disable "slurp" mode |
2892 | while(<INFILE>) { |
2892 | while(<INFILE>) { |
2893 | # 1 1 2 2 3 3 |
2893 | # 1 1 2 2 3 3 |
2894 | if( /^;?desVar\(\s*\"(\w*)\"\s*(.*)\s*\)\s*;?\s*(\w.*)?/ ) { |
2894 | if( /^;?desVar\(\s*\"(\w*)\"\s*(.*)\s*\)\s*;?\s*(\w.*)?/ ) { |
2895 | $x_html = "<tr><td>" . html_format($1) . "</td><td>" . |
2895 | $x_html = "<tr><td>" . html_format($1) . "</td><td>" . |
2896 | $2 . "</td><td>" . html_format($3) . |
2896 | $2 . "</td><td>" . html_format($3) . |
2897 | " </td></tr>\n"; |
2897 | " </td></tr>\n"; |
2898 | print HTML $x_html; |
2898 | print HTML $x_html; |
2899 | print HTML2 $x_html; |
2899 | print HTML2 $x_html; |
2900 | print TEX tex_format($1)." & ".tex_format($2)." & ".tex_format($3). |
2900 | print TEX tex_format($1)." & ".tex_format($2)." & ".tex_format($3). |
2901 | "\\\\\n\\hline\n"; |
2901 | "\\\\\n\\hline\n"; |
2902 | } |
2902 | } |
2903 | } |
2903 | } |
2904 | close(INFILE); |
2904 | close(INFILE); |
2905 | print HTML "</table>\n"; |
2905 | print HTML "</table>\n"; |
2906 | print HTML2 "</table>\n"; |
2906 | print HTML2 "</table>\n"; |
2907 | print TEX "\\end{longtable}\n"; |
2907 | print TEX "\\end{longtable}\n"; |
2908 | undef $/; # Enable "slurp" mode again |
2908 | undef $/; # Enable "slurp" mode again |
2909 | } |
2909 | } |
2910 | 2910 | ||
2911 | sub plot_waves { |
2911 | sub plot_waves { |
2912 | my $corners = '*'; |
2912 | my $corners = '*'; |
2913 | my $subdir = '*'; |
2913 | my $subdir = '*'; |
2914 | # for (++$i; $pd[$i] !~ /^>>/; ++$i) { |
2914 | # for (++$i; $pd[$i] !~ /^>>/; ++$i) { |
2915 | my $continue = 1; |
2915 | my $continue = 1; |
2916 | my $found = 0; |
2916 | my $found = 0; |
2917 | my $gnuplotcmd = ""; |
2917 | my $gnuplotcmd = ""; |
2918 | while($continue == 1){ |
2918 | while($continue == 1){ |
2919 | if($pd[$i] =~ /^(un)?set (.*)/) { |
2919 | if($pd[$i] =~ /^(un)?set (.*)/) { |
2920 | $gnuplotcmd .= "$1set $2\n"; |
2920 | $gnuplotcmd .= "$1set $2\n"; |
2921 | } elsif($pd[$i] =~ /^(\S*)=(.*)/) { |
2921 | } elsif($pd[$i] =~ /^(\S*)=(.*)/) { |
2922 | if($1 eq "corners") { |
2922 | if($1 eq "corners") { |
2923 | $corners = $2; |
2923 | $corners = $2; |
2924 | } elsif($1 eq "dir") { |
2924 | } elsif($1 eq "dir") { |
2925 | $subdir = $2; |
2925 | $subdir = $2; |
2926 | } |
2926 | } |
2927 | } else { |
2927 | } else { |
2928 | my ($in_line) = ($pd[$i] =~ /(?:<<plot:)?([^>]*)/); |
2928 | my ($in_line) = ($pd[$i] =~ /(?:<<plot:)?([^>]*)/); |
2929 | my ($plot,$comment) = split(/:/, $in_line); |
2929 | my ($plot,$comment) = split(/:/, $in_line); |
2930 | if(!$plot) { next; } |
2930 | if(!$plot) { next; } |
2931 | my ($wavedef, $title, $xlabel, $ylabel, $plot_opt) = split(/,/,$plot); |
2931 | my ($wavedef, $title, $xlabel, $ylabel, $plot_opt) = split(/,/,$plot); |
2932 | 2932 | ||
2933 | @wavelist = split(/&/, $wavedef); |
2933 | @wavelist = split(/&/, $wavedef); |
2934 | 2934 | ||
2935 | @plotcmd = (); |
2935 | @plotcmd = (); |
2936 | $n_plots = 0; |
2936 | $n_plots = 0; |
2937 | $newest_file = 0; |
2937 | $newest_file = 0; |
2938 | @waves = (); |
2938 | @waves = (); |
2939 | foreach(@wavelist){ |
2939 | foreach(@wavelist){ |
2940 | # ($wave, $wave_corners) = /([\w-]*)(?:\((.*)\))?/; |
2940 | # ($wave, $wave_corners) = /([\w-]*)(?:\((.*)\))?/; |
2941 | my ($wave, $wave_corners, $caption) = /([\w-]*)(?:\((.*)\))?(?:\"(.*)\")?/; |
2941 | my ($wave, $wave_corners, $caption) = /([\w-]*)(?:\((.*)\))?(?:\"(.*)\")?/; |
2942 | if(!$caption){ |
2942 | if(!$caption){ |
2943 | $caption = $wave; |
2943 | $caption = $wave; |
2944 | } |
2944 | } |
2945 | @waves = (@waves, $wave); |
2945 | @waves = (@waves, $wave); |
2946 | 2946 | ||
2947 | $found = 0; |
2947 | $found = 0; |
2948 | if($wave_corners){ |
2948 | if($wave_corners){ |
2949 | @cornerlist = split(/\s/,$wave_corners); |
2949 | @cornerlist = split(/\s/,$wave_corners); |
2950 | } else { |
2950 | } else { |
2951 | @cornerlist = split(/\s/,$corners); |
2951 | @cornerlist = split(/\s/,$corners); |
2952 | } |
2952 | } |
2953 | 2953 | ||
2954 | # Count number of files |
2954 | # Count number of files |
2955 | my $file_count = 0; |
2955 | my $file_count = 0; |
2956 | foreach(@cornerlist){ |
2956 | foreach(@cornerlist){ |
2957 | $corner = $_; |
2957 | $corner = $_; |
2958 | @files = <$subdir/$corner/$wave>; |
2958 | @files = <$subdir/$corner/$wave>; |
2959 | foreach(@files){ |
2959 | foreach(@files){ |
2960 | $file = $_; |
2960 | $file = $_; |
2961 | if(-e $file){ |
2961 | if(-e $file){ |
2962 | $file_count++; |
2962 | $file_count++; |
2963 | } |
2963 | } |
2964 | } |
2964 | } |
2965 | } |
2965 | } |
2966 | 2966 | ||
2967 | # Create plots commands |
2967 | # Create plots commands |
2968 | foreach(@cornerlist){ |
2968 | foreach(@cornerlist){ |
2969 | $corner = $_; |
2969 | $corner = $_; |
2970 | @files = <$subdir/$corner/$wave>; |
2970 | @files = <$subdir/$corner/$wave>; |
2971 | # Removed search of data in non-testbench directory |
2971 | # Removed search of data in non-testbench directory |
2972 | # if($subdir eq '*'){ |
2972 | # if($subdir eq '*'){ |
2973 | # @files = (@files, <$corner/$wave>); |
2973 | # @files = (@files, <$corner/$wave>); |
2974 | # } |
2974 | # } |
2975 | foreach(@files){ |
2975 | foreach(@files){ |
2976 | $file = $_; |
2976 | $file = $_; |
2977 | if(-e $file){ |
2977 | if(-e $file){ |
2978 | print "Exist:$file\n"; |
2978 | print "Exist:$file\n"; |
2979 | $timestamp = (stat($file))[9]; |
2979 | $timestamp = (stat($file))[9]; |
2980 | if($timestamp > $newest_file){ |
2980 | if($timestamp > $newest_file){ |
2981 | $newest_file = $timestamp; |
2981 | $newest_file = $timestamp; |
2982 | } |
2982 | } |
2983 | print "Number of files @files\n"; |
2983 | print "Number of files @files\n"; |
2984 | if($file_count == 1){ |
2984 | if($file_count == 1){ |
2985 | # Only one corner, don't include corner in caption |
2985 | # Only one corner, don't include corner in caption |
2986 | @plotcmd = (@plotcmd, |
2986 | @plotcmd = (@plotcmd, |
2987 | "\"$file\" title \"$caption\" $plot_opt"); |
2987 | "\"$file\" title \"$caption\" $plot_opt"); |
2988 | } else { |
2988 | } else { |
2989 | ($corn) = ($file =~ /\w*\/(.*)\/\w*/); |
2989 | ($corn) = ($file =~ /\w*\/(.*)\/\w*/); |
2990 | @plotcmd = (@plotcmd, |
2990 | @plotcmd = (@plotcmd, |
2991 | "\"$file\" title \"$caption:$corn\" $plot_opt"); |
2991 | "\"$file\" title \"$caption:$corn\" $plot_opt"); |
2992 | } |
2992 | } |
2993 | $n_plots++; |
2993 | $n_plots++; |
2994 | $found = 1; |
2994 | $found = 1; |
2995 | } |
2995 | } |
2996 | } |
2996 | } |
2997 | } |
2997 | } |
2998 | if($found == 0) { |
2998 | if($found == 0) { |
2999 | print HTML "<error:Missing waveform $wave>"; |
2999 | print HTML "<error:Missing waveform $wave>"; |
3000 | } |
3000 | } |
3001 | } |
3001 | } |
3002 | 3002 | ||
3003 | $filename = join('', @waves); |
3003 | $filename = join('', @waves); |
3004 | if($subdir ne '*'){ |
3004 | if($subdir ne '*'){ |
3005 | $filename = $filename."-".$subdir; |
3005 | $filename = $filename."-".$subdir; |
3006 | } |
3006 | } |
3007 | if($cornerlist[0] ne '*'){ |
3007 | if($cornerlist[0] ne '*'){ |
3008 | $filename = $filename."-".join('',@cornerlist); |
3008 | $filename = $filename."-".join('',@cornerlist); |
3009 | } |
3009 | } |
3010 | 3010 | ||
3011 | if($n_plots == 0){ |
3011 | if($n_plots == 0){ |
3012 | @plotcmd = ("0"); |
3012 | @plotcmd = ("0"); |
3013 | } |
3013 | } |
3014 | 3014 | ||
3015 | open GNUPLOT,">.pd/cmdfile.gnuplot"; |
3015 | open GNUPLOT,">.pd/cmdfile.gnuplot"; |
3016 | warn "Writing .pd/cmdfile.gnuplot"; |
3016 | warn "Writing .pd/cmdfile.gnuplot"; |
3017 | print GNUPLOT "reset\n". |
3017 | print GNUPLOT "reset\n". |
3018 | "set terminal postscript eps color dashed\n". |
3018 | "set terminal postscript eps color dashed\n". |
3019 | "set data style lines\n". |
3019 | "set data style lines\n". |
3020 | "set grid\n". |
3020 | "set grid\n". |
3021 | "set autoscale xy\n". |
3021 | "set autoscale xy\n". |
3022 | # "set title \"$title\"\n". |
3022 | # "set title \"$title\"\n". |
3023 | "set xlabel \"$xlabel\"\n". |
3023 | "set xlabel \"$xlabel\"\n". |
3024 | "set ylabel \"$ylabel\"\n". |
3024 | "set ylabel \"$ylabel\"\n". |
3025 | "set output 'tex/$filename.eps'\n". |
3025 | "set output 'tex/$filename.eps'\n". |
3026 | "$gnuplotcmd". |
3026 | "$gnuplotcmd". |
3027 | "plot ".join(",", @plotcmd)."\n"; |
3027 | "plot ".join(",", @plotcmd)."\n"; |
3028 | close GNUPLOT; |
3028 | close GNUPLOT; |
3029 | 3029 | ||
3030 | $gnuplotcmd = ""; |
3030 | $gnuplotcmd = ""; |
3031 | $newplot = 0; |
3031 | $newplot = 0; |
3032 | $cmdfile = ".pd/$filename.gnuplot"; |
3032 | $cmdfile = ".pd/$filename.gnuplot"; |
3033 | if((-e $cmdfile) && |
3033 | if((-e $cmdfile) && |
3034 | ($newest_file < (stat($cmdfile))[9]) && |
3034 | ($newest_file < (stat($cmdfile))[9]) && |
3035 | (system("diff $cmdfile .pd/cmdfile.gnuplot") eq "0")) { |
3035 | (system("diff $cmdfile .pd/cmdfile.gnuplot") eq "0")) { |
3036 | 3036 | ||
3037 | warn("Nothing changed in [".join(' ',@waves)."]\n"); |
3037 | warn("Nothing changed in [".join(' ',@waves)."]\n"); |
3038 | $newplot = 0; |
3038 | $newplot = 0; |
3039 | } else { |
3039 | } else { |
3040 | warn("Creating plot [".join(' ',@waves)."]\n"); |
3040 | warn("Creating plot [".join(' ',@waves)."]\n"); |
3041 | system("mv .pd/cmdfile.gnuplot $cmdfile"); |
3041 | system("mv .pd/cmdfile.gnuplot $cmdfile"); |
3042 | system('gnuplot',"$cmdfile"); |
3042 | system('gnuplot',"$cmdfile"); |
3043 | system('epstopdf',"tex/$filename.eps"); |
3043 | system('epstopdf',"tex/$filename.eps"); |
3044 | $newplot = 1; |
3044 | $newplot = 1; |
3045 | } |
3045 | } |
3046 | 3046 | ||
3047 | if((!-e "$htmldir$filename.png") || $newplot){ |
3047 | if((!-e "$htmldir$filename.png") || $newplot){ |
3048 | system('convert',"-density","100x100","tex/$filename.eps", |
3048 | system('convert',"-density","100x100","tex/$filename.eps", |
3049 | "$htmldir$filename.png"); |
3049 | "$htmldir$filename.png"); |
3050 | } |
3050 | } |
3051 | if((!-e "$htmldir$filename"."-zoom.png") || $newplot){ |
3051 | if((!-e "$htmldir$filename"."-zoom.png") || $newplot){ |
3052 | system('convert',"-density","200x200","tex/$filename.eps", |
3052 | system('convert',"-density","200x200","tex/$filename.eps", |
3053 | "$htmldir$filename"."-zoom.png"); |
3053 | "$htmldir$filename"."-zoom.png"); |
3054 | } |
3054 | } |
3055 | if((!-e "tex/$filename.pdf") || $newplot){ |
3055 | if((!-e "tex/$filename.pdf") || $newplot){ |
3056 | # system('ps2pdf',"tex/$filename.eps","tex/$filename.pdf"); |
3056 | # system('ps2pdf',"tex/$filename.eps","tex/$filename.pdf"); |
3057 | } |
3057 | } |
3058 | ++$img_no; |
3058 | ++$img_no; |
3059 | $refname = fold_label($filename); |
3059 | $refname = fold_label($filename); |
3060 | $reflist{$refname} = $img_no; |
3060 | $reflist{$refname} = $img_no; |
3061 | $refhtmlpage{$refname} = $html2; |
3061 | $refhtmlpage{$refname} = $html2; |
3062 | my $html_caption = "<p><a href=\"$filename"."-zoom.png\" ". |
3062 | my $html_caption = "<p><a href=\"$filename"."-zoom.png\" ". |
3063 | "id=\"$refname\"><img src=\"$filename.png\"></a><br>". |
3063 | "id=\"$refname\"><img src=\"$filename.png\"></a><br>". |
3064 | "Fig-$img_no: <i>".html_format($title)."</i></p>\n"; |
3064 | "Fig-$img_no: <i>".html_format($title)."</i></p>\n"; |
3065 | print HTML $html_caption; |
3065 | print HTML $html_caption; |
3066 | print HTML2 $html_caption; |
3066 | print HTML2 $html_caption; |
3067 | 3067 | ||
3068 | my $tex_caption = tex_caption($title); |
3068 | my $tex_caption = tex_caption($title); |
3069 | print TEX "\\begin{figure}[ht]\n\\center\\includegraphics[totalheight=3.5in]". |
3069 | print TEX "\\begin{figure}[ht]\n\\center\\includegraphics[totalheight=3.5in]". |
3070 | "{$filename.pdf}\n$tex_caption\n". |
3070 | "{$filename.pdf}\n$tex_caption\n". |
3071 | "\\label{$refname}\\end{figure}\n"; |
3071 | "\\label{$refname}\\end{figure}\n"; |
3072 | } |
3072 | } |
3073 | 3073 | ||
3074 | } continue { |
3074 | } continue { |
3075 | if($pd[$i] =~ />>$/) { |
3075 | if($pd[$i] =~ />>$/) { |
3076 | $continue = 0; |
3076 | $continue = 0; |
3077 | } |
3077 | } |
3078 | $i++; |
3078 | $i++; |
3079 | } |
3079 | } |
3080 | # print TEX "\\pagestyle{fancy}\n"; |
3080 | # print TEX "\\pagestyle{fancy}\n"; |
3081 | $sec_float_obj++; |
3081 | $sec_float_obj++; |
3082 | } |
3082 | } |
3083 | 3083 | ||
3084 | sub print_data { |
3084 | sub print_data { |
3085 | my $corners = '*'; |
3085 | my $corners = '*'; |
3086 | my $subdir = '*'; |
3086 | my $subdir = '*'; |
3087 | my $continue = 1; |
3087 | my $continue = 1; |
3088 | my $firstdata = 1; |
3088 | my $firstdata = 1; |
3089 | 3089 | ||
3090 | my ($cmd,$table_caption,$label) = split(/:/, $pd[$i++]); |
3090 | my ($cmd,$table_caption,$label) = split(/:/, $pd[$i++]); |
3091 | ++$table_no; |
3091 | ++$table_no; |
3092 | if(!$label) { |
3092 | if(!$label) { |
3093 | $label = "table_$table_no"; |
3093 | $label = "table_$table_no"; |
3094 | } |
3094 | } |
3095 | my $ref = fold_label($label); |
3095 | my $ref = fold_label($label); |
3096 | $reflist{$ref} = $table_no; |
3096 | $reflist{$ref} = $table_no; |
3097 | $refhtmlpage{$ref} = $html2; |
3097 | $refhtmlpage{$ref} = $html2; |
3098 | 3098 | ||
3099 | # print table head |
3099 | # print table head |
3100 | $html = "<p><a id=\"$ref\"></a><br>". |
3100 | $html = "<p><a id=\"$ref\"></a><br>". |
3101 | "<table border=0>\n" . |
3101 | "<table border=0>\n" . |
3102 | "<tr><th rowspan=\"2\">Parameter</th><th colspan=\"3\">Spec</th>". |
3102 | "<tr><th rowspan=\"2\">Parameter</th><th colspan=\"3\">Spec</th>". |
3103 | "<th colspan=\"3\">Result</th><th rowspan=\"2\">Unit</th><th rowspan=\"2\">Pass</th></tr>\n". |
3103 | "<th colspan=\"3\">Result</th><th rowspan=\"2\">Unit</th><th rowspan=\"2\">Pass</th></tr>\n". |
3104 | "<tr><th>Min</th><th>Typ</th><th>Max</th>". |
3104 | "<tr><th>Min</th><th>Typ</th><th>Max</th>". |
3105 | "<th>Min</th><th>Typ</th><th>Max</th></tr>\n"; |
3105 | "<th>Min</th><th>Typ</th><th>Max</th></tr>\n"; |
3106 | print HTML $html; |
3106 | print HTML $html; |
3107 | print HTML2 $html; |
3107 | print HTML2 $html; |
3108 | 3108 | ||
3109 | $tex = "\\begin{center}\n". |
3109 | $tex = "\\begin{center}\n". |
3110 | "\\scriptsize\n". |
3110 | "\\scriptsize\n". |
3111 | "\\tablehead{\n". |
3111 | "\\tablehead{\n". |
3112 | " & & Spec& & &Result& & & \\\\\n". |
3112 | " & & Spec& & &Result& & & \\\\\n". |
3113 | "Parameter & Min & Typ & Max & Min & Typ & Max & Unit & Pass\\\\\n". |
3113 | "Parameter & Min & Typ & Max & Min & Typ & Max & Unit & Pass\\\\\n". |
3114 | "\\hline\n\\hline}\n". |
3114 | "\\hline\n\\hline}\n". |
3115 | "\\tabletail{\\hline}\n". |
3115 | "\\tabletail{\\hline}\n". |
3116 | # "\\title{\\textbf{Table $table_no:$label}}\n". |
3116 | # "\\title{\\textbf{Table $table_no:$label}}\n". |
3117 | "\\bottomcaption{$table_caption}\n". |
3117 | "\\bottomcaption{$table_caption}\n". |
3118 | "\\label{$ref}\n". |
3118 | "\\label{$ref}\n". |
3119 | "\\begin{mpsupertabular}{l|ccc|ccc|c|c}\n"; |
3119 | "\\begin{mpsupertabular}{l|ccc|ccc|c|c}\n"; |
3120 | print TEX $tex; |
3120 | print TEX $tex; |
3121 | 3121 | ||
3122 | while($continue == 1){ |
3122 | while($continue == 1){ |
3123 | if($pd[$i] =~ /^(\S*)=(.*)/) { |
3123 | if($pd[$i] =~ /^(\S*)=(.*)/) { |
3124 | if($1 eq 'corners') { |
3124 | if($1 eq 'corners') { |
3125 | $corners = $2; |
3125 | $corners = $2; |
3126 | } elsif ($1 eq 'dir') { |
3126 | } elsif ($1 eq 'dir') { |
3127 | $subdir = $2; |
3127 | $subdir = $2; |
3128 | } else { |
3128 | } else { |
3129 | warn("Illegal command '$1'\n"); |
3129 | warn("Illegal command '$1'\n"); |
3130 | } |
3130 | } |
3131 | next; |
3131 | next; |
3132 | } |
3132 | } |
3133 | my ($varname,$caption,$eq,$min_spec,$typ_spec,$max_spec,$unit,$n_dec) = |
3133 | my ($varname,$caption,$eq,$min_spec,$typ_spec,$max_spec,$unit,$n_dec) = |
3134 | split(/,/, $pd[$i]); |
3134 | split(/,/, $pd[$i]); |
3135 | if(!$varname){ |
3135 | if(!$varname){ |
3136 | next; |
3136 | next; |
3137 | } |
3137 | } |
3138 | if(!$unit){ |
3138 | if(!$unit){ |
3139 | # Unit not specified = Wrong number of parameters. Use line as title |
3139 | # Unit not specified = Wrong number of parameters. Use line as title |
3140 | $html = "<tr><th colspan=\"9\">$pd[$i]</th></tr>\n"; |
3140 | $html = "<tr><th colspan=\"9\">$pd[$i]</th></tr>\n"; |
3141 | print HTML $html; |
3141 | print HTML $html; |
3142 | print HTML2 $html; |
3142 | print HTML2 $html; |
3143 | if($firstdata eq 0){ |
3143 | if($firstdata eq 0){ |
3144 | print TEX "\\hline\n"; |
3144 | print TEX "\\hline\n"; |
3145 | } |
3145 | } |
3146 | print TEX "\\multicolumn{9}{l}{\\textbf{$pd[$i]}}\\\\\n\\hline\n"; |
3146 | print TEX "\\multicolumn{9}{l}{\\textbf{$pd[$i]}}\\\\\n\\hline\n"; |
3147 | next; |
3147 | next; |
3148 | } |
3148 | } |
3149 | if($n_dec eq ''){ |
3149 | if($n_dec eq ''){ |
3150 | $n_dec = 2; |
3150 | $n_dec = 2; |
3151 | } |
3151 | } |
3152 | 3152 | ||
3153 | my ($typ, $min, $max, $min_corner, $max_corner, $typ_corner); |
3153 | my ($typ, $min, $max, $min_corner, $max_corner, $typ_corner); |
3154 | $min_corner = ''; |
3154 | $min_corner = ''; |
3155 | $max_corner = ''; |
3155 | $max_corner = ''; |
3156 | my $count = 0; |
3156 | my $count = 0; |
3157 | # Walk through corners and subdir to find variables |
3157 | # Walk through corners and subdir to find variables |
3158 | my @cornerlist = split(/\s/,$corners); |
3158 | my @cornerlist = split(/\s/,$corners); |
3159 | $/ = "\n"; # Disable "slurp" mode |
3159 | $/ = "\n"; # Disable "slurp" mode |
3160 | foreach(@cornerlist){ |
3160 | foreach(@cornerlist){ |
3161 | $corner = $_; |
3161 | $corner = $_; |
3162 | @files = <$subdir/$corner/$varname>; |
3162 | @files = <$subdir/$corner/$varname>; |
3163 | foreach(@files){ |
3163 | foreach(@files){ |
3164 | $file = $_; |
3164 | $file = $_; |
3165 | 3165 | ||
3166 | # Read data |
3166 | # Read data |
3167 | open DATAFILE, $file; |
3167 | open DATAFILE, $file; |
3168 | chomp($data = <DATAFILE>); |
3168 | chomp($data = <DATAFILE>); |
3169 | close DATAFILE; |
3169 | close DATAFILE; |
3170 | 3170 | ||
3171 | # Find min and max value |
3171 | # Find min and max value |
3172 | ($corn) = ($file =~ /\w*\/(.*)\/\w*/); |
3172 | ($corn) = ($file =~ /\w*\/(.*)\/\w*/); |
3173 | if($count eq 0){ |
3173 | if($count eq 0){ |
3174 | $typ = $data; |
3174 | $typ = $data; |
3175 | $min = $data; |
3175 | $min = $data; |
3176 | $max = $data; |
3176 | $max = $data; |
3177 | $typ_corner = $corn; |
3177 | $typ_corner = $corn; |
3178 | $min_corner = $corn; |
3178 | $min_corner = $corn; |
3179 | $max_corner = $corn; |
3179 | $max_corner = $corn; |
3180 | } else { |
3180 | } else { |
3181 | if($corn eq 'typ'){ |
3181 | if($corn eq 'typ'){ |
3182 | $typ = $data; |
3182 | $typ = $data; |
3183 | $typ_corner = $corn; |
3183 | $typ_corner = $corn; |
3184 | } |
3184 | } |
3185 | if($min > $data){ |
3185 | if($min > $data){ |
3186 | $min = $data; |
3186 | $min = $data; |
3187 | $min_corner = $corn; |
3187 | $min_corner = $corn; |
3188 | } |
3188 | } |
3189 | if($max < $data){ |
3189 | if($max < $data){ |
3190 | $max = $data; |
3190 | $max = $data; |
3191 | $max_corner = $corn; |
3191 | $max_corner = $corn; |
3192 | } |
3192 | } |
3193 | } |
3193 | } |
3194 | $count++; |
3194 | $count++; |
3195 | } |
3195 | } |
3196 | } |
3196 | } |
3197 | # Scale result according to unit |
3197 | # Scale result according to unit |
3198 | my($prefix) = $unit =~ /(.?)/; |
3198 | my($prefix) = $unit =~ /(.?)/; |
3199 | if ($prefix eq 'T') { $scale = 1e-12; } |
3199 | if ($prefix eq 'T') { $scale = 1e-12; } |
3200 | elsif ($prefix eq 'G') { $scale = 1e-9; } |
3200 | elsif ($prefix eq 'G') { $scale = 1e-9; } |
3201 | elsif ($prefix eq 'M') { $scale = 1e-6; } |
3201 | elsif ($prefix eq 'M') { $scale = 1e-6; } |
3202 | elsif ($prefix eq 'k') { $scale = 1e-3; } |
3202 | elsif ($prefix eq 'k') { $scale = 1e-3; } |
3203 | elsif ($prefix eq 'm') { $scale = 1e3; } |
3203 | elsif ($prefix eq 'm') { $scale = 1e3; } |
3204 | elsif ($prefix eq 'u') { $scale = 1e6; } |
3204 | elsif ($prefix eq 'u') { $scale = 1e6; } |
3205 | elsif ($prefix eq 'n') { $scale = 1e9; } |
3205 | elsif ($prefix eq 'n') { $scale = 1e9; } |
3206 | elsif ($prefix eq 'p') { $scale = 1e12; } |
3206 | elsif ($prefix eq 'p') { $scale = 1e12; } |
3207 | elsif ($prefix eq 'f') { $scale = 1e15; } |
3207 | elsif ($prefix eq 'f') { $scale = 1e15; } |
3208 | else { $scale = 1; } |
3208 | else { $scale = 1; } |
3209 | 3209 | ||
3210 | $min *= $scale; |
3210 | $min *= $scale; |
3211 | $max *= $scale; |
3211 | $max *= $scale; |
3212 | $typ *= $scale; |
3212 | $typ *= $scale; |
3213 | 3213 | ||
3214 | # Check results |
3214 | # Check results |
3215 | if((($min_spec eq '') || ($min >= $min_spec)) && |
3215 | if((($min_spec eq '') || ($min >= $min_spec)) && |
3216 | (($max_spec eq '') || ($max <= $max_spec))){ |
3216 | (($max_spec eq '') || ($max <= $max_spec))){ |
3217 | $result_html = ' '; |
3217 | $result_html = ' '; |
3218 | $result_tex = ''; |
3218 | $result_tex = ''; |
3219 | } else { |
3219 | } else { |
3220 | $result_html = 'FAIL'; |
3220 | $result_html = 'FAIL'; |
3221 | $result_tex = 'FAIL'; |
3221 | $result_tex = 'FAIL'; |
3222 | } |
3222 | } |
3223 | 3223 | ||
3224 | $typ_cap_tex = sprintf("%.$n_dec"."f",$typ); |
3224 | $typ_cap_tex = sprintf("%.$n_dec"."f",$typ); |
3225 | $typ_cap_html = $typ_cap_tex; |
3225 | $typ_cap_html = $typ_cap_tex; |
3226 | if($count eq 1){ |
3226 | if($count eq 1){ |
3227 | # Dont print min and max data if only one data point found |
3227 | # Dont print min and max data if only one data point found |
3228 | $max_cap_html = ' '; |
3228 | $max_cap_html = ' '; |
3229 | $min_cap_html = ' '; |
3229 | $min_cap_html = ' '; |
3230 | $min_cap_tex = ''; |
3230 | $min_cap_tex = ''; |
3231 | $max_cap_tex = ''; |
3231 | $max_cap_tex = ''; |
3232 | } elsif($count eq 0){ |
3232 | } elsif($count eq 0){ |
3233 | # Dont print results if no data found |
3233 | # Dont print results if no data found |
3234 | $max_cap_html = ' '; |
3234 | $max_cap_html = ' '; |
3235 | $min_cap_html = ' '; |
3235 | $min_cap_html = ' '; |
3236 | $typ_cap_html = ' '; |
3236 | $typ_cap_html = ' '; |
3237 | $min_cap_tex = ''; |
3237 | $min_cap_tex = ''; |
3238 | $max_cap_tex = ''; |
3238 | $max_cap_tex = ''; |
3239 | $typ_cap_tex = ''; |
3239 | $typ_cap_tex = ''; |
3240 | $result_html = ' '; |
3240 | $result_html = ' '; |
3241 | $result_tex = ''; |
3241 | $result_tex = ''; |
3242 | print HTML "<error:Data $varname not found>\n"; |
3242 | print HTML "<error:Data $varname not found>\n"; |
3243 | } else { |
3243 | } else { |
3244 | $min_cap_html = sprintf("%.$n_dec"."f (%s)",$min,$min_corner); |
3244 | $min_cap_html = sprintf("%.$n_dec"."f (%s)",$min,$min_corner); |
3245 | $max_cap_html = sprintf("%.$n_dec"."f (%s)",$max,$max_corner); |
3245 | $max_cap_html = sprintf("%.$n_dec"."f (%s)",$max,$max_corner); |
3246 | $min_cap_tex = sprintf("%.$n_dec"."f\\ensuremath{^{%s}}",$min,$min_corner); |
3246 | $min_cap_tex = sprintf("%.$n_dec"."f\\ensuremath{^{%s}}",$min,$min_corner); |
3247 | $max_cap_tex = sprintf("%.$n_dec"."f\\ensuremath{^{%s}}",$max,$max_corner); |
3247 | $max_cap_tex = sprintf("%.$n_dec"."f\\ensuremath{^{%s}}",$max,$max_corner); |
3248 | } |
3248 | } |
3249 | 3249 | ||
3250 | 3250 | ||
3251 | # Print result if data found |
3251 | # Print result if data found |
3252 | $html = "<tr><td>$caption</td>". |
3252 | $html = "<tr><td>$caption</td>". |
3253 | "<td>$min_spec </td>". |
3253 | "<td>$min_spec </td>". |
3254 | "<td>$typ_spec </td>". |
3254 | "<td>$typ_spec </td>". |
3255 | "<td>$max_spec </td>". |
3255 | "<td>$max_spec </td>". |
3256 | "<td>$min_cap_html</td>" . |
3256 | "<td>$min_cap_html</td>" . |
3257 | "<td>$typ_cap_html</td>". |
3257 | "<td>$typ_cap_html</td>". |
3258 | "<td>$max_cap_html</td>". |
3258 | "<td>$max_cap_html</td>". |
3259 | "<td>$unit</td><td>$result_html</td></tr>\n"; |
3259 | "<td>$unit</td><td>$result_html</td></tr>\n"; |
3260 | print HTML $html; |
3260 | print HTML $html; |
3261 | print HTML2 $html; |
3261 | print HTML2 $html; |
3262 | $tex = "$caption & $min_spec & $typ_spec & $max_spec &". |
3262 | $tex = "$caption & $min_spec & $typ_spec & $max_spec &". |
3263 | "$min_cap_tex & $ typ_cap_tex & $max_cap_tex & ". |
3263 | "$min_cap_tex & $ typ_cap_tex & $max_cap_tex & ". |
3264 | "$unit & $result_tex \\\\\n"; |
3264 | "$unit & $result_tex \\\\\n"; |
3265 | print TEX $tex; |
3265 | print TEX $tex; |
3266 | $firstdata = 0; |
3266 | $firstdata = 0; |
3267 | } continue { |
3267 | } continue { |
3268 | $i++; |
3268 | $i++; |
3269 | if($pd[$i] =~ />>$/){ |
3269 | if($pd[$i] =~ />>$/){ |
3270 | $continue = 0; |
3270 | $continue = 0; |
3271 | } |
3271 | } |
3272 | } |
3272 | } |
3273 | 3273 | ||
3274 | # Close table |
3274 | # Close table |
3275 | $html = "</p></table>Table $table_no:<i>$table_caption</i>\n"; |
3275 | $html = "</p></table>Table $table_no:<i>$table_caption</i>\n"; |
3276 | print HTML $html; |
3276 | print HTML $html; |
3277 | print HTML2 $html; |
3277 | print HTML2 $html; |
3278 | 3278 | ||
3279 | print TEX "\\end{mpsupertabular}\n\\normalsize\n\\end{center}\n"; |
3279 | print TEX "\\end{mpsupertabular}\n\\normalsize\n\\end{center}\n"; |
3280 | 3280 | ||
3281 | $i++; |
3281 | $i++; |
3282 | undef $/; # Enable "slurp" mode again |
3282 | undef $/; # Enable "slurp" mode again |
3283 | } |
3283 | } |
3284 | 3284 | ||
3285 | sub plot_schematics { |
3285 | sub plot_schematics { |
3286 | my $cont = 1; |
3286 | my $cont = 1; |
3287 | 3287 | ||
3288 | print HTML '<p><i>Schematics:</i><br>'; |
3288 | print HTML '<p><i>Schematics:</i><br>'; |
3289 | print HTML2 '<p><i>Schematics:</i><br>'; |
3289 | print HTML2 '<p><i>Schematics:</i><br>'; |
3290 | 3290 | ||
3291 | # Deuglify filenames of newly printed schematics |
3291 | # Deuglify filenames of newly printed schematics |
3292 | my $schdir = 'sch'; |
3292 | my $schdir = 'sch'; |
3293 | my @sch_list = glob "$schdir/*,*"; # schematic printed using hieracical plots contains a , |
3293 | my @sch_list = glob "$schdir/*,*"; # schematic printed using hieracical plots contains a , |
3294 | my $index; |
3294 | my $index; |
3295 | foreach my $sch (@sch_list) { # rename Cadence file format, easier for LaTex and for sort |
3295 | foreach my $sch (@sch_list) { # rename Cadence file format, easier for LaTex and for sort |
3296 | $index++; |
3296 | $index++; |
3297 | print "Schematic $index of " . @sch_list . "\n"; |
3297 | print "Schematic $index of " . @sch_list . "\n"; |
3298 | if ($sch =~ /[@](.*),(.*),(.*)/) { #strip @ prefix and extract ckt and libname |
3298 | if ($sch =~ /[@](.*),(.*),(.*)/) { #strip @ prefix and extract ckt and libname |
3299 | my $libname = $1; |
3299 | my $libname = $1; |
3300 | my $cktname = $2; |
3300 | my $cktname = $2; |
3301 | my $viewname = $3; |
3301 | my $viewname = $3; |
3302 | my $viewext; |
3302 | my $viewext; |
3303 | if($viewname eq 'schematic') { |
3303 | if($viewname eq 'schematic') { |
3304 | $viewext = ''; |
3304 | $viewext = ''; |
3305 | } else { |
3305 | } else { |
3306 | $viewext = "-$viewname"; |
3306 | $viewext = "-$viewname"; |
3307 | } |
3307 | } |
3308 | 3308 | ||
3309 | rename "$sch", "$schdir/$cktname.$libname.$viewname.ps" or warn "couldn't rename $sch\n"; |
3309 | rename "$sch", "$schdir/$cktname.$libname.$viewname.ps" or warn "couldn't rename $sch\n"; |
3310 | system "ps2ps $schdir/$cktname.$libname.$viewname.ps $schdir/$cktname$viewext-$libname"; |
3310 | system "ps2ps $schdir/$cktname.$libname.$viewname.ps $schdir/$cktname$viewext-$libname"; |
3311 | unlink "$schdir/$cktname.$libname.$viewname.ps"; # delete eps files |
3311 | unlink "$schdir/$cktname.$libname.$viewname.ps"; # delete eps files |
3312 | } |
3312 | } |
3313 | } |
3313 | } |
3314 | 3314 | ||
3315 | while($cont){ |
3315 | while($cont){ |
3316 | # my ($pre, $sch, $lib) = ($pd[$i] =~ /(?:<<sch:)?([\s\^]*)([\w]*)\s*\((\w*)/); |
3316 | # my ($pre, $sch, $lib) = ($pd[$i] =~ /(?:<<sch:)?([\s\^]*)([\w]*)\s*\((\w*)/); |
3317 | my ($pre, $sch, $lib) = ($pd[$i] =~ /(?:<<sch:)?(\W*)([\w-]*)\s*\((\w*)/); |
3317 | my ($pre, $sch, $lib) = ($pd[$i] =~ /(?:<<sch:)?(\W*)([\w-]*)\s*\((\w*)/); |
3318 | $filename = "$sch-$lib"; |
3318 | $filename = "$sch-$lib"; |
3319 | print "$filename\n"; |
3319 | print "$filename\n"; |
3320 | if(-r "sch/$filename"){ |
3320 | if(-r "sch/$filename"){ |
3321 | if((stat("sch/$filename"))[9] > (stat("tex/$filename.pdf"))[9]){ |
3321 | if((stat("sch/$filename"))[9] > (stat("tex/$filename.pdf"))[9]){ |
3322 | print "Converting $filename to pdf\n"; |
3322 | print "Converting $filename to pdf\n"; |
3323 | system('epstopdf',"sch/$filename", "-outfile","tex/$filename.pdf"); |
3323 | system('epstopdf',"sch/$filename", "-outfile","tex/$filename.pdf"); |
3324 | } |
3324 | } |
3325 | if((stat("sch/$filename"))[9] > (stat("$htmldir$filename.png"))[9]){ |
3325 | if((stat("sch/$filename"))[9] > (stat("$htmldir$filename.png"))[9]){ |
3326 | print "Converting $filename to png\n"; |
3326 | print "Converting $filename to png\n"; |
3327 | system("convert -density 150x150 sch/$filename $htmldir$filename.png"); |
3327 | system("convert -density 150x150 sch/$filename $htmldir$filename.png"); |
3328 | } |
3328 | } |
3329 | ++$img_no; |
3329 | ++$img_no; |
3330 | $refname = fold_label($filename); |
3330 | $refname = fold_label($filename); |
3331 | $reflist{$refname} = $img_no; |
3331 | $reflist{$refname} = $img_no; |
3332 | $refhtmlpage{$refname} = $html2; |
3332 | $refhtmlpage{$refname} = $html2; |
3333 | 3333 | ||
3334 | my $html_caption = "$pre<a href=\"$filename.png\"". |
3334 | my $html_caption = "$pre<a href=\"$filename.png\"". |
3335 | "id=\"$refname\">$sch ($lib)</a><br>\n"; |
3335 | "id=\"$refname\">$sch ($lib)</a><br>\n"; |
3336 | print HTML $html_caption; |
3336 | print HTML $html_caption; |
3337 | print HTML2 $html_caption; |
3337 | print HTML2 $html_caption; |
3338 | $tex_caption = ""; |
3338 | $tex_caption = ""; |
3339 | print TEX <<TEX; |
3339 | print TEX <<TEX; |
3340 | \\setlength{\\unitlength}{1in} |
3340 | \\setlength{\\unitlength}{1in} |
3341 | \\newpage |
3341 | \\newpage |
3342 | \\begin{picture}(5,7)(1.5,2.5) |
3342 | \\begin{picture}(5,7)(1.5,2.5) |
3343 | \\thispagestyle{plain} |
3343 | \\thispagestyle{plain} |
3344 | \\includegraphics[width=1\\paperwidth,height=1\\paperheight,keepaspectratio]{$filename.pdf} |
3344 | \\includegraphics[width=1\\paperwidth,height=1\\paperheight,keepaspectratio]{$filename.pdf} |
3345 | \\end{picture} |
3345 | \\end{picture} |
3346 | \\newpage |
3346 | \\newpage |
3347 | TEX |
3347 | TEX |
3348 | ; |
3348 | ; |
3349 | # print TEX "\\begin{figure}[ht]\n\\center". |
3349 | # print TEX "\\begin{figure}[ht]\n\\center". |
3350 | # "\\includegraphics[totalheight=9in]". |
3350 | # "\\includegraphics[totalheight=9in]". |
3351 | # "\\includegraphics[width=1.0\\textwidth,". |
3351 | # "\\includegraphics[width=1.0\\textwidth,". |
3352 | # "height=1.0\\textheight,keepaspectratio]". |
3352 | # "height=1.0\\textheight,keepaspectratio]". |
3353 | # "\\includegraphics[width=0.95\\paperwidth,". |
3353 | # "\\includegraphics[width=0.95\\paperwidth,". |
3354 | # "height=0.95\\paperheight,keepaspectratio]". |
3354 | # "height=0.95\\paperheight,keepaspectratio]". |
3355 | # "{$filename.pdf}\n$tex_caption". |
3355 | # "{$filename.pdf}\n$tex_caption". |
3356 | # "\\label{$refname}\n\\end{figure}\n\\clearpage\n\n"; |
3356 | # "\\label{$refname}\n\\end{figure}\n\\clearpage\n\n"; |
3357 | } |
3357 | } |
3358 | 3358 | ||
3359 | if($pd[$i] =~ />>$/) { |
3359 | if($pd[$i] =~ />>$/) { |
3360 | $cont = 0; |
3360 | $cont = 0; |
3361 | } |
3361 | } |
3362 | $i++; |
3362 | $i++; |
3363 | } |
3363 | } |
3364 | print HTML '</p>'; |
3364 | print HTML '</p>'; |
3365 | print HTML2 '</p>'; |
3365 | print HTML2 '</p>'; |
3366 | } |
3366 | } |
3367 | 3367 | ||
3368 | # Generate TeX for equation AND render it for HTML representation |
3368 | # Generate TeX for equation AND render it for HTML representation |
3369 | 3369 | ||
3370 | sub plot_eqn { |
3370 | sub plot_eqn { |
3371 | my($equation,$tag,$eqnr) = @_; |
3371 | my($equation,$tag,$eqnr) = @_; |
3372 | my $ref = fold_label($tag); |
3372 | my $ref = fold_label($tag); |
3373 | 3373 | ||
3374 | print TEX "\\begin{equation}\\label{$ref}$equation\\end{equation}"; |
3374 | print TEX "\\begin{equation}\\label{$ref}$equation\\end{equation}"; |
3375 | 3375 | ||
3376 | # Convert latex equation to png to include in HTML document |
3376 | # Convert latex equation to png to include in HTML document |
3377 | my $f = "eqn_$tag"; |
3377 | my $f = "eqn_$tag"; |
3378 | my $dpi = 150; |
3378 | my $dpi = 150; |
3379 | my $res = 0.5; |
3379 | my $res = 0.5; |
3380 | my $imageCmd = 'pnmtopng'; |
3380 | my $imageCmd = 'pnmtopng'; |
3381 | #my $imageCmdD = 'pngtopnm'; |
3381 | #my $imageCmdD = 'pngtopnm'; |
3382 | my $imageExt = 'png'; |
3382 | my $imageExt = 'png'; |
3383 | my $background = ""; |
3383 | my $background = ""; |
3384 | my $transparent = "ff/ff/ff"; |
3384 | my $transparent = "ff/ff/ff"; |
3385 | $reflist{$ref} = $eqnr; |
3385 | $reflist{$ref} = $eqnr; |
3386 | $refhtmlpage{$ref} = $html2; |
3386 | $refhtmlpage{$ref} = $html2; |
3387 | 3387 | ||
3388 | open TEXEQN,">$f.tex"; |
3388 | open TEXEQN,">$f.tex"; |
3389 | warn "Writing $f.tex"; |
3389 | warn "Writing $f.tex"; |
3390 | print TEXEQN "\\documentclass[12pt]{article}\n" . |
3390 | print TEXEQN "\\documentclass[12pt]{article}\n" . |
3391 | "\\pagestyle{empty}\n". |
3391 | "\\pagestyle{empty}\n". |
3392 | "\\begin{document}\n". |
3392 | "\\begin{document}\n". |
3393 | "\\begin{displaymath}\n". |
3393 | "\\begin{displaymath}\n". |
3394 | # "\\bf\n". |
3394 | # "\\bf\n". |
3395 | "$equation\n". |
3395 | "$equation\n". |
3396 | "\\end{displaymath}\n". |
3396 | "\\end{displaymath}\n". |
3397 | "\\end{document}\n"; |
3397 | "\\end{document}\n"; |
3398 | close TEXEQN; |
3398 | close TEXEQN; |
3399 | 3399 | ||
3400 | # Only recreate png file if tex file changed |
3400 | # Only recreate png file if tex file changed |
3401 | if((-e ".pd/$f.tex") && (-e "$htmldir$f.$imageExt") && |
3401 | if((-e ".pd/$f.tex") && (-e "$htmldir$f.$imageExt") && |
3402 | (system("diff .pd/$f.tex $f.tex") eq "0")){ |
3402 | (system("diff .pd/$f.tex $f.tex") eq "0")){ |
3403 | unlink "$f.tex"; |
3403 | unlink "$f.tex"; |
3404 | warn("Nothing changed in equation $tag\n"); |
3404 | warn("Nothing changed in equation $tag\n"); |
3405 | } else { |
3405 | } else { |
3406 | # *** the following, from fjon, has too many tool dependencies for my taste --Sampo |
3406 | # *** the following, from fjon, has too many tool dependencies for my taste --Sampo |
3407 | unlink ".pd/$f.tex"; |
3407 | unlink ".pd/$f.tex"; |
3408 | rename "$f.tex", ".pd/$f.tex"; |
3408 | rename "$f.tex", ".pd/$f.tex"; |
3409 | system("latex .pd/$f.tex\n"); |
3409 | system("latex .pd/$f.tex\n"); |
3410 | system("dvips -f $f.dvi > $f.ps\n"); |
3410 | system("dvips -f $f.dvi > $f.ps\n"); |
3411 | $cmd = "echo quit | gs -q -dNOPAUSE -r" . int($dpi / $res). "x". int($dpi / $res) . |
3411 | $cmd = "echo quit | gs -q -dNOPAUSE -r" . int($dpi / $res). "x". int($dpi / $res) . |
3412 | " -sOutputFile=- -sDEVICE=pbmraw $f.ps | " . |
3412 | " -sOutputFile=- -sDEVICE=pbmraw $f.ps | " . |
3413 | "pnmcrop -white | pnmdepth 255 | $background pnmscale " . |
3413 | "pnmcrop -white | pnmdepth 255 | $background pnmscale " . |
3414 | $res . " | " . |
3414 | $res . " | " . |
3415 | "$imageCmd -interlace -transparent rgb:$transparent >$htmldir$f.$imageExt"; |
3415 | "$imageCmd -interlace -transparent rgb:$transparent >$htmldir$f.$imageExt"; |
3416 | system($cmd); |
3416 | system($cmd); |
3417 | system("rm $f.dvi $f.aux $f.log $f.ps"); |
3417 | system("rm $f.dvi $f.aux $f.log $f.ps"); |
3418 | } |
3418 | } |
3419 | # Place equation in table to align equation number |
3419 | # Place equation in table to align equation number |
3420 | $html = "<table><tr>". |
3420 | $html = "<table><tr>". |
3421 | "<td class=\"eqn\"><a id=\"$ref\"><img src=\"$f.$imageExt\"></a>". |
3421 | "<td class=\"eqn\"><a id=\"$ref\"><img src=\"$f.$imageExt\"></a>". |
3422 | "<td class=\"eqn\">($eqnr)\n". |
3422 | "<td class=\"eqn\">($eqnr)\n". |
3423 | "</table><br>\n"; |
3423 | "</table><br>\n"; |
3424 | # "<a id=\"$ref\"><img src=\"$f.$imageExt\"></a>". |
3424 | # "<a id=\"$ref\"><img src=\"$f.$imageExt\"></a>". |
3425 | # " ($eqnr)<br>\n"; |
3425 | # " ($eqnr)<br>\n"; |
3426 | print HTML $html; |
3426 | print HTML $html; |
3427 | print HTML2 $html; |
3427 | print HTML2 $html; |
3428 | } |
3428 | } |
3429 | 3429 | ||
3430 | ### End fjon contribution |
3430 | ### End fjon contribution |
3431 | 3431 | ||
3432 | # N.B. In order to be able to escape < and > properly we use here a trick: |
3432 | # N.B. In order to be able to escape < and > properly we use here a trick: |
3433 | # ^^^^ represents < and ~~~~ represents >. Once escaping is done, they |
3433 | # ^^^^ represents < and ~~~~ represents >. Once escaping is done, they |
3434 | # are substituted back. |
3434 | # are substituted back. |
3435 | 3435 | ||
3436 | $inline_open = '^^^^inlinemediaobject~~~~^^^^imageobject~~~~'; |
3436 | $inline_open = '^^^^inlinemediaobject~~~~^^^^imageobject~~~~'; |
3437 | $inline_close = '^^^^/imageobject~~~~^^^^/inlinemediaobject~~~~'; |
3437 | $inline_close = '^^^^/imageobject~~~~^^^^/inlinemediaobject~~~~'; |
3438 | 3438 | ||
3439 | sub fold_label { |
3439 | sub fold_label { |
3440 | my ($label) = @_; |
3440 | my ($label) = @_; |
3441 | $label =~ s|[^\w_:-]|-|g; # fjon added _ |
3441 | $label =~ s|[^\w_:-]|-|g; # fjon added _ |
3442 | return $label; |
3442 | return $label; |
3443 | } |
3443 | } |
3444 | 3444 | ||
3445 | sub dbx_entity_escape_lite { # Used by verbatim modes that use CDATA |
3445 | sub dbx_entity_escape_lite { # Used by verbatim modes that use CDATA |
3446 | my ($x) = @_; |
3446 | my ($x) = @_; |
3447 | return $x unless $encoding eq 'UTF-8'; |
3447 | return $x unless $encoding eq 'UTF-8'; |
3448 | 3448 | ||
3449 | return $x; |
3449 | return $x; |
3450 | } |
3450 | } |
3451 | 3451 | ||
3452 | sub dbx_entity_escape { |
3452 | sub dbx_entity_escape { |
3453 | my ($x) = @_; |
3453 | my ($x) = @_; |
3454 | return $x unless $encoding eq 'UTF-8'; |
3454 | return $x unless $encoding eq 'UTF-8'; |
3455 | 3455 | ||
3456 | $x =~ s/\@/@/g; |
3456 | $x =~ s/\@/@/g; |
3457 | 3457 | ||
3458 | $x =~ s/á/á/g; $x =~ s/à/à/g; $x =~ s/â/â/g; |
3458 | $x =~ s/á/á/g; $x =~ s/à/à/g; $x =~ s/â/â/g; |
3459 | $x =~ s/ä/ä/g; $x =~ s/ã/ã/g; $x =~ s/å/å/g; |
3459 | $x =~ s/ä/ä/g; $x =~ s/ã/ã/g; $x =~ s/å/å/g; |
3460 | $x =~ s/Á/Á/g; $x =~ s/À/À/g; $x =~ s/Â/Â/g; |
3460 | $x =~ s/Á/Á/g; $x =~ s/À/À/g; $x =~ s/Â/Â/g; |
3461 | $x =~ s/Ä/Ä/g; $x =~ s/Ã/Ã/g; $x =~ s/Å/Å/g; |
3461 | $x =~ s/Ä/Ä/g; $x =~ s/Ã/Ã/g; $x =~ s/Å/Å/g; |
3462 | 3462 | ||
3463 | $x =~ s/ó/ó/g; $x =~ s/ò/ò/g; $x =~ s/ô/ô/g; |
3463 | $x =~ s/ó/ó/g; $x =~ s/ò/ò/g; $x =~ s/ô/ô/g; |
3464 | $x =~ s/ö/ö/g; $x =~ s/õ/õ/g; |
3464 | $x =~ s/ö/ö/g; $x =~ s/õ/õ/g; |
3465 | $x =~ s/Ó/Ó/g; $x =~ s/Ò/Ò/g; $x =~ s/Ô/Ô/g; |
3465 | $x =~ s/Ó/Ó/g; $x =~ s/Ò/Ò/g; $x =~ s/Ô/Ô/g; |
3466 | $x =~ s/Ö/Ö/g; $x =~ s/Õ/Õ/g; |
3466 | $x =~ s/Ö/Ö/g; $x =~ s/Õ/Õ/g; |
3467 | 3467 | ||
3468 | $x =~ s/í/í/g; $x =~ s/ì/ì/g; $x =~ s/î/î/g; $x =~ s/ï/ï/g; |
3468 | $x =~ s/í/í/g; $x =~ s/ì/ì/g; $x =~ s/î/î/g; $x =~ s/ï/ï/g; |
3469 | $x =~ s/Í/Í/g; $x =~ s/Ì/Ì/g; $x =~ s/Î/Î/g; $x =~ s/Ï/Ï/g; |
3469 | $x =~ s/Í/Í/g; $x =~ s/Ì/Ì/g; $x =~ s/Î/Î/g; $x =~ s/Ï/Ï/g; |
3470 | 3470 | ||
3471 | $x =~ s/é/é/g; $x =~ s/è/è/g; $x =~ s/ê/ê/g; $x =~ s/ë/ë/g; |
3471 | $x =~ s/é/é/g; $x =~ s/è/è/g; $x =~ s/ê/ê/g; $x =~ s/ë/ë/g; |
3472 | $x =~ s/É/É/g; $x =~ s/È/È/g; $x =~ s/Ê/Ê/g; $x =~ s/Ë/Ë/g; |
3472 | $x =~ s/É/É/g; $x =~ s/È/È/g; $x =~ s/Ê/Ê/g; $x =~ s/Ë/Ë/g; |
3473 | 3473 | ||
3474 | $x =~ s/ú/ú/g; $x =~ s/ù/ù/g; $x =~ s/û/û/g; $x =~ s/ü/ü/g; |
3474 | $x =~ s/ú/ú/g; $x =~ s/ù/ù/g; $x =~ s/û/û/g; $x =~ s/ü/ü/g; |
3475 | $x =~ s/Ú/Ú/g; $x =~ s/Ù/Ù/g; $x =~ s/Û/Û/g; $x =~ s/Ü/Ü/g; |
3475 | $x =~ s/Ú/Ú/g; $x =~ s/Ù/Ù/g; $x =~ s/Û/Û/g; $x =~ s/Ü/Ü/g; |
3476 | 3476 | ||
3477 | $x =~ s/ç/çla;/g; $x =~ s/Ç/Çla;/g; |
3477 | $x =~ s/ç/çla;/g; $x =~ s/Ç/Çla;/g; |
3478 | $x =~ s/ñ/ñ/g; $x =~ s/Ñ/Ñ/g; |
3478 | $x =~ s/ñ/ñ/g; $x =~ s/Ñ/Ñ/g; |
3479 | 3479 | ||
3480 | return $x; |
3480 | return $x; |
3481 | } |
3481 | } |
3482 | 3482 | ||
3483 | sub dbx_format_infobox { |
3483 | sub dbx_format_infobox { |
3484 | my ($id,$link,$tableargs,$content) = @_; |
3484 | my ($id,$link,$tableargs,$content) = @_; |
3485 | $content =~ s/</^^^^/gs; |
3485 | $content =~ s/</^^^^/gs; |
3486 | $content =~ s/>/~~~~/gs; |
3486 | $content =~ s/>/~~~~/gs; |
3487 | return tag(qq(a href="#" onClick="vis('$id',1);")).$link.tag('/a') |
3487 | return tag(qq(a href="#" onClick="vis('$id',1);")).$link.tag('/a') |
3488 | .tag(qq(table id=$id $tableargs)).tag('tr').tag('td').$content |
3488 | .tag(qq(table id=$id $tableargs)).tag('tr').tag('td').$content |
3489 | .tag('/td').tag('/tr').tag('/table'); |
3489 | .tag('/td').tag('/tr').tag('/table'); |
3490 | } |
3490 | } |
3491 | 3491 | ||
3492 | sub dbx_para_raw { |
3492 | sub dbx_para_raw { |
3493 | my $x = join ' ', @_; |
3493 | my $x = join ' ', @_; |
3494 | return "\n" unless length $x; |
3494 | return "\n" unless length $x; |
3495 | local ($1,$2,$3,$4,$5,$6,$7,$8,$9); |
3495 | local ($1,$2,$3,$4,$5,$6,$7,$8,$9); |
3496 | 3496 | ||
3497 | if ($fn_style == 3) { |
3497 | if ($fn_style == 3) { |
3498 | $x =~ s%<<footnote:\s*(.*?)\s*>>%$fn_num++,qq(^^^^footnote id="fn$fn_num" label="$fn_num"~~~~^^^^para~~~~$1^^^^/para~~~~^^^^/footnote~~~~)%gse; |
3498 | $x =~ s%<<footnote:\s*(.*?)\s*>>%$fn_num++,qq(^^^^footnote id="fn$fn_num" label="$fn_num"~~~~^^^^para~~~~$1^^^^/para~~~~^^^^/footnote~~~~)%gse; |
3499 | } elsif ($fn_style == 1) { |
3499 | } elsif ($fn_style == 1) { |
3500 | $x =~ s%<<footnote:\s*(.*?)\s*>>%$fn_num++,qq([*** fn$fn_num: $1 ***])%gse; |
3500 | $x =~ s%<<footnote:\s*(.*?)\s*>>%$fn_num++,qq([*** fn$fn_num: $1 ***])%gse; |
3501 | } else { |
3501 | } else { |
3502 | $x =~ s%<<footnote:\s*(.*?)\s*>>%%gs; |
3502 | $x =~ s%<<footnote:\s*(.*?)\s*>>%%gs; |
3503 | } |
3503 | } |
3504 | $x =~ s%<<feedbackopts:.*?>>%%gs; |
3504 | $x =~ s%<<feedbackopts:.*?>>%%gs; |
3505 | $x =~ s%<<addfeedbacktop:.*?>>%%gs; |
3505 | $x =~ s%<<addfeedbacktop:.*?>>%%gs; |
3506 | $x =~ s%<<addfeedbackbot:.*?>>%%gs; |
3506 | $x =~ s%<<addfeedbackbot:.*?>>%%gs; |
3507 | $x =~ s%<<infobox:(\w+):([^:]*):([^:]*):\s*(.*?)\s*>>%dbx_format_infobox($1,$2,$3,$4)%gse; |
3507 | $x =~ s%<<infobox:(\w+):([^:]*):([^:]*):\s*(.*?)\s*>>%dbx_format_infobox($1,$2,$3,$4)%gse; |
3508 | $x =~ s/\(\*\*\*(.*?)\)//gs; |
3508 | $x =~ s/\(\*\*\*(.*?)\)//gs; |
3509 | 3509 | ||
3510 | # 1 2 34 5 6 7 8 |
3510 | # 1 2 34 5 6 7 8 |
3511 | $x =~ s%<<(\S*?(\.((gif)|(jpe?g)|(svg)|(png)|(e?ps))))>>% |
3511 | $x =~ s%<<(\S*?(\.((gif)|(jpe?g)|(svg)|(png)|(e?ps))))>>% |
3512 | $inline_open^^^^imagedata fileref="$1"/~~~~$inline_close%gsx; |
3512 | $inline_open^^^^imagedata fileref="$1"/~~~~$inline_close%gsx; |
3513 | $x =~ s%<<tt:\s*(.*?)>>%^^^^computeroutput~~~~$1^^^^/computeroutput~~~~%gs; |
3513 | $x =~ s%<<tt:\s*(.*?)>>%^^^^computeroutput~~~~$1^^^^/computeroutput~~~~%gs; |
3514 | $x =~ s%<<bold:\s*(.*?)>>%^^^^emphasis role="bold"~~~~$1^^^^/emphasis~~~~%gs; |
3514 | $x =~ s%<<bold:\s*(.*?)>>%^^^^emphasis role="bold"~~~~$1^^^^/emphasis~~~~%gs; |
3515 | $x =~ s%<<italic:\s*(.*?)>>%^^^^emphasis~~~~$1^^^^/emphasis~~~~%gs; |
3515 | $x =~ s%<<italic:\s*(.*?)>>%^^^^emphasis~~~~$1^^^^/emphasis~~~~%gs; |
3516 | $x =~ s%<<see:\s*(\S[^>]*?)(?::\s+(\S[^>]*))?>>%qq(^^^^xref linkend=") . fold_label($1) . qq("/~~~~)%gse; |
3516 | $x =~ s%<<see:\s*(\S[^>]*?)(?::\s+(\S[^>]*))?>>%qq(^^^^xref linkend=") . fold_label($1) . qq("/~~~~)%gse; |
3517 | $x =~ s%<<ix:\s*([^>]+)>>%$1%gs; # index entry |
3517 | $x =~ s%<<ix:\s*([^>]+)>>%$1%gs; # index entry |
3518 | $x =~ s%<<ref:\s*([^:]+): (.*?)>>%<xref linkend="$2"/>%gs; # *** should do proper ref |
3518 | $x =~ s%<<ref:\s*([^:]+): (.*?)>>%<xref linkend="$2"/>%gs; # *** should do proper ref |
3519 | $x =~ s|<(/?\w.*?/?)>|^^^^$tag_tag~~~~<$1>^^^^/$tag_tag~~~~|gs; |
3519 | $x =~ s|<(/?\w.*?/?)>|^^^^$tag_tag~~~~<$1>^^^^/$tag_tag~~~~|gs; |
3520 | $x =~ s%((?<!\S)\@[a-z0-9-]+)%^^^^computeroutput~~~~$1^^^^/computeroutput~~~~%gsxi; # XML or HTML @attribute |
3520 | $x =~ s%((?<!\S)\@[a-z0-9-]+)%^^^^computeroutput~~~~$1^^^^/computeroutput~~~~%gsxi; # XML or HTML @attribute |
3521 | # *** add URL, email, and file path detection |
3521 | # *** add URL, email, and file path detection |
3522 | $x =~ s|&|&|g; |
3522 | $x =~ s|&|&|g; |
3523 | $x =~ s|<|<|g; |
3523 | $x =~ s|<|<|g; |
3524 | $x =~ s|>|>|g; |
3524 | $x =~ s|>|>|g; |
3525 | $x =~ s|\\\\|<literallayout>\n</literallayout>|g; |
3525 | $x =~ s|\\\\|<literallayout>\n</literallayout>|g; |
3526 | $x =~ s|\^\^\^\^\^\^\^\^RAWTEX: (.*?)~~~~~~~~||gse; |
3526 | $x =~ s|\^\^\^\^\^\^\^\^RAWTEX: (.*?)~~~~~~~~||gse; |
3527 | $x =~ s|\^\^\^\^\^\^\^\^RAWDBX: (.*?)~~~~~~~~|unhexit($1)|gse; |
3527 | $x =~ s|\^\^\^\^\^\^\^\^RAWDBX: (.*?)~~~~~~~~|unhexit($1)|gse; |
3528 | $x =~ s|\^\^\^\^\^\^\^\^RAWRTF: (.*?)~~~~~~~~||gse; |
3528 | $x =~ s|\^\^\^\^\^\^\^\^RAWRTF: (.*?)~~~~~~~~||gse; |
3529 | $x =~ s|\^\^\^\^\^\^\^\^RAWHTML: (.*?)~~~~~~~~||gse; |
3529 | $x =~ s|\^\^\^\^\^\^\^\^RAWHTML: (.*?)~~~~~~~~||gse; |
3530 | $x =~ s|\^\^\^\^|<|g; |
3530 | $x =~ s|\^\^\^\^|<|g; |
3531 | $x =~ s|~~~~|>|g; |
3531 | $x =~ s|~~~~|>|g; |
3532 | $x =~ s|\*(\S.*?\S)\*|<emphasis role="bold">$1</emphasis>|gs; |
3532 | $x =~ s|\*(\S.*?\S)\*|<emphasis role="bold">$1</emphasis>|gs; |
3533 | $x =~ s|([\s\(])\+([a-z].*?\w)\+|$1<emphasis>$2</emphasis>|gsi; |
3533 | $x =~ s|([\s\(])\+([a-z].*?\w)\+|$1<emphasis>$2</emphasis>|gsi; |
3534 | $x =~ s|~(\S.*?\S)~|<computeroutput>$1</computeroutput>|gs; |
3534 | $x =~ s|~(\S.*?\S)~|<computeroutput>$1</computeroutput>|gs; |
3535 | $x =~ s|~([/\#\$\w-].*?[\w\)])~|<computeroutput>$1</computeroutput>|gs; |
3535 | $x =~ s|~([/\#\$\w-].*?[\w\)])~|<computeroutput>$1</computeroutput>|gs; |
3536 | #$x =~ s|~(\S.*?\S)~|<literal>$1</literal>|gs; |
3536 | #$x =~ s|~(\S.*?\S)~|<literal>$1</literal>|gs; |
3537 | #$x =~ s|\+(\S.*?\S)\+|<command>$1</command>|gs; |
3537 | #$x =~ s|\+(\S.*?\S)\+|<command>$1</command>|gs; |
3538 | #$x =~ s|!(\S.*?\S)!|<replaceable>$1</replaceable>|gs; |
3538 | #$x =~ s|!(\S.*?\S)!|<replaceable>$1</replaceable>|gs; |
3539 | #$x =~ s|\[(\S.*?\S)\]|[<link linkend="$1">$1</link>]|gs; # biblio refs |
3539 | #$x =~ s|\[(\S.*?\S)\]|[<link linkend="$1">$1</link>]|gs; # biblio refs |
3540 | $x =~ s|\[(\w.*?[\w.])\]|<xref linkend="$1"/>|gs; # biblio refs |
3540 | $x =~ s|\[(\w.*?[\w.])\]|<xref linkend="$1"/>|gs; # biblio refs |
3541 | 3541 | ||
3542 | # convert LaTeX leftovers to something reasonable |
3542 | # convert LaTeX leftovers to something reasonable |
3543 | $x =~ s|\\mu|µ|gs; |
3543 | $x =~ s|\\mu|µ|gs; |
3544 | $x =~ s|\\acute\{a\}|á|gs; |
3544 | $x =~ s|\\acute\{a\}|á|gs; |
3545 | $x =~ s|\\times| x |gs; |
3545 | $x =~ s|\\times| x |gs; |
3546 | $x =~ s|\\:| |gs; |
3546 | $x =~ s|\\:| |gs; |
3547 | $x =~ s|(?<!\\)\^\{([^\{\}]+)\}|<sup>$1</sup>|gs if $x =~ /\$/; # *** different for dbx? |
3547 | $x =~ s|(?<!\\)\^\{([^\{\}]+)\}|<sup>$1</sup>|gs if $x =~ /\$/; # *** different for dbx? |
3548 | $x =~ s|(?<!\\)\^(\w)|<sup>$1</sup>|gs if $x =~ /\$/; |
3548 | $x =~ s|(?<!\\)\^(\w)|<sup>$1</sup>|gs if $x =~ /\$/; |
3549 | $x =~ s|(?<!\\)_\{([^\{\}]+)\}|<sub>$1</sub>|gs if $x =~ /\$/; |
3549 | $x =~ s|(?<!\\)_\{([^\{\}]+)\}|<sub>$1</sub>|gs if $x =~ /\$/; |
3550 | $x =~ s|(?<!\\)_(\w)|<sub>$1</sub>|gs if $x =~ /\$/; |
3550 | $x =~ s|(?<!\\)_(\w)|<sub>$1</sub>|gs if $x =~ /\$/; |
3551 | $x =~ s/!\\/\\/g; # Backslash escape |
3551 | $x =~ s/!\\/\\/g; # Backslash escape |
3552 | $x =~ s|\$||gs; |
3552 | $x =~ s|\$||gs; |
3553 | $x =~ s|<dollari>|\$|gs; |
3553 | $x =~ s|<dollari>|\$|gs; |
3554 | $x =~ s|<ampersandi>|&|gs; |
3554 | $x =~ s|<ampersandi>|&|gs; |
3555 | $x =~ s|\\pm |±|gs; |
3555 | $x =~ s|\\pm |±|gs; |
3556 | $x =~ s|\\isotope\{(\d+)\}\{(\w+)\}|<sup>$1</sup>$2|gs; |
3556 | $x =~ s|\\isotope\{(\d+)\}\{(\w+)\}|<sup>$1</sup>$2|gs; |
3557 | $x =~ s/\\[a-z]+(\[[^]]+\])*(\{[^}]+\})*//gsi; # most LaTeX macros |
3557 | $x =~ s/\\[a-z]+(\[[^]]+\])*(\{[^}]+\})*//gsi; # most LaTeX macros |
3558 | $x =~ s/\\{/{/gs; |
3558 | $x =~ s/\\{/{/gs; |
3559 | $x =~ s/\\}/}/gs; |
3559 | $x =~ s/\\}/}/gs; |
3560 | $x =~ s%====%_%g; |
3560 | $x =~ s%====%_%g; |
3561 | 3561 | ||
3562 | return dbx_entity_escape($x); |
3562 | return dbx_entity_escape($x); |
3563 | } |
3563 | } |
3564 | 3564 | ||
3565 | sub dbx_para { |
3565 | sub dbx_para { |
3566 | my $x = &dbx_para_raw; |
3566 | my $x = &dbx_para_raw; |
3567 | return '' if $x =~ /^\s*$/s; |
3567 | return '' if $x =~ /^\s*$/s; |
3568 | my $prepara = $para_started ? '' : '<para>'; |
3568 | my $prepara = $para_started ? '' : '<para>'; |
3569 | return "$prepara$x</para>"; |
3569 | return "$prepara$x</para>"; |
3570 | } |
3570 | } |
3571 | 3571 | ||
3572 | sub dbx_format { |
3572 | sub dbx_format { |
3573 | return &dbx_para_raw; |
3573 | return &dbx_para_raw; |
3574 | } |
3574 | } |
3575 | 3575 | ||
3576 | ### |
3576 | ### |
3577 | ### NONL formatting |
3577 | ### NONL formatting |
3578 | ### |
3578 | ### |
3579 | 3579 | ||
3580 | sub nonl_format { |
3580 | sub nonl_format { |
3581 | my $x = join ' ', @_; |
3581 | my $x = join ' ', @_; |
3582 | return "\n" unless length $x; |
3582 | return "\n" unless length $x; |
3583 | local ($1,$2,$3,$4,$5,$6,$7,$8,$9); |
3583 | local ($1,$2,$3,$4,$5,$6,$7,$8,$9); |
3584 | 3584 | ||
3585 | if ($fn_style) { |
3585 | if ($fn_style) { |
3586 | #$x =~ s%<<footnote:\s*(.*?)\s*>>%<<footnote: $1>>%gse; |
3586 | #$x =~ s%<<footnote:\s*(.*?)\s*>>%<<footnote: $1>>%gse; |
3587 | } else { |
3587 | } else { |
3588 | $x =~ s%<<footnote:\s*(.*?)\s*>>%%gs; |
3588 | $x =~ s%<<footnote:\s*(.*?)\s*>>%%gs; |
3589 | } |
3589 | } |
3590 | $x =~ s%<<feedbackopts:.*?>>%%gs; |
3590 | $x =~ s%<<feedbackopts:.*?>>%%gs; |
3591 | # 1 1 2 2 3 3 |
3591 | # 1 1 2 2 3 3 |
3592 | $x =~ s%<<addfeedbacktop:(\w+):([^:]+):\s*(.*?)\s*>>%%gse; |
3592 | $x =~ s%<<addfeedbacktop:(\w+):([^:]+):\s*(.*?)\s*>>%%gse; |
3593 | $x =~ s%<<addfeedbackbot:(\w+):([^:]+):\s*(.*?)\s*>>%%gse; |
3593 | $x =~ s%<<addfeedbackbot:(\w+):([^:]+):\s*(.*?)\s*>>%%gse; |
3594 | # 1 1 2 2 3 3 4 4 |
3594 | # 1 1 2 2 3 3 4 4 |
3595 | $x =~ s%<<infobox:(\w+):([^:]*):([^:]*):\s*(.*?)\s*>>%%gse; |
3595 | $x =~ s%<<infobox:(\w+):([^:]*):([^:]*):\s*(.*?)\s*>>%%gse; |
3596 | $x =~ s%<<label:\s*(.*?)\s*>>%%gs; |
3596 | $x =~ s%<<label:\s*(.*?)\s*>>%%gs; |
3597 | $x =~ s%<<link:(.*?)(:\s+(.*?))?\s*>>%defined($3)?$3:$1%gsex; |
3597 | $x =~ s%<<link:(.*?)(:\s+(.*?))?\s*>>%defined($3)?$3:$1%gsex; |
3598 | $x =~ s/\(\*\*\*(.*?)\)//gs; |
3598 | $x =~ s/\(\*\*\*(.*?)\)//gs; |
3599 | 3599 | ||
3600 | # 1 2 34 5 6 7 8 |
3600 | # 1 2 34 5 6 7 8 |
3601 | #$x =~ s%<<(\S*?(\.((gif)|(jpe?g)|(svg)|(png)|(e?ps))))>>%^^^^img href="$1"/~~~~%gsx; |
3601 | #$x =~ s%<<(\S*?(\.((gif)|(jpe?g)|(svg)|(png)|(e?ps))))>>%^^^^img href="$1"/~~~~%gsx; |
3602 | $x =~ s%<<tt:\s*(.*?)>>%$1%gsex; |
3602 | $x =~ s%<<tt:\s*(.*?)>>%$1%gsex; |
3603 | $x =~ s%<<italic:\s*(.*?)>>%$1%gs; |
3603 | $x =~ s%<<italic:\s*(.*?)>>%$1%gs; |
3604 | $x =~ s%<<bold:\s*(.*?)>>%$1%gs; |
3604 | $x =~ s%<<bold:\s*(.*?)>>%$1%gs; |
3605 | #$x =~ s%<<seeix:\s*(\S[^:>]*):\s*(\S[^>]*)>>%^^^^a href="#$1"~~~~$2^^^^/a~~~~%gs; # Combined index and ref |
3605 | #$x =~ s%<<seeix:\s*(\S[^:>]*):\s*(\S[^>]*)>>%^^^^a href="#$1"~~~~$2^^^^/a~~~~%gs; # Combined index and ref |
3606 | 3606 | ||
3607 | # Fredrik Jonsson: Store reference as <see:ref> in html document for future resolving |
3607 | # Fredrik Jonsson: Store reference as <see:ref> in html document for future resolving |
3608 | #$x =~ s%<<see:\s*(\S[^>]*?)(?::\s+(\S[^>]*))?>>%"^^^^see:?:". fold_label($1) . "=$2~~~~"%gse; |
3608 | #$x =~ s%<<see:\s*(\S[^>]*?)(?::\s+(\S[^>]*))?>>%"^^^^see:?:". fold_label($1) . "=$2~~~~"%gse; |
3609 | 3609 | ||
3610 | $x =~ s%<<ix:\s*([^>]+)>>%$1%gs; # index entry |
3610 | $x =~ s%<<ix:\s*([^>]+)>>%$1%gs; # index entry |
3611 | $x =~ s%<<ixx:\s*([^>]+)>>%%gs; # hidden index entry |
3611 | $x =~ s%<<ixx:\s*([^>]+)>>%%gs; # hidden index entry |
3612 | $x =~ s%<<ref:\s*([^:]+): (.*?)>>%$2%gs; |
3612 | $x =~ s%<<ref:\s*([^:]+): (.*?)>>%$2%gs; |
3613 | $x =~ s|\\\\|\n|g; |
3613 | $x =~ s|\\\\|\n|g; |
3614 | 3614 | ||
3615 | $x =~ s|\*(\S.*?\S)\*|$1|gs; # bold |
3615 | $x =~ s|\*(\S.*?\S)\*|$1|gs; # bold |
3616 | $x =~ s{(\A|\s|\()\+([a-z].*?[\w.])\+}{$1$2}gsi; # italic |
3616 | $x =~ s{(\A|\s|\()\+([a-z].*?[\w.])\+}{$1$2}gsi; # italic |
3617 | $x =~ s|(?<!~)~([/\#\$\w-].*?[\w\)\}:])~(?!~)|$1|gsex; # computer output |
3617 | $x =~ s|(?<!~)~([/\#\$\w-].*?[\w\)\}:])~(?!~)|$1|gsex; # computer output |
3618 | $x =~ s|<<RAWTEX: (.*?)>>||gse; |
3618 | $x =~ s|<<RAWTEX: (.*?)>>||gse; |
3619 | $x =~ s|<<RAWDBX: (.*?)>>||gse; |
3619 | $x =~ s|<<RAWDBX: (.*?)>>||gse; |
3620 | $x =~ s|<<RAWRTF: (.*?)>>||gse; |
3620 | $x =~ s|<<RAWRTF: (.*?)>>||gse; |
3621 | $x =~ s|<<RAWHTML: (.*?)>>||gse; |
3621 | $x =~ s|<<RAWHTML: (.*?)>>||gse; |
3622 | 3622 | ||
3623 | #$x =~ s|~(\w.*?\w)~|<literal>$1</literal>|gs; |
3623 | #$x =~ s|~(\w.*?\w)~|<literal>$1</literal>|gs; |
3624 | #$x =~ s|\+(\w.*?\w)\+|<command>$1</command>|gs; |
3624 | #$x =~ s|\+(\w.*?\w)\+|<command>$1</command>|gs; |
3625 | #$x =~ s|!(\w.*?\w)!|<replaceable>$1</replaceable>|gs; |
3625 | #$x =~ s|!(\w.*?\w)!|<replaceable>$1</replaceable>|gs; |
3626 | #$x =~ s|\[(\w.*?\w)\]|[<link linkend="$1">$1</link>]|gs; # biblio refs |
3626 | #$x =~ s|\[(\w.*?\w)\]|[<link linkend="$1">$1</link>]|gs; # biblio refs |
3627 | #$x =~ s|\[(\w.*?[\w.])\]|$1|gsex; # biblio refs |
3627 | #$x =~ s|\[(\w.*?[\w.])\]|$1|gsex; # biblio refs |
3628 | #$x =~ s|||gs; |
3628 | #$x =~ s|||gs; |
3629 | 3629 | ||
3630 | # convert LaTeX leftovers to something reasonable |
3630 | # convert LaTeX leftovers to something reasonable |
3631 | $x =~ s|\\mu|µ|gs; |
3631 | $x =~ s|\\mu|µ|gs; |
3632 | $x =~ s|\\acute\{a\}|á|gs; |
3632 | $x =~ s|\\acute\{a\}|á|gs; |
3633 | $x =~ s|\\times| x |gs; |
3633 | $x =~ s|\\times| x |gs; |
3634 | $x =~ s|\\:| |gs; |
3634 | $x =~ s|\\:| |gs; |
3635 | $x =~ s|(?<!\\)\^\{([^\{\}]+)\}|$1|gs if $x =~ /\$/; |
3635 | $x =~ s|(?<!\\)\^\{([^\{\}]+)\}|$1|gs if $x =~ /\$/; |
3636 | $x =~ s|(?<!\\)\^(\w)|$1|gs if $x =~ /\$/; |
3636 | $x =~ s|(?<!\\)\^(\w)|$1|gs if $x =~ /\$/; |
3637 | $x =~ s|(?<!\\)_\{([^\{\}]+)\}|$1|gs if $x =~ /\$/; |
3637 | $x =~ s|(?<!\\)_\{([^\{\}]+)\}|$1|gs if $x =~ /\$/; |
3638 | $x =~ s|(?<!\\)_(\w)|$1|gs if $x =~ /\$/; |
3638 | $x =~ s|(?<!\\)_(\w)|$1|gs if $x =~ /\$/; |
3639 | $x =~ s/!\\/\\/g; # Backslash escape |
3639 | $x =~ s/!\\/\\/g; # Backslash escape |
3640 | $x =~ s|\$||gs; |
3640 | $x =~ s|\$||gs; |
3641 | $x =~ s|<dollari>|\$|gs; |
3641 | $x =~ s|<dollari>|\$|gs; |
3642 | $x =~ s|<ampersandi>|&|gs; |
3642 | $x =~ s|<ampersandi>|&|gs; |
3643 | $x =~ s|\\pm |±|gs; |
3643 | $x =~ s|\\pm |±|gs; |
3644 | $x =~ s|\\isotope\{(\d+)\}\{(\w+)\}|$1 $2|gs; |
3644 | $x =~ s|\\isotope\{(\d+)\}\{(\w+)\}|$1 $2|gs; |
3645 | $x =~ s/\\[a-z]+(\[[^]]+\])*(\{[^}]+\})*//gsi; # most LaTeX macros |
3645 | $x =~ s/\\[a-z]+(\[[^]]+\])*(\{[^}]+\})*//gsi; # most LaTeX macros |
3646 | $x =~ s/\\{/{/gs; |
3646 | $x =~ s/\\{/{/gs; |
3647 | $x =~ s/\\}/}/gs; |
3647 | $x =~ s/\\}/}/gs; |
3648 | $x =~ s%====%_%g; |
3648 | $x =~ s%====%_%g; |
3649 | 3649 | ||
3650 | return $x; |
3650 | return $x; |
3651 | } |
3651 | } |
3652 | 3652 | ||
3653 | sub nonl_para { |
3653 | sub nonl_para { |
3654 | my $x = &nonl_format; |
3654 | my $x = &nonl_format; |
3655 | $x =~ s/\r?\n\r?\n/<<PAR>>/g; |
3655 | $x =~ s/\r?\n\r?\n/<<PAR>>/g; |
3656 | $x =~ s/\s*\r?\n/ /g; |
3656 | $x =~ s/\s*\r?\n/ /g; |
3657 | $x =~ s/<<PAR>>/\n\n/g; |
3657 | $x =~ s/<<PAR>>/\n\n/g; |
3658 | return $x; |
3658 | return $x; |
3659 | } |
3659 | } |
3660 | 3660 | ||
3661 | sub pdseal_para { |
3661 | sub pdseal_para { |
3662 | my $x = join ' ', @_; |
3662 | my $x = join ' ', @_; |
3663 | $x =~ s|\\\\||g; |
3663 | $x =~ s|\\\\||g; |
3664 | $x =~ s%<<footnote:\s*(.*?)\s*>>%%gs; |
3664 | $x =~ s%<<footnote:\s*(.*?)\s*>>%%gs; |
3665 | $x =~ s%<<see:\s*(\S[^>]*?)(?::\s+(\S[^>]*))?>>%%gse; |
3665 | $x =~ s%<<see:\s*(\S[^>]*?)(?::\s+(\S[^>]*))?>>%%gse; |
3666 | $x = &nonl_format($x); |
3666 | $x = &nonl_format($x); |
3667 | $x =~ s/\r?\n\r?\n/<<PAR>>/g; |
3667 | $x =~ s/\r?\n\r?\n/<<PAR>>/g; |
3668 | $x =~ s/\s*\r?\n/ /g; |
3668 | $x =~ s/\s*\r?\n/ /g; |
3669 | $x =~ s/<<PAR>>/\n\n/g; |
3669 | $x =~ s/<<PAR>>/\n\n/g; |
3670 | return $x; |
3670 | return $x; |
3671 | } |
3671 | } |
3672 | 3672 | ||
3673 | ### |
3673 | ### |
3674 | ### RTF formatting |
3674 | ### RTF formatting |
3675 | ### |
3675 | ### |
3676 | 3676 | ||
3677 | sub rtf_format_infobox { |
3677 | sub rtf_format_infobox { |
3678 | my ($id,$link,$tableargs,$content) = @_; |
3678 | my ($id,$link,$tableargs,$content) = @_; |
3679 | return $content; |
3679 | return $content; |
3680 | } |
3680 | } |
3681 | 3681 | ||
3682 | sub rtf_para_raw { |
3682 | sub rtf_para_raw { |
3683 | my $x = join ' ', @_; |
3683 | my $x = join ' ', @_; |
3684 | return "\n" unless length $x; |
3684 | return "\n" unless length $x; |
3685 | local ($1,$2,$3,$4,$5,$6,$7,$8,$9); |
3685 | local ($1,$2,$3,$4,$5,$6,$7,$8,$9); |
3686 | 3686 | ||
3687 | if ($fn_style == 3) { |
3687 | if ($fn_style == 3) { |
3688 | $x =~ s%<<footnote:\s*(.*?)\s*>>%$fn_num++,qq({\\*\\footnote $1})%gse; |
3688 | $x =~ s%<<footnote:\s*(.*?)\s*>>%$fn_num++,qq({\\*\\footnote $1})%gse; |
3689 | } elsif ($fn_style == 1) { |
3689 | } elsif ($fn_style == 1) { |
3690 | $x =~ s%<<footnote:\s*(.*?)\s*>>%$fn_num++,qq(\\chftn{\\*\\footnote {\\up6\\chftn } $1})%gse; |
3690 | $x =~ s%<<footnote:\s*(.*?)\s*>>%$fn_num++,qq(\\chftn{\\*\\footnote {\\up6\\chftn } $1})%gse; |
3691 | #$x =~ s%<<footnote:\s*(.*?)\s*>>%$fn_num++,qq([*** fn$fn_num: $1 ***])%gse; |
3691 | #$x =~ s%<<footnote:\s*(.*?)\s*>>%$fn_num++,qq([*** fn$fn_num: $1 ***])%gse; |
3692 | } else { |
3692 | } else { |
3693 | $x =~ s%<<footnote:\s*(.*?)\s*>>%%gs; |
3693 | $x =~ s%<<footnote:\s*(.*?)\s*>>%%gs; |
3694 | } |
3694 | } |
3695 | $x =~ s%<<feedbackopts:.*?>>%%gs; |
3695 | $x =~ s%<<feedbackopts:.*?>>%%gs; |
3696 | $x =~ s%<<addfeedbacktop:.*?>>%%gs; |
3696 | $x =~ s%<<addfeedbacktop:.*?>>%%gs; |
3697 | $x =~ s%<<addfeedbackbot:.*?>>%%gs; |
3697 | $x =~ s%<<addfeedbackbot:.*?>>%%gs; |
3698 | $x =~ s%<<infobox:(\w+):([^:]*):([^:]*):\s*(.*?)\s*>>%rtf_format_infobox($1,$2,$3,$4)%gse; |
3698 | $x =~ s%<<infobox:(\w+):([^:]*):([^:]*):\s*(.*?)\s*>>%rtf_format_infobox($1,$2,$3,$4)%gse; |
3699 | $x =~ s/\(\*\*\*(.*?)\)//gs; |
3699 | $x =~ s/\(\*\*\*(.*?)\)//gs; |
3700 | 3700 | ||
3701 | # 1 2 34 5 6 7 8 |
3701 | # 1 2 34 5 6 7 8 |
3702 | $x =~ s%<<(\S*?(\.((gif)|(jpe?g)|(svg)|(png)|(e?ps))))>>% |
3702 | $x =~ s%<<(\S*?(\.((gif)|(jpe?g)|(svg)|(png)|(e?ps))))>>% |
3703 | $inline_open^^^^imagedata fileref="$1"/~~~~$inline_close%gsx; |
3703 | $inline_open^^^^imagedata fileref="$1"/~~~~$inline_close%gsx; |
3704 | $x =~ s%<<tt:\s*(.*?)>>%{\\f2 $1}%gs; |
3704 | $x =~ s%<<tt:\s*(.*?)>>%{\\f2 $1}%gs; |
3705 | $x =~ s%<<bold:\s*(.*?)>>%{\\b $1}%gs; |
3705 | $x =~ s%<<bold:\s*(.*?)>>%{\\b $1}%gs; |
3706 | $x =~ s%<<italic:\s*(.*?)>>%{\\i $1}%gs; |
3706 | $x =~ s%<<italic:\s*(.*?)>>%{\\i $1}%gs; |
3707 | $x =~ s%<<see:\s*(\S[^>]*?)(?::\s+(\S[^>]*))?>>%qq(^^^^xref linkend=") . fold_label($1) . qq("/~~~~)%gse; |
3707 | $x =~ s%<<see:\s*(\S[^>]*?)(?::\s+(\S[^>]*))?>>%qq(^^^^xref linkend=") . fold_label($1) . qq("/~~~~)%gse; |
3708 | $x =~ s%<<ix:\s*([^>]+)>>%{\\xe $1}%gs; # index entry |
3708 | $x =~ s%<<ix:\s*([^>]+)>>%{\\xe $1}%gs; # index entry |
3709 | $x =~ s%<<ref:\s*([^:]+): (.*?)>>%<xref linkend="$2"/>%gs; # *** should do proper ref |
3709 | $x =~ s%<<ref:\s*([^:]+): (.*?)>>%<xref linkend="$2"/>%gs; # *** should do proper ref |
3710 | $x =~ s|<(/?\w.*?/?)>|^^^^$tag_tag~~~~<$1>^^^^/$tag_tag~~~~|gs; |
3710 | $x =~ s|<(/?\w.*?/?)>|^^^^$tag_tag~~~~<$1>^^^^/$tag_tag~~~~|gs; |
3711 | # *** add URL, email, and file path detection |
3711 | # *** add URL, email, and file path detection |
3712 | $x =~ s|\\\\|\\ql\\line |g; |
3712 | $x =~ s|\\\\|\\ql\\line |g; |
3713 | $x =~ s|\^\^\^\^\^\^\^\^RAWTEX: (.*?)~~~~~~~~||gse; |
3713 | $x =~ s|\^\^\^\^\^\^\^\^RAWTEX: (.*?)~~~~~~~~||gse; |
3714 | $x =~ s|\^\^\^\^\^\^\^\^RAWDBX: (.*?)~~~~~~~~||gse; |
3714 | $x =~ s|\^\^\^\^\^\^\^\^RAWDBX: (.*?)~~~~~~~~||gse; |
3715 | $x =~ s|\^\^\^\^\^\^\^\^RAWRTF: (.*?)~~~~~~~~|unhexit($1)|gse; |
3715 | $x =~ s|\^\^\^\^\^\^\^\^RAWRTF: (.*?)~~~~~~~~|unhexit($1)|gse; |
3716 | $x =~ s|\^\^\^\^\^\^\^\^RAWHTML: (.*?)~~~~~~~~||gse; |
3716 | $x =~ s|\^\^\^\^\^\^\^\^RAWHTML: (.*?)~~~~~~~~||gse; |
3717 | $x =~ s|\^\^\^\^|<|g; |
3717 | $x =~ s|\^\^\^\^|<|g; |
3718 | $x =~ s|~~~~|>|g; |
3718 | $x =~ s|~~~~|>|g; |
3719 | $x =~ s<\*(\S.*?\S)\*><{\\b $1}>gs; # bold |
3719 | $x =~ s<\*(\S.*?\S)\*><{\\b $1}>gs; # bold |
3720 | $x =~ s<(\A|\s|\()\+([a-z].*?[\w.])\+><$1\{\\i $2\}>gsi; # italic |
3720 | $x =~ s<(\A|\s|\()\+([a-z].*?[\w.])\+><$1\{\\i $2\}>gsi; # italic |
3721 | #$x =~ s|([\s\(])\+([a-z].*?\w)\+|$1{\\i $2}|gsi; # Italic *** |
3721 | #$x =~ s|([\s\(])\+([a-z].*?\w)\+|$1{\\i $2}|gsi; # Italic *** |
3722 | $x =~ s|~(\S.*?\S)~|{\\f2 $1 }|gs; |
3722 | $x =~ s|~(\S.*?\S)~|{\\f2 $1 }|gs; |
3723 | $x =~ s|~([/\#\$\w-].*?[\w\)])~|{\\f2 $1 }|gs; |
3723 | $x =~ s|~([/\#\$\w-].*?[\w\)])~|{\\f2 $1 }|gs; |
3724 | #$x =~ s|~(\S.*?\S)~|<literal>$1</literal>|gs; |
3724 | #$x =~ s|~(\S.*?\S)~|<literal>$1</literal>|gs; |
3725 | #$x =~ s|\+(\S.*?\S)\+|<command>$1</command>|gs; |
3725 | #$x =~ s|\+(\S.*?\S)\+|<command>$1</command>|gs; |
3726 | #$x =~ s|!(\S.*?\S)!|<replaceable>$1</replaceable>|gs; |
3726 | #$x =~ s|!(\S.*?\S)!|<replaceable>$1</replaceable>|gs; |
3727 | #$x =~ s|\[(\S.*?\S)\]|[<link linkend="$1">$1</link>]|gs; # biblio refs |
3727 | #$x =~ s|\[(\S.*?\S)\]|[<link linkend="$1">$1</link>]|gs; # biblio refs |
3728 | $x =~ s|\[(\w.*?[\w.])\]|<xref linkend="$1"/>|gs; # biblio refs |
3728 | $x =~ s|\[(\w.*?[\w.])\]|<xref linkend="$1"/>|gs; # biblio refs |
3729 | 3729 | ||
3730 | # convert LaTeX leftovers to something reasonable |
3730 | # convert LaTeX leftovers to something reasonable |
3731 | $x =~ s|\\mu|µ|gs; |
3731 | $x =~ s|\\mu|µ|gs; |
3732 | $x =~ s|\\acute\{a\}|á|gs; |
3732 | $x =~ s|\\acute\{a\}|á|gs; |
3733 | $x =~ s|\\times| x |gs; |
3733 | $x =~ s|\\times| x |gs; |
3734 | $x =~ s|\\:| |gs; |
3734 | $x =~ s|\\:| |gs; |
3735 | $x =~ s|(?<!\\)\^\{([^\{\}]+)\}|{\\up $1}|gs if $x =~ /\$/; |
3735 | $x =~ s|(?<!\\)\^\{([^\{\}]+)\}|{\\up $1}|gs if $x =~ /\$/; |
3736 | $x =~ s|(?<!\\)\^(\w)|{\\up $1}|gs if $x =~ /\$/; |
3736 | $x =~ s|(?<!\\)\^(\w)|{\\up $1}|gs if $x =~ /\$/; |
3737 | $x =~ s|(?<!\\)_\{([^\{\}]+)\}|{\\dn $1}|gs if $x =~ /\$/; |
3737 | $x =~ s|(?<!\\)_\{([^\{\}]+)\}|{\\dn $1}|gs if $x =~ /\$/; |
3738 | $x =~ s|(?<!\\)_(\w)|{\\dn $1}|gs if $x =~ /\$/; |
3738 | $x =~ s|(?<!\\)_(\w)|{\\dn $1}|gs if $x =~ /\$/; |
3739 | $x =~ s/!\\/\\/g; # Backslash escape |
3739 | $x =~ s/!\\/\\/g; # Backslash escape |
3740 | $x =~ s|\$||gs; |
3740 | $x =~ s|\$||gs; |
3741 | $x =~ s|<dollari>|\$|gs; |
3741 | $x =~ s|<dollari>|\$|gs; |
3742 | $x =~ s|<ampersandi>|&|gs; |
3742 | $x =~ s|<ampersandi>|&|gs; |
3743 | $x =~ s|\\pm |±|gs; |
3743 | $x =~ s|\\pm |±|gs; |
3744 | $x =~ s|\\isotope\{(\d+)\}\{(\w+)\}|<sup>$1</sup>$2|gs; |
3744 | $x =~ s|\\isotope\{(\d+)\}\{(\w+)\}|<sup>$1</sup>$2|gs; |
3745 | #$x =~ s/\\[a-z]+(\[[^]]+\])*(\{[^}]+\})*//gsi; # most LaTeX macros |
3745 | #$x =~ s/\\[a-z]+(\[[^]]+\])*(\{[^}]+\})*//gsi; # most LaTeX macros |
3746 | $x =~ s/\\{/{/gs; |
3746 | $x =~ s/\\{/{/gs; |
3747 | $x =~ s/\\}/}/gs; |
3747 | $x =~ s/\\}/}/gs; |
3748 | $x =~ s%====%_%g; |
3748 | $x =~ s%====%_%g; |
3749 | 3749 | ||
3750 | return $x; |
3750 | return $x; |
3751 | } |
3751 | } |
3752 | 3752 | ||
3753 | sub rtf_para { |
3753 | sub rtf_para { |
3754 | my $x = &rtf_para_raw; |
3754 | my $x = &rtf_para_raw; |
3755 | return '' if $x =~ /^\s*$/s; |
3755 | return '' if $x =~ /^\s*$/s; |
3756 | #my $prepara = $para_started ? '' : '\\par '; |
3756 | #my $prepara = $para_started ? '' : '\\par '; |
3757 | #return "$prepara$x"; |
3757 | #return "$prepara$x"; |
3758 | #return "{\\pard $rtf_styles{'s10'} \\s10 $x\\par}\n"; |
3758 | #return "{\\pard $rtf_styles{'s10'} \\s10 $x\\par}\n"; |
3759 | 3759 | ||
3760 | # We want the paragraphs to inherit style from containg unit, e.g. to preserve |
3760 | # We want the paragraphs to inherit style from containg unit, e.g. to preserve |
3761 | # list indentation. |
3761 | # list indentation. |
3762 | return "{$x\\par}\\fi0\n"; |
3762 | return "{$x\\par}\\fi0\n"; |
3763 | } |
3763 | } |
3764 | 3764 | ||
3765 | sub rtf_format { |
3765 | sub rtf_format { |
3766 | return &rtf_para_raw; |
3766 | return &rtf_para_raw; |
3767 | } |
3767 | } |
3768 | 3768 | ||
3769 | ### |
3769 | ### |
3770 | ### HTML formatting |
3770 | ### HTML formatting |
3771 | ### |
3771 | ### |
3772 | 3772 | ||
3773 | sub tag { |
3773 | sub tag { |
3774 | my ($tag, $cont) = @_; |
3774 | my ($tag, $cont) = @_; |
3775 | if ($cont) { |
3775 | if ($cont) { |
3776 | my ($thetag) = split /\s+/, $tag, 2; |
3776 | my ($thetag) = split /\s+/, $tag, 2; |
3777 | return qq(^^^^$tag~~~~$cont^^^^/$thetag~~~~); |
3777 | return qq(^^^^$tag~~~~$cont^^^^/$thetag~~~~); |
3778 | } else { |
3778 | } else { |
3779 | return qq(^^^^$tag~~~~); |
3779 | return qq(^^^^$tag~~~~); |
3780 | } |
3780 | } |
3781 | } |
3781 | } |
3782 | 3782 | ||
3783 | sub html_format_func { |
3783 | sub html_format_func { |
3784 | my ($ret, $func, $args) = @_; |
3784 | my ($ret, $func, $args) = @_; |
3785 | my $proto = "$ret$func($args)"; |
3785 | my $proto = "$ret$func($args)"; |
3786 | #warn "CANDIDATE html func($func)\n"; |
3786 | #warn "CANDIDATE html func($func)\n"; |
3787 | return $proto if $not_a_path{$proto}; |
3787 | return $proto if $not_a_path{$proto}; |
3788 | #return "$ret$func($args)" if !$pdflag{'autoformat'}; |
3788 | #return "$ret$func($args)" if !$pdflag{'autoformat'}; |
3789 | $proto =~ s%_%====%g; |
3789 | $proto =~ s%_%====%g; |
3790 | #warn "html func($func)\n"; |
3790 | #warn "html func($func)\n"; |
3791 | return tag('i', $proto); |
3791 | return tag('i', $proto); |
3792 | } |
3792 | } |
3793 | 3793 | ||
3794 | sub html_format_email { |
3794 | sub html_format_email { |
3795 | my ($uid, $dom) = @_; |
3795 | my ($uid, $dom) = @_; |
3796 | my $addr = "$uid\@$dom"; |
3796 | my $addr = "$uid\@$dom"; |
3797 | return $addr if $not_a_path{$addr} || $not_a_url{$addr}; |
3797 | return $addr if $not_a_path{$addr} || $not_a_url{$addr}; |
3798 | #warn "email uid($uid) dom($dom)\n"; |
3798 | #warn "email uid($uid) dom($dom)\n"; |
3799 | #return "$uid\@$dom" if !$pdflag{'autoformat'}; |
3799 | #return "$uid\@$dom" if !$pdflag{'autoformat'}; |
3800 | $addr =~ s%_%====%g; |
3800 | $addr =~ s%_%====%g; |
3801 | $addr =~ s|\.|''''|g; |
3801 | $addr =~ s|\.|''''|g; |
3802 | return tag(qq(a href="mailto:$addr"), "$addr"); |
3802 | return tag(qq(a href="mailto:$addr"), "$addr"); |
3803 | } |
3803 | } |
3804 | 3804 | ||
3805 | sub html_format_url { |
3805 | sub html_format_url { |
3806 | my ($url, $what) = @_; |
3806 | my ($url, $what) = @_; |
3807 | return $url if $not_a_path{$url} || $not_a_url{$url}; |
3807 | return $url if $not_a_path{$url} || $not_a_url{$url}; |
3808 | #warn "url($url) $what\n"; |
3808 | #warn "url($url) $what\n"; |
3809 | #return $url if !$pdflag{'autoformat'}; |
3809 | #return $url if !$pdflag{'autoformat'}; |
3810 | $url =~ s%_%====%g; |
3810 | $url =~ s%_%====%g; |
3811 | $url =~ s|\.|''''|g; |
3811 | $url =~ s|\.|''''|g; |
3812 | $url =~ s|/|""""|g; |
3812 | $url =~ s|/|""""|g; |
3813 | my $link = $url; |
3813 | my $link = $url; |
3814 | $link = 'http://'.$link if $link !~ m{:""""""""}; |
3814 | $link = 'http://'.$link if $link !~ m{:""""""""}; |
3815 | return tag(qq(a href="$link"), $url); |
3815 | return tag(qq(a href="$link"), $url); |
3816 | } |
3816 | } |
3817 | 3817 | ||
3818 | sub html_format_country_url { |
3818 | sub html_format_country_url { |
3819 | my ($url, $cc, $what) = @_; |
3819 | my ($url, $cc, $what) = @_; |
3820 | return $url if $not_a_country{$cc}; |
3820 | return $url if $not_a_country{$cc}; |
3821 | return $url if $not_a_path{$url} || $not_a_url{$url}; |
3821 | return $url if $not_a_path{$url} || $not_a_url{$url}; |
3822 | #warn "url($url) cc($cc) $what"; |
3822 | #warn "url($url) cc($cc) $what"; |
3823 | return html_format_url($url); |
3823 | return html_format_url($url); |
3824 | } |
3824 | } |
3825 | 3825 | ||
3826 | sub html_format_path { |
3826 | sub html_format_path { |
3827 | my ($path,$what) = @_; |
3827 | my ($path,$what) = @_; |
3828 | return $path if $not_a_path{$path}; |
3828 | return $path if $not_a_path{$path}; |
3829 | return $path if $path=~m|^[0-9/.,-]+$|s; # Avoid pure numbers like 12/34 or 1.2 |
3829 | return $path if $path=~m|^[0-9/.,-]+$|s; # Avoid pure numbers like 12/34 or 1.2 |
3830 | #warn "path($path) $what"; |
3830 | #warn "path($path) $what"; |
3831 | $path =~ s%_%====%g; |
3831 | $path =~ s%_%====%g; |
3832 | $path =~ s|\.|''''|g; |
3832 | $path =~ s|\.|''''|g; |
3833 | $path =~ s|/|""""|g; |
3833 | $path =~ s|/|""""|g; |
3834 | return tag('tt', $path); |
3834 | return tag('tt', $path); |
3835 | } |
3835 | } |
3836 | 3836 | ||
3837 | sub html_format_ip { |
3837 | sub html_format_ip { |
3838 | my ($path,$what) = @_; |
3838 | my ($path,$what) = @_; |
3839 | return $path if $not_a_path{$path}; |
3839 | return $path if $not_a_path{$path}; |
3840 | return $path if $path=~m|^\d+\.\d+\.?$|s; # Avoid pure numbers like 1.2 |
3840 | return $path if $path=~m|^\d+\.\d+\.?$|s; # Avoid pure numbers like 1.2 |
3841 | return $path if $path=~m|^\d+\.\d+\.\d+\.?$|s; # Avoid pure numbers like 1.2.3 |
3841 | return $path if $path=~m|^\d+\.\d+\.\d+\.?$|s; # Avoid pure numbers like 1.2.3 |
3842 | #warn "path($path) $what"; |
3842 | #warn "path($path) $what"; |
3843 | $path =~ s%_%====%g; |
3843 | $path =~ s%_%====%g; |
3844 | $path =~ s|\.|''''|g; |
3844 | $path =~ s|\.|''''|g; |
3845 | $path =~ s|/|""""|g; |
3845 | $path =~ s|/|""""|g; |
3846 | return tag('tt', $path); |
3846 | return tag('tt', $path); |
3847 | } |
3847 | } |
3848 | 3848 | ||
3849 | sub html_format_ref { |
3849 | sub html_format_ref { |
3850 | my ($ref) = @_; |
3850 | my ($ref) = @_; |
3851 | return qq([$ref]); |
3851 | return qq([$ref]); |
3852 | } |
3852 | } |
3853 | 3853 | ||
3854 | sub html_format_tt { |
3854 | sub html_format_tt { |
3855 | my ($tt) = @_; |
3855 | my ($tt) = @_; |
3856 | $tt =~ s/\$/^^^^dollari~~~~/gs; |
3856 | $tt =~ s/\$/^^^^dollari~~~~/gs; |
3857 | return tag('tt', $tt); |
3857 | return tag('tt', $tt); |
3858 | } |
3858 | } |
3859 | 3859 | ||
3860 | sub html_format_fn { |
3860 | sub html_format_fn { |
3861 | my ($note) = @_; |
3861 | my ($note) = @_; |
3862 | ++$fn_num; |
3862 | ++$fn_num; |
3863 | $note =~ s/\"/^^^^ampersandi~~~~quot;/gs; # Quote friendly |
3863 | $note =~ s/\"/^^^^ampersandi~~~~quot;/gs; # Quote friendly |
3864 | $note =~ s%</?\w+.*?>%%gs; # Zap tags such as <i> or <tt> |
3864 | $note =~ s%</?\w+.*?>%%gs; # Zap tags such as <i> or <tt> |
3865 | #warn "FN($note)"; |
3865 | #warn "FN($note)"; |
3866 | $note = " (($note))"; # Renders much more naturally |
3866 | $note = " (($note))"; # Renders much more naturally |
3867 | return tag(qq(img src="fn.png" title="$note" alt="$note")); |
3867 | return tag(qq(img src="fn.png" title="$note" alt="$note")); |
3868 | } |
3868 | } |
3869 | 3869 | ||
3870 | sub html_format_infobox { |
3870 | sub html_format_infobox { |
3871 | my ($id,$link,$tableargs,$content) = @_; |
3871 | my ($id,$link,$tableargs,$content) = @_; |
3872 | #$note =~ s/\"/^^^^ampersandi~~~~quot;/gs; # Quote friendly |
3872 | #$note =~ s/\"/^^^^ampersandi~~~~quot;/gs; # Quote friendly |
3873 | #$note =~ s%</?\w+.*?>%%gs; # Zap tags such as <i> or <tt> |
3873 | #$note =~ s%</?\w+.*?>%%gs; # Zap tags such as <i> or <tt> |
3874 | #warn "infobox($note)"; |
3874 | #warn "infobox($note)"; |
3875 | $content =~ s/</^^^^/gs; |
3875 | $content =~ s/</^^^^/gs; |
3876 | $content =~ s/>/~~~~/gs; |
3876 | $content =~ s/>/~~~~/gs; |
3877 | if (length($link)) { |
3877 | if (length($link)) { |
3878 | return tag(qq(a href="#" onClick="vis('$id',$id=!$id);")).$link.tag('/a') |
3878 | return tag(qq(a href="#" onClick="vis('$id',$id=!$id);")).$link.tag('/a') |
3879 | .tag(qq(table id=$id $tableargs)).tag('tr').tag('td').$content |
3879 | .tag(qq(table id=$id $tableargs)).tag('tr').tag('td').$content |
3880 | .tag('/td').tag('/tr').tag('/table'); |
3880 | .tag('/td').tag('/tr').tag('/table'); |
3881 | } else { |
3881 | } else { |
3882 | return tag(qq(table id=$id $tableargs)).tag('tr').tag('td').$content |
3882 | return tag(qq(table id=$id $tableargs)).tag('tr').tag('td').$content |
3883 | .tag('/td').tag('/tr').tag('/table'); |
3883 | .tag('/td').tag('/tr').tag('/table'); |
3884 | } |
3884 | } |
3885 | } |
3885 | } |
3886 | 3886 | ||
3887 | sub html_format_addfeedback { |
3887 | sub html_format_addfeedback { |
3888 | my ($vis,$link,$title) = @_; |
3888 | my ($vis,$link,$title) = @_; |
3889 | return '' if !$vis; |
3889 | return '' if !$vis; |
3890 | my $templ = readall('pdblogcom.html'); |
3890 | my $templ = readall('pdblogcom.html'); |
3891 | $templ =~ s/!!LINK/$link/gs; |
3891 | $templ =~ s/!!LINK/$link/gs; |
3892 | $templ =~ s/!!TIT/$title/gs; |
3892 | $templ =~ s/!!TIT/$title/gs; |
3893 | $templ =~ s/!!BASE/$base/gs; |
3893 | $templ =~ s/!!BASE/$base/gs; |
3894 | $templ =~ s/</^^^^/gs; |
3894 | $templ =~ s/</^^^^/gs; |
3895 | $templ =~ s/>/~~~~/gs; |
3895 | $templ =~ s/>/~~~~/gs; |
3896 | return $templ; |
3896 | return $templ; |
3897 | } |
3897 | } |
3898 | 3898 | ||
3899 | sub html_biblio { |
3899 | sub html_biblio { |
3900 | my ($bibref) = @_; |
3900 | my ($bibref) = @_; |
3901 | return '['.$biblio.']' if $not_a_path{$biblio}; |
3901 | return '['.$biblio.']' if $not_a_path{$biblio}; |
3902 | return qq([<a href="#$bibref"/>$1</a>]); |
3902 | return qq([<a href="#$bibref"/>$1</a>]); |
3903 | } |
3903 | } |
3904 | 3904 | ||
3905 | sub html_format { |
3905 | sub html_format { |
3906 | my $x = join ' ', @_; |
3906 | my $x = join ' ', @_; |
3907 | return "\n" unless length $x; |
3907 | return "\n" unless length $x; |
3908 | local ($1,$2,$3,$4,$5,$6,$7,$8,$9); |
3908 | local ($1,$2,$3,$4,$5,$6,$7,$8,$9); |
3909 | 3909 | ||
3910 | if ($fn_style) { |
3910 | if ($fn_style) { |
3911 | $x =~ s%<<footnote:\s*(.*?)\s*>>%html_format_fn($1)%gse; |
3911 | $x =~ s%<<footnote:\s*(.*?)\s*>>%html_format_fn($1)%gse; |
3912 | } else { |
3912 | } else { |
3913 | $x =~ s%<<footnote:\s*(.*?)\s*>>%%gs; |
3913 | $x =~ s%<<footnote:\s*(.*?)\s*>>%%gs; |
3914 | } |
3914 | } |
3915 | $x =~ s%<<feedbackopts:.*?>>%%gs; |
3915 | $x =~ s%<<feedbackopts:.*?>>%%gs; |
3916 | # 1 1 2 2 3 3 |
3916 | # 1 1 2 2 3 3 |
3917 | $x =~ s%<<addfeedbacktop:(\w+):([^:]+):\s*(.*?)\s*>>%html_format_addfeedback($1,$2,$3)%gse; |
3917 | $x =~ s%<<addfeedbacktop:(\w+):([^:]+):\s*(.*?)\s*>>%html_format_addfeedback($1,$2,$3)%gse; |
3918 | $x =~ s%<<addfeedbackbot:(\w+):([^:]+):\s*(.*?)\s*>>%html_format_addfeedback($1,$2,$3)%gse; |
3918 | $x =~ s%<<addfeedbackbot:(\w+):([^:]+):\s*(.*?)\s*>>%html_format_addfeedback($1,$2,$3)%gse; |
3919 | # 1 1 2 2 3 3 4 4 |
3919 | # 1 1 2 2 3 3 4 4 |
3920 | $x =~ s%<<infobox:(\w+):([^:]*):([^:]*):\s*(.*?)\s*>>%html_format_infobox($1,$2,$3,$4)%gse; |
3920 | $x =~ s%<<infobox:(\w+):([^:]*):([^:]*):\s*(.*?)\s*>>%html_format_infobox($1,$2,$3,$4)%gse; |
3921 | $x =~ s%<<label:\s*(.*?)\s*>>%^^^^a id="$1"~~~~^^^^/a~~~~%gs; |
3921 | $x =~ s%<<label:\s*(.*?)\s*>>%^^^^a id="$1"~~~~^^^^/a~~~~%gs; |
3922 | $x =~ s%<<link:(.*?)(:\s+(.*?))?\s*>>%qq(^^^^a href="$1"~~~~).(defined($3)?$3:$1).'^^^^/a~~~~'%gsex; |
3922 | $x =~ s%<<link:(.*?)(:\s+(.*?))?\s*>>%qq(^^^^a href="$1"~~~~).(defined($3)?$3:$1).'^^^^/a~~~~'%gsex; |
3923 | $x =~ s/\(\*\*\*(.*?)\)//gs; |
3923 | $x =~ s/\(\*\*\*(.*?)\)//gs; |
3924 | 3924 | ||
3925 | if ($pdflag{'autoformat'} == 1) { |
3925 | if ($pdflag{'autoformat'} == 1) { |
3926 | # function and email detection |
3926 | # function and email detection |
3927 | # 1 12 2 3 3 4 4 5 5 |
3927 | # 1 12 2 3 3 4 4 5 5 |
3928 | $x =~ s{(\A|\s|\()([a-z0-9_:]+=)?([a-z0-9_.:-]+)\(([a-z0-9_:, -]*)\)([,.!?\)]?)(?=\s|\Z)}{$1.html_format_func($2,$3,$4).$5}gisex; |
3928 | $x =~ s{(\A|\s|\()([a-z0-9_:]+=)?([a-z0-9_.:-]+)\(([a-z0-9_:, -]*)\)([,.!?\)]?)(?=\s|\Z)}{$1.html_format_func($2,$3,$4).$5}gisex; |
3929 | # 1 12 2 3 34 4 |
3929 | # 1 12 2 3 34 4 |
3930 | $x =~ s{(\A|\s|\(|\<)([a-z0-9_.-]+)\@([a-z0-9_.-]+?)([,.!?\)\>]?)(?=\s|\Z)}{$1.html_format_email($2,$3).$4}gisex; |
3930 | $x =~ s{(\A|\s|\(|\<)([a-z0-9_.-]+)\@([a-z0-9_.-]+?)([,.!?\)\>]?)(?=\s|\Z)}{$1.html_format_email($2,$3).$4}gisex; |
3931 | 3931 | ||
3932 | # URL and domain name detection |
3932 | # URL and domain name detection |
3933 | # 1 12 23 3 |
3933 | # 1 12 23 3 |
3934 | $x =~ s{(\A|\s|\()([a-z]+://[a-z0-9][a-z0-9_.:/?&=+%\#-]+)([,.!?\)]?)(?=\s|\Z)}{$1.html_format_url($2,"proto2://$3/").$3}gisex; |
3934 | $x =~ s{(\A|\s|\()([a-z]+://[a-z0-9][a-z0-9_.:/?&=+%\#-]+)([,.!?\)]?)(?=\s|\Z)}{$1.html_format_url($2,"proto2://$3/").$3}gisex; |
3935 | # 1 12 23 3 |
3935 | # 1 12 23 3 |
3936 | $x =~ s{(\A|\s|\()(www\.[a-z0-9_-]+\.[a-z0-9][a-z0-9_.:/?&=+%-]+)([,.!?\)]?)(?=\s|\Z)}{$1.html_format_url($2,'www').$3}gisex; |
3936 | $x =~ s{(\A|\s|\()(www\.[a-z0-9_-]+\.[a-z0-9][a-z0-9_.:/?&=+%-]+)([,.!?\)]?)(?=\s|\Z)}{$1.html_format_url($2,'www').$3}gisex; |
3937 | # 1 12 23 3 |
3937 | # 1 12 23 3 |
3938 | $x =~ s{(\A|\s|\()(ftp\.[a-z0-9_-]+\.[a-z0-9][a-z0-9_.:/?&=+%-]+)([,.!?\)]?)(?=\s|\Z)}{$1.html_format_url($2,'ftp').$3}gisex; |
3938 | $x =~ s{(\A|\s|\()(ftp\.[a-z0-9_-]+\.[a-z0-9][a-z0-9_.:/?&=+%-]+)([,.!?\)]?)(?=\s|\Z)}{$1.html_format_url($2,'ftp').$3}gisex; |
3939 | # 1 12 3 3 24 4 |
3939 | # 1 12 3 3 24 4 |
3940 | $x =~ s{(\A|\s|\()([a-z0-9][a-z0-9_.-]+[a-z0-9]\.com(/[a-z0-9_.:/?&=+%-]+)?)([,.!?\)]?)(?=\s|\Z)}{$1.html_format_url($2,'com').$4}gisex; |
3940 | $x =~ s{(\A|\s|\()([a-z0-9][a-z0-9_.-]+[a-z0-9]\.com(/[a-z0-9_.:/?&=+%-]+)?)([,.!?\)]?)(?=\s|\Z)}{$1.html_format_url($2,'com').$4}gisex; |
3941 | $x =~ s{(\A|\s|\()([a-z0-9][a-z0-9_.-]+[a-z0-9]\.net(/[a-z0-9_.:/?&=+%-]+)?)([,.!?\)]?)(?=\s|\Z)}{$1.html_format_url($2,'net').$4}gisex; |
3941 | $x =~ s{(\A|\s|\()([a-z0-9][a-z0-9_.-]+[a-z0-9]\.net(/[a-z0-9_.:/?&=+%-]+)?)([,.!?\)]?)(?=\s|\Z)}{$1.html_format_url($2,'net').$4}gisex; |
3942 | $x =~ s{(\A|\s|\()([a-z0-9][a-z0-9_.-]+[a-z0-9]\.org(/[a-z0-9_.:/?&=+%-]+)?)([,.!?\)]?)(?=\s|\Z)}{$1.html_format_url($2,'org').$4}gisex; |
3942 | $x =~ s{(\A|\s|\()([a-z0-9][a-z0-9_.-]+[a-z0-9]\.org(/[a-z0-9_.:/?&=+%-]+)?)([,.!?\)]?)(?=\s|\Z)}{$1.html_format_url($2,'org').$4}gisex; |
3943 | 3943 | ||
3944 | # 1 12 3 34 4 25 5 |
3944 | # 1 12 3 34 4 25 5 |
3945 | $x =~ s{(\A|\s|\()([a-z0-9][a-z0-9_.-]+[a-z0-9]\.([a-z][a-z])(/[a-z0-9_.:/?&=+%-]+)?)([,.!?\)]?)(?=\s|\Z)}{$1.html_format_country_url($2,$3,"cc_url($5)").$5}gisex; |
3945 | $x =~ s{(\A|\s|\()([a-z0-9][a-z0-9_.-]+[a-z0-9]\.([a-z][a-z])(/[a-z0-9_.:/?&=+%-]+)?)([,.!?\)]?)(?=\s|\Z)}{$1.html_format_country_url($2,$3,"cc_url($5)").$5}gisex; |
3946 | #warn "==[$x]=="; |
3946 | #warn "==[$x]=="; |
3947 | 3947 | ||
3948 | # file path detection |
3948 | # file path detection |
3949 | # 1 12 23 3 |
3949 | # 1 12 23 3 |
3950 | $x =~ s{(\A|\s|\()(~?[a-z0-9_./-]*\.[a-z][a-z0-9_]*?)([,.!?\)]{0,2})(?=\s|\Z)}{$1.html_format_path($2,"path1($3)").$3}gisex; |
3950 | $x =~ s{(\A|\s|\()(~?[a-z0-9_./-]*\.[a-z][a-z0-9_]*?)([,.!?\)]{0,2})(?=\s|\Z)}{$1.html_format_path($2,"path1($3)").$3}gisex; |
3951 | # 1 12 23 3 |
3951 | # 1 12 23 3 |
3952 | $x =~ s{(\A|\s|\()(~?[a-z0-9_.-]*/[a-z0-9_./-]*?)([,.!?\)]{0,2})(?=\s|\Z)}{$1.html_format_path($2,"path2($3)").$3}gisex; |
3952 | $x =~ s{(\A|\s|\()(~?[a-z0-9_.-]*/[a-z0-9_./-]*?)([,.!?\)]{0,2})(?=\s|\Z)}{$1.html_format_path($2,"path2($3)").$3}gisex; |
3953 | # 1 12 23 34 term 4 URN detect |
3953 | # 1 12 23 34 term 4 URN detect |
3954 | $x =~ s{(\A|\s|\()(urn:[a-z0-9_./:-]*?)([,.!?\)]{0,2})(?=\s|\Z)}{$1.html_format_path($2,"urn($3)").$3}gisex; |
3954 | $x =~ s{(\A|\s|\()(urn:[a-z0-9_./:-]*?)([,.!?\)]{0,2})(?=\s|\Z)}{$1.html_format_path($2,"urn($3)").$3}gisex; |
3955 | # 1 12 23 3 |
3955 | # 1 12 23 3 |
3956 | $x =~ s{(\A|\s|\()(\d+\.[\d./*]+)([,.!?\)]{0,2})(?=\s|\Z)}{$1.html_format_ip($2,"ip($3)").$3}gisex; |
3956 | $x =~ s{(\A|\s|\()(\d+\.[\d./*]+)([,.!?\)]{0,2})(?=\s|\Z)}{$1.html_format_ip($2,"ip($3)").$3}gisex; |
3957 | } |
3957 | } |
3958 | 3958 | ||
3959 | # 1 2 34 5 6 7 8 |
3959 | # 1 2 34 5 6 7 8 |
3960 | $x =~ s%<<(\S*?(\.((gif)|(jpe?g)|(svg)|(png)|(e?ps))))>>%^^^^img href="$1"/~~~~%gsx; |
3960 | $x =~ s%<<(\S*?(\.((gif)|(jpe?g)|(svg)|(png)|(e?ps))))>>%^^^^img href="$1"/~~~~%gsx; |
3961 | $x =~ s%<<tt:\s*(.*?)>>%html_format_tt($1)%gsex; |
3961 | $x =~ s%<<tt:\s*(.*?)>>%html_format_tt($1)%gsex; |
3962 | $x =~ s%<<italic:\s*(.*?)>>%^^^^i~~~~$1^^^^/i~~~~%gs; |
3962 | $x =~ s%<<italic:\s*(.*?)>>%^^^^i~~~~$1^^^^/i~~~~%gs; |
3963 | $x =~ s%<<bold:\s*(.*?)>>%^^^^b~~~~$1^^^^/b~~~~%gs; |
3963 | $x =~ s%<<bold:\s*(.*?)>>%^^^^b~~~~$1^^^^/b~~~~%gs; |
3964 | $x =~ s%<<br:\s*>>%^^^^br~~~~%gs; |
3964 | $x =~ s%<<br:\s*>>%^^^^br~~~~%gs; |
3965 | $x =~ s%<<seeix:\s*(\S[^:>]*):\s*(\S[^>]*)>>%^^^^a href="#$1"~~~~$2^^^^/a~~~~%gs; # Combined index and ref |
3965 | $x =~ s%<<seeix:\s*(\S[^:>]*):\s*(\S[^>]*)>>%^^^^a href="#$1"~~~~$2^^^^/a~~~~%gs; # Combined index and ref |
3966 | 3966 | ||
3967 | # Fredrik Jonsson: Store reference as <see:ref> in html document for future resolving |
3967 | # Fredrik Jonsson: Store reference as <see:ref> in html document for future resolving |
3968 | $x =~ s%<<see:\s*(\S[^>]*?)(?::\s+(\S[^>]*))?>>%"^^^^see:?:". fold_label($1) . "=$2~~~~"%gse; |
3968 | $x =~ s%<<see:\s*(\S[^>]*?)(?::\s+(\S[^>]*))?>>%"^^^^see:?:". fold_label($1) . "=$2~~~~"%gse; |
3969 | 3969 | ||
3970 | $x =~ s%<<ix:\s*([^>]+)>>%$1%gs; # index entry |
3970 | $x =~ s%<<ix:\s*([^>]+)>>%$1%gs; # index entry |
3971 | $x =~ s%<<ixx:\s*([^>]+)>>%%gs; # hidden index entry |
3971 | $x =~ s%<<ixx:\s*([^>]+)>>%%gs; # hidden index entry |
3972 | $x =~ s%<<ref:\s*([^:]+): (.*?)>>%$2%gs; # *** should do proper ref |
3972 | $x =~ s%<<ref:\s*([^:]+): (.*?)>>%$2%gs; # *** should do proper ref |
3973 | $x =~ s|<(/?\w.*?/?)>|^^^^$tag_tag~~~~<$1>^^^^/$tag_tag~~~~|gs; |
3973 | $x =~ s|<(/?\w.*?/?)>|^^^^$tag_tag~~~~<$1>^^^^/$tag_tag~~~~|gs; |
3974 | $x =~ s%((?<!\S)\@[a-z0-9-]+)%html_format_tt($1)%gsexi; # XML or HTML @attribute |
3974 | $x =~ s%((?<!\S)\@[a-z0-9-]+)%html_format_tt($1)%gsexi; # XML or HTML @attribute |
3975 | $x =~ s|&|&|g; |
3975 | $x =~ s|&|&|g; |
3976 | $x =~ s|<|<|g; |
3976 | $x =~ s|<|<|g; |
3977 | $x =~ s|>|>|g; |
3977 | $x =~ s|>|>|g; |
3978 | $x =~ s|\\\\|^^^^br~~~~|g; |
3978 | $x =~ s|\\\\|^^^^br~~~~|g; |
3979 | $x =~ s|''''|.|g; |
3979 | $x =~ s|''''|.|g; |
3980 | $x =~ s|""""|/|g; |
3980 | $x =~ s|""""|/|g; |
3981 | 3981 | ||
3982 | $x =~ s|\*(\S.*?\S)\*|^^^^b~~~~$1^^^^/b~~~~|gs; # bold |
3982 | $x =~ s|\*(\S.*?\S)\*|^^^^b~~~~$1^^^^/b~~~~|gs; # bold |
3983 | $x =~ s{(\A|\s|\()\+([a-z].*?[\w.])\+}{$1^^^^i~~~~$2^^^^/i~~~~}gsi; # italic |
3983 | $x =~ s{(\A|\s|\()\+([a-z].*?[\w.])\+}{$1^^^^i~~~~$2^^^^/i~~~~}gsi; # italic |
3984 | $x =~ s|(?<!~)~([/\#\$\w-].*?[\w\)\}:])~(?!~)|html_format_tt($1)|gsex; # computer output |
3984 | $x =~ s|(?<!~)~([/\#\$\w-].*?[\w\)\}:])~(?!~)|html_format_tt($1)|gsex; # computer output |
3985 | $x =~ s|\^\^\^\^\^\^\^\^RAWTEX: (.*?)~~~~~~~~||gse; |
3985 | $x =~ s|\^\^\^\^\^\^\^\^RAWTEX: (.*?)~~~~~~~~||gse; |
3986 | $x =~ s|\^\^\^\^\^\^\^\^RAWDBX: (.*?)~~~~~~~~||gse; |
3986 | $x =~ s|\^\^\^\^\^\^\^\^RAWDBX: (.*?)~~~~~~~~||gse; |
3987 | $x =~ s|\^\^\^\^\^\^\^\^RAWRTF: (.*?)~~~~~~~~||gse; |
3987 | $x =~ s|\^\^\^\^\^\^\^\^RAWRTF: (.*?)~~~~~~~~||gse; |
3988 | $x =~ s|\^\^\^\^\^\^\^\^RAWHTML: (.*?)~~~~~~~~|unhexit($1)|gse; |
3988 | $x =~ s|\^\^\^\^\^\^\^\^RAWHTML: (.*?)~~~~~~~~|unhexit($1)|gse; |
3989 | $x =~ s|\^\^\^\^|<|g; |
3989 | $x =~ s|\^\^\^\^|<|g; |
3990 | $x =~ s|~~~~|>|g; |
3990 | $x =~ s|~~~~|>|g; |
3991 | 3991 | ||
3992 | #$x =~ s|~(\w.*?\w)~|<literal>$1</literal>|gs; |
3992 | #$x =~ s|~(\w.*?\w)~|<literal>$1</literal>|gs; |
3993 | #$x =~ s|\+(\w.*?\w)\+|<command>$1</command>|gs; |
3993 | #$x =~ s|\+(\w.*?\w)\+|<command>$1</command>|gs; |
3994 | #$x =~ s|!(\w.*?\w)!|<replaceable>$1</replaceable>|gs; |
3994 | #$x =~ s|!(\w.*?\w)!|<replaceable>$1</replaceable>|gs; |
3995 | #$x =~ s|\[(\w.*?\w)\]|[<link linkend="$1">$1</link>]|gs; # biblio refs |
3995 | #$x =~ s|\[(\w.*?\w)\]|[<link linkend="$1">$1</link>]|gs; # biblio refs |
3996 | $x =~ s|\[(\w.*?[\w.])\]|html_biblio($1)|gsex; # biblio refs |
3996 | $x =~ s|\[(\w.*?[\w.])\]|html_biblio($1)|gsex; # biblio refs |
3997 | #$x =~ s|||gs; |
3997 | #$x =~ s|||gs; |
3998 | 3998 | ||
3999 | # convert LaTeX leftovers to something reasonable |
3999 | # convert LaTeX leftovers to something reasonable |
4000 | $x =~ s|\\mu|µ|gs; |
4000 | $x =~ s|\\mu|µ|gs; |
4001 | $x =~ s|\\acute\{a\}|á|gs; |
4001 | $x =~ s|\\acute\{a\}|á|gs; |
4002 | $x =~ s|\\times| x |gs; |
4002 | $x =~ s|\\times| x |gs; |
4003 | $x =~ s|\\:| |gs; |
4003 | $x =~ s|\\:| |gs; |
4004 | $x =~ s|(?<!\\)\^\{([^\{\}]+)\}|<sup>$1</sup>|gs if $x =~ /\$/; |
4004 | $x =~ s|(?<!\\)\^\{([^\{\}]+)\}|<sup>$1</sup>|gs if $x =~ /\$/; |
4005 | $x =~ s|(?<!\\)\^(\w)|<sup>$1</sup>|gs if $x =~ /\$/; |
4005 | $x =~ s|(?<!\\)\^(\w)|<sup>$1</sup>|gs if $x =~ /\$/; |
4006 | $x =~ s|(?<!\\)_\{([^\{\}]+)\}|<sub>$1</sub>|gs if $x =~ /\$/; |
4006 | $x =~ s|(?<!\\)_\{([^\{\}]+)\}|<sub>$1</sub>|gs if $x =~ /\$/; |
4007 | $x =~ s|(?<!\\)_(\w)|<sub>$1</sub>|gs if $x =~ /\$/; |
4007 | $x =~ s|(?<!\\)_(\w)|<sub>$1</sub>|gs if $x =~ /\$/; |
4008 | $x =~ s/!\\/\\/g; # Backslash escape |
4008 | $x =~ s/!\\/\\/g; # Backslash escape |
4009 | $x =~ s|\$||gs; |
4009 | $x =~ s|\$||gs; |
4010 | $x =~ s|<dollari>|\$|gs; |
4010 | $x =~ s|<dollari>|\$|gs; |
4011 | $x =~ s|<ampersandi>|&|gs; |
4011 | $x =~ s|<ampersandi>|&|gs; |
4012 | $x =~ s|\\pm |±|gs; |
4012 | $x =~ s|\\pm |±|gs; |
4013 | $x =~ s|\\isotope\{(\d+)\}\{(\w+)\}|<sup>$1</sup>$2|gs; |
4013 | $x =~ s|\\isotope\{(\d+)\}\{(\w+)\}|<sup>$1</sup>$2|gs; |
4014 | $x =~ s/\\[a-z]+(\[[^]]+\])*(\{[^}]+\})*//gsi; # most LaTeX macros |
4014 | $x =~ s/\\[a-z]+(\[[^]]+\])*(\{[^}]+\})*//gsi; # most LaTeX macros |
4015 | $x =~ s/\\{/{/gs; |
4015 | $x =~ s/\\{/{/gs; |
4016 | $x =~ s/\\}/}/gs; |
4016 | $x =~ s/\\}/}/gs; |
4017 | $x =~ s%====%_%g; |
4017 | $x =~ s%====%_%g; |
4018 | 4018 | ||
4019 | return $x; |
4019 | return $x; |
4020 | } |
4020 | } |
4021 | 4021 | ||
4022 | sub html_para { |
4022 | sub html_para { |
4023 | my $x = &html_format; |
4023 | my $x = &html_format; |
4024 | return '' if $x =~ /^\s*$/s; |
4024 | return '' if $x =~ /^\s*$/s; |
4025 | my $prepara = $para_started ? '' : '<p>'; |
4025 | my $prepara = $para_started ? '' : '<p>'; |
4026 | return "$prepara$x</p>"; |
4026 | return "$prepara$x</p>"; |
4027 | } |
4027 | } |
4028 | 4028 | ||
4029 | 4029 | ||
4030 | ### |
4030 | ### |
4031 | ### TeX Special Character Escaping |
4031 | ### TeX Special Character Escaping |
4032 | ### |
4032 | ### |
4033 | 4033 | ||
4034 | sub tex_esc_verbatim { |
4034 | sub tex_esc_verbatim { |
4035 | my ($x) = @_; |
4035 | my ($x) = @_; |
4036 | local ($1,$2); |
4036 | local ($1,$2); |
4037 | #$x =~ s/(\r?\n)+//s; # *** only zap first CRNL? |
4037 | #$x =~ s/(\r?\n)+//s; # *** only zap first CRNL? |
4038 | return $x; |
4038 | return $x; |
4039 | $x =~ s/([\&])/\\$1/g; # fjon wants to abolish this |
4039 | $x =~ s/([\&])/\\$1/g; # fjon wants to abolish this |
4040 | #$x =~ s/\\/\$\\backslash\$/g; More useful to permit customization |
4040 | #$x =~ s/\\/\$\\backslash\$/g; More useful to permit customization |
4041 | $x =~ s/([\#\$\%\&\_\{\}])/\\$1/g; |
4041 | $x =~ s/([\#\$\%\&\_\{\}])/\\$1/g; |
4042 | $x =~ s/([~^])/\\$1\{\}/g; |
4042 | $x =~ s/([~^])/\\$1\{\}/g; |
4043 | $x =~ s/!\\/\$\\backslash\$/g; |
4043 | $x =~ s/!\\/\$\\backslash\$/g; |
4044 | return $x; |
4044 | return $x; |
4045 | } |
4045 | } |
4046 | 4046 | ||
4047 | sub tex_esc { |
4047 | sub tex_esc { |
4048 | my ($x) = @_; |
4048 | my ($x) = @_; |
4049 | local ($1,$2); |
4049 | local ($1,$2); |
4050 | $x =~ s/([\#\%\&\_\{\}])/\\$1/g; # \$ is needed for math |
4050 | $x =~ s/([\#\%\&\_\{\}])/\\$1/g; # \$ is needed for math |
4051 | $x =~ s/([~^])/\\$1\{\}/g; |
4051 | $x =~ s/([~^])/\\$1\{\}/g; |
4052 | $x =~ s/!\\/\$\\backslash\$/g; |
4052 | $x =~ s/!\\/\$\\backslash\$/g; |
4053 | return $x; |
4053 | return $x; |
4054 | } |
4054 | } |
4055 | 4055 | ||
4056 | sub tex_esc_tag { |
4056 | sub tex_esc_tag { |
4057 | return "\\".$_[0].'^^^^'.tex_esc($_[1]).'````'; |
4057 | return "\\".$_[0].'^^^^'.tex_esc($_[1]).'````'; |
4058 | } |
4058 | } |
4059 | 4059 | ||
4060 | sub tex_esc_tt { |
4060 | sub tex_esc_tt { |
4061 | my ($x) = @_; |
4061 | my ($x) = @_; |
4062 | local ($1,$2); |
4062 | local ($1,$2); |
4063 | #warn "escaping [$x]"; |
4063 | #warn "escaping [$x]"; |
4064 | $x =~ s/([_\$\{\}\#])/\\$1/g; # \&\% |
4064 | $x =~ s/([_\$\{\}\#])/\\$1/g; # \&\% |
4065 | $x =~ s/\[/~~~~/g; |
4065 | $x =~ s/\[/~~~~/g; |
4066 | $x =~ s/\]/\$\$\$\$/g; |
4066 | $x =~ s/\]/\$\$\$\$/g; |
4067 | $x =~ s/</::::/g; |
4067 | $x =~ s/</::::/g; |
4068 | $x =~ s/>/;;;;/g; |
4068 | $x =~ s/>/;;;;/g; |
4069 | #$x =~ s/([~^])/\\$1\{\}/g; |
4069 | #$x =~ s/([~^])/\\$1\{\}/g; |
4070 | #$x =~ s/!\\/\$\\backslash\$/g; |
4070 | #$x =~ s/!\\/\$\\backslash\$/g; |
4071 | #warn "escaped [$x]"; |
4071 | #warn "escaped [$x]"; |
4072 | return $x; |
4072 | return $x; |
4073 | } |
4073 | } |
4074 | 4074 | ||
4075 | sub tex_esc_tt_tag { |
4075 | sub tex_esc_tt_tag { |
4076 | return "\\".$_[0].'^^^^'.tex_esc_tt($_[1]).'````'; |
4076 | return "\\".$_[0].'^^^^'.tex_esc_tt($_[1]).'````'; |
4077 | } |
4077 | } |
4078 | 4078 | ||
4079 | sub tex_format_func { |
4079 | sub tex_format_func { |
4080 | my ($ret, $func, $args) = @_; |
4080 | my ($ret, $func, $args) = @_; |
4081 | my $proto = "$ret$func($args)"; |
4081 | my $proto = "$ret$func($args)"; |
4082 | return $proto if $not_a_path{$proto}; |
4082 | return $proto if $not_a_path{$proto}; |
4083 | warn "func($func)\n"; |
4083 | warn "func($func)\n"; |
4084 | $ret = tex_esc_tt($ret); |
4084 | $ret = tex_esc_tt($ret); |
4085 | $func = tex_esc_tt($func); |
4085 | $func = tex_esc_tt($func); |
4086 | $args = tex_esc_tt($args); |
4086 | $args = tex_esc_tt($args); |
4087 | return '\\emph^^^^' . $ret . $func . '(' . $args . ")````\\index^^^^$func\@\\emph{$func()}````"; |
4087 | return '\\emph^^^^' . $ret . $func . '(' . $args . ")````\\index^^^^$func\@\\emph{$func()}````"; |
4088 | } |
4088 | } |
4089 | 4089 | ||
4090 | sub tex_format_email { |
4090 | sub tex_format_email { |
4091 | my ($uid, $dom) = @_; |
4091 | my ($uid, $dom) = @_; |
4092 | my $addr = "$uid\@$dom"; |
4092 | my $addr = "$uid\@$dom"; |
4093 | return $addr if $not_a_path{$addr} || $not_a_url{$addr}; |
4093 | return $addr if $not_a_path{$addr} || $not_a_url{$addr}; |
4094 | warn "email uid($uid) dom($dom)\n"; |
4094 | warn "email uid($uid) dom($dom)\n"; |
4095 | $uid = tex_esc_tt($uid); |
4095 | $uid = tex_esc_tt($uid); |
4096 | $dom = tex_esc_tt($dom); |
4096 | $dom = tex_esc_tt($dom); |
4097 | $uid =~ s|\.|''''|g; |
4097 | $uid =~ s|\.|''''|g; |
4098 | $dom =~ s|\.|''''|g; |
4098 | $dom =~ s|\.|''''|g; |
4099 | return "\\texttt^^^^$uid\@$dom````\\index^^^^$uid\"\@$dom````"; |
4099 | return "\\texttt^^^^$uid\@$dom````\\index^^^^$uid\"\@$dom````"; |
4100 | } |
4100 | } |
4101 | 4101 | ||
4102 | sub tex_format_url { |
4102 | sub tex_format_url { |
4103 | my ($url, $what) = @_; |
4103 | my ($url, $what) = @_; |
4104 | return $url if $not_a_path{$url} || $not_a_url{$url}; |
4104 | return $url if $not_a_path{$url} || $not_a_url{$url}; |
4105 | warn "url($url) $what\n"; |
4105 | warn "url($url) $what\n"; |
4106 | $url = tex_esc_tt($url); |
4106 | $url = tex_esc_tt($url); |
4107 | $url =~ s|\.|''''|g; |
4107 | $url =~ s|\.|''''|g; |
4108 | $url =~ s|/|""""|g; |
4108 | $url =~ s|/|""""|g; |
4109 | return '\\texttt^^^^' . $url . '````'; |
4109 | return '\\texttt^^^^' . $url . '````'; |
4110 | } |
4110 | } |
4111 | 4111 | ||
4112 | sub tex_format_country_url { |
4112 | sub tex_format_country_url { |
4113 | my ($url, $cc, $what) = @_; |
4113 | my ($url, $cc, $what) = @_; |
4114 | #warn "url($url) cc($cc) $what"; |
4114 | #warn "url($url) cc($cc) $what"; |
4115 | return $url if $not_a_country{$cc}; |
4115 | return $url if $not_a_country{$cc}; |
4116 | return $url if $not_a_path{$url} || $not_a_url{$url}; |
4116 | return $url if $not_a_path{$url} || $not_a_url{$url}; |
4117 | warn "url($url) cc($cc) $what\n"; |
4117 | warn "url($url) cc($cc) $what\n"; |
4118 | return tex_format_url($url); |
4118 | return tex_format_url($url); |
4119 | } |
4119 | } |
4120 | 4120 | ||
4121 | sub tex_format_path { |
4121 | sub tex_format_path { |
4122 | my ($path,$what) = @_; |
4122 | my ($path,$what) = @_; |
4123 | return $path if $not_a_path{$path}; |
4123 | return $path if $not_a_path{$path}; |
4124 | return $path if $path=~m|^[0-9/.,-]+$|s; # Avoid pure numbers like 12/34 or 1.2 |
4124 | return $path if $path=~m|^[0-9/.,-]+$|s; # Avoid pure numbers like 12/34 or 1.2 |
4125 | warn "path($path) $what\n"; |
4125 | warn "path($path) $what\n"; |
4126 | $path = tex_esc_tt($path); |
4126 | $path = tex_esc_tt($path); |
4127 | $path =~ s|\.|''''|g; |
4127 | $path =~ s|\.|''''|g; |
4128 | $path =~ s|/|""""|g; |
4128 | $path =~ s|/|""""|g; |
4129 | return '\\texttt^^^^' . $path . '````'; |
4129 | return '\\texttt^^^^' . $path . '````'; |
4130 | } |
4130 | } |
4131 | 4131 | ||
4132 | sub tex_format_ip { |
4132 | sub tex_format_ip { |
4133 | my ($path,$what) = @_; |
4133 | my ($path,$what) = @_; |
4134 | return $path if $not_a_path{$path}; |
4134 | return $path if $not_a_path{$path}; |
4135 | return $path if $path=~m|^\d+\.\d+\.?$|s; # Avoid pure numbers like 1.2 |
4135 | return $path if $path=~m|^\d+\.\d+\.?$|s; # Avoid pure numbers like 1.2 |
4136 | return $path if $path=~m|^\d+\.\d+\.\d+\.?$|s; # Avoid pure numbers like 1.2.3 |
4136 | return $path if $path=~m|^\d+\.\d+\.\d+\.?$|s; # Avoid pure numbers like 1.2.3 |
4137 | warn "ip($path) $what\n"; |
4137 | warn "ip($path) $what\n"; |
4138 | $path = tex_esc_tt($path); |
4138 | $path = tex_esc_tt($path); |
4139 | $path =~ s|\.|''''|g; |
4139 | $path =~ s|\.|''''|g; |
4140 | $path =~ s|/|""""|g; |
4140 | $path =~ s|/|""""|g; |
4141 | return '\\texttt^^^^' . $path . '````'; |
4141 | return '\\texttt^^^^' . $path . '````'; |
4142 | } |
4142 | } |
4143 | 4143 | ||
4144 | sub tex_format_ref { |
4144 | sub tex_format_ref { |
4145 | my ($ref) = @_; |
4145 | my ($ref) = @_; |
4146 | #$ref =~ s/^[+*~]//; $ref =~ s/[+*~]$//; |
4146 | #$ref =~ s/^[+*~]//; $ref =~ s/[+*~]$//; |
4147 | $ref =~ s/^\\[a-z]+\^\^\^\^(.*?)````/$1/gsi; |
4147 | $ref =~ s/^\\[a-z]+\^\^\^\^(.*?)````/$1/gsi; |
4148 | return "\\index^^^^$ref````"; |
4148 | return "\\index^^^^$ref````"; |
4149 | } |
4149 | } |
4150 | 4150 | ||
4151 | sub tex_format_infobox { |
4151 | sub tex_format_infobox { |
4152 | my ($id,$link,$tableargs,$content) = @_; |
4152 | my ($id,$link,$tableargs,$content) = @_; |
4153 | return $content; |
4153 | return $content; |
4154 | } |
4154 | } |
4155 | 4155 | ||
4156 | sub tex_esc_all { |
4156 | sub tex_esc_all { |
4157 | my ($x) = @_; |
4157 | my ($x) = @_; |
4158 | $x = tex_esc_tt($x); |
4158 | $x = tex_esc_tt($x); |
4159 | $x =~ s|\.|''''|g; |
4159 | $x =~ s|\.|''''|g; |
4160 | $x =~ s|/|""""|g; |
4160 | $x =~ s|/|""""|g; |
4161 | return $x; |
4161 | return $x; |
4162 | } |
4162 | } |
4163 | 4163 | ||
4164 | sub tex_esc_underscore { |
4164 | sub tex_esc_underscore { |
4165 | my ($x) = @_; |
4165 | my ($x) = @_; |
4166 | $x =~ s|_|!underscore|g; |
4166 | $x =~ s|_|!underscore|g; |
4167 | return $x; |
4167 | return $x; |
4168 | } |
4168 | } |
4169 | 4169 | ||
4170 | sub tex_biblio { |
4170 | sub tex_biblio { |
4171 | my ($bibref) = @_; |
4171 | my ($bibref) = @_; |
4172 | return '['.$bibref.']' if $not_a_path{$bibref}; |
4172 | return '['.$bibref.']' if $not_a_path{$bibref}; |
4173 | return '\\cite^^^^'.$bibref.'````\\index^^^^'.$bibref.'````'; |
4173 | return '\\cite^^^^'.$bibref.'````\\index^^^^'.$bibref.'````'; |
4174 | } |
4174 | } |
4175 | 4175 | ||
4176 | sub tex_format { |
4176 | sub tex_format { |
4177 | my $x = join ' ', @_; |
4177 | my $x = join ' ', @_; |
4178 | return "\n" unless length $x; |
4178 | return "\n" unless length $x; |
4179 | local ($1,$2,$3,$4,$5,$6,$7,$8,$9); |
4179 | local ($1,$2,$3,$4,$5,$6,$7,$8,$9); |
4180 | 4180 | ||
4181 | $x =~ s%<<e:\s*(.*?)>>%tex_esc_all($1)%gsex; |
4181 | $x =~ s%<<e:\s*(.*?)>>%tex_esc_all($1)%gsex; |
4182 | $x =~ s/\(\*\*\*(.*?)\)/push(@todo, $1),''/ges; |
4182 | $x =~ s/\(\*\*\*(.*?)\)/push(@todo, $1),''/ges; |
4183 | 4183 | ||
4184 | #warn "--[$x]--"; |
4184 | #warn "--[$x]--"; |
4185 | 4185 | ||
4186 | if ($pdflag{'autoformat'} == 1) { |
4186 | if ($pdflag{'autoformat'} == 1) { |
4187 | # function and email detection |
4187 | # function and email detection |
4188 | # 1 12 2 3 3 4 4 5 5 |
4188 | # 1 12 2 3 3 4 4 5 5 |
4189 | $x =~ s{(\A|\s|\()([a-z0-9_:]+=)?([a-z0-9_.:-]+)\(([a-z0-9_:, -]*)\)([,.!?\)]?)(?=\s|\Z)}{$1.tex_format_func($2,$3,$4).$5}gisex; |
4189 | $x =~ s{(\A|\s|\()([a-z0-9_:]+=)?([a-z0-9_.:-]+)\(([a-z0-9_:, -]*)\)([,.!?\)]?)(?=\s|\Z)}{$1.tex_format_func($2,$3,$4).$5}gisex; |
4190 | # 1 12 2 3 34 4 |
4190 | # 1 12 2 3 34 4 |
4191 | $x =~ s{(\A|\s|\(|\<)([a-z0-9_.-]+)\@([a-z0-9_.-]+?)([,.!?\)\>]?)(?=\s|\Z)}{$1.tex_format_email($2,$3).$4}gisex; |
4191 | $x =~ s{(\A|\s|\(|\<)([a-z0-9_.-]+)\@([a-z0-9_.-]+?)([,.!?\)\>]?)(?=\s|\Z)}{$1.tex_format_email($2,$3).$4}gisex; |
4192 | 4192 | ||
4193 | # URL and domain name detection |
4193 | # URL and domain name detection |
4194 | # 1 12 23 3 |
4194 | # 1 12 23 3 |
4195 | $x =~ s{(\A|\s|\()([a-z]+://[a-z0-9][a-z0-9_.:/?&=+%\#-]+)([,.!?\)]?)(?=\s|\Z)}{$1.tex_format_url($2,"proto2://$3/").$3}gisex; |
4195 | $x =~ s{(\A|\s|\()([a-z]+://[a-z0-9][a-z0-9_.:/?&=+%\#-]+)([,.!?\)]?)(?=\s|\Z)}{$1.tex_format_url($2,"proto2://$3/").$3}gisex; |
4196 | # 1 12 23 3 |
4196 | # 1 12 23 3 |
4197 | $x =~ s{(\A|\s|\()(www\.[a-z0-9_-]+\.[a-z0-9][a-z0-9_.:/?&=+%-]+)([,.!?\)]?)(?=\s|\Z)}{$1.tex_format_url($2,'www').$3}gisex; |
4197 | $x =~ s{(\A|\s|\()(www\.[a-z0-9_-]+\.[a-z0-9][a-z0-9_.:/?&=+%-]+)([,.!?\)]?)(?=\s|\Z)}{$1.tex_format_url($2,'www').$3}gisex; |
4198 | # 1 12 23 3 |
4198 | # 1 12 23 3 |
4199 | $x =~ s{(\A|\s|\()(ftp\.[a-z0-9_-]+\.[a-z0-9][a-z0-9_.:/?&=+%-]+)([,.!?\)]?)(?=\s|\Z)}{$1.tex_format_url($2,'ftp').$3}gisex; |
4199 | $x =~ s{(\A|\s|\()(ftp\.[a-z0-9_-]+\.[a-z0-9][a-z0-9_.:/?&=+%-]+)([,.!?\)]?)(?=\s|\Z)}{$1.tex_format_url($2,'ftp').$3}gisex; |
4200 | # 1 12 3 3 24 4 |
4200 | # 1 12 3 3 24 4 |
4201 | $x =~ s{(\A|\s|\()([a-z0-9][a-z0-9_.-]+[a-z0-9]\.com(/[a-z0-9_.:/?&=+%-]+)?)([,.!?\)]?)(?=\s|\Z)}{$1.tex_format_url($2,'com').$4}gisex; |
4201 | $x =~ s{(\A|\s|\()([a-z0-9][a-z0-9_.-]+[a-z0-9]\.com(/[a-z0-9_.:/?&=+%-]+)?)([,.!?\)]?)(?=\s|\Z)}{$1.tex_format_url($2,'com').$4}gisex; |
4202 | $x =~ s{(\A|\s|\()([a-z0-9][a-z0-9_.-]+[a-z0-9]\.net(/[a-z0-9_.:/?&=+%-]+)?)([,.!?\)]?)(?=\s|\Z)}{$1.tex_format_url($2,'net').$4}gisex; |
4202 | $x =~ s{(\A|\s|\()([a-z0-9][a-z0-9_.-]+[a-z0-9]\.net(/[a-z0-9_.:/?&=+%-]+)?)([,.!?\)]?)(?=\s|\Z)}{$1.tex_format_url($2,'net').$4}gisex; |
4203 | $x =~ s{(\A|\s|\()([a-z0-9][a-z0-9_.-]+[a-z0-9]\.org(/[a-z0-9_.:/?&=+%-]+)?)([,.!?\)]?)(?=\s|\Z)}{$1.tex_format_url($2,'org').$4}gisex; |
4203 | $x =~ s{(\A|\s|\()([a-z0-9][a-z0-9_.-]+[a-z0-9]\.org(/[a-z0-9_.:/?&=+%-]+)?)([,.!?\)]?)(?=\s|\Z)}{$1.tex_format_url($2,'org').$4}gisex; |
4204 | 4204 | ||
4205 | # 1 12 3 34 4 25 5 |
4205 | # 1 12 3 34 4 25 5 |
4206 | $x =~ s{(\A|\s|\()([a-z0-9][a-z0-9_.-]+[a-z0-9]\.([a-z][a-z])(/[a-z0-9_.:/?&=+%-]+)?)([,.!?\)]?)(?=\s|\Z)}{$1.tex_format_country_url($2,$3,"cc_url($5)").$5}gisex; |
4206 | $x =~ s{(\A|\s|\()([a-z0-9][a-z0-9_.-]+[a-z0-9]\.([a-z][a-z])(/[a-z0-9_.:/?&=+%-]+)?)([,.!?\)]?)(?=\s|\Z)}{$1.tex_format_country_url($2,$3,"cc_url($5)").$5}gisex; |
4207 | #warn "==[$x]==" if $x =~ m%/var/wr/PQ%; |
4207 | #warn "==[$x]==" if $x =~ m%/var/wr/PQ%; |
4208 | 4208 | ||
4209 | # file path detection |
4209 | # file path detection |
4210 | # 1 pre 12 path.ext 23 post 34 term 4 |
4210 | # 1 pre 12 path.ext 23 post 34 term 4 |
4211 | $x =~ s{(\A|\s|\()(~?[a-z0-9_./-]*\.[a-z][a-z0-9_]*?)([,.!?\)]{0,2})(?=\s|\Z)}{$1.tex_format_path($2,"path1($3)").$3}gisex; |
4211 | $x =~ s{(\A|\s|\()(~?[a-z0-9_./-]*\.[a-z][a-z0-9_]*?)([,.!?\)]{0,2})(?=\s|\Z)}{$1.tex_format_path($2,"path1($3)").$3}gisex; |
4212 | # 1 pre 12 a/b or /a/b 23 post 34 term 4 |
4212 | # 1 pre 12 a/b or /a/b 23 post 34 term 4 |
4213 | $x =~ s{(\A|\s|\()(~?[a-z0-9_.-]*/[a-z0-9_./-]*?)([,.!?\)]{0,2})(?=\s|\Z)}{$1.tex_format_path($2,"path2($3)").$3}gisex; |
4213 | $x =~ s{(\A|\s|\()(~?[a-z0-9_.-]*/[a-z0-9_./-]*?)([,.!?\)]{0,2})(?=\s|\Z)}{$1.tex_format_path($2,"path2($3)").$3}gisex; |
4214 | 4214 | ||
4215 | # 1 12 23 34 term 4 URN detect |
4215 | # 1 12 23 34 term 4 URN detect |
4216 | $x =~ s{(\A|\s|\()(urn:[a-z0-9_./:-]*?)([,.!?\)]{0,2})(?=\s|\Z)}{$1.tex_format_path($2,"urn($3)").$3}gisex; |
4216 | $x =~ s{(\A|\s|\()(urn:[a-z0-9_./:-]*?)([,.!?\)]{0,2})(?=\s|\Z)}{$1.tex_format_path($2,"urn($3)").$3}gisex; |
4217 | 4217 | ||
4218 | # 1 12 23 34 term 4 |
4218 | # 1 12 23 34 term 4 |
4219 | $x =~ s{(\A|\s|\()(\d+\.[\d./*]+)([,.!?\)]{0,2})(?=\s|\Z)}{$1.tex_format_ip($2,"ip($3)").$3}gisex; |
4219 | $x =~ s{(\A|\s|\()(\d+\.[\d./*]+)([,.!?\)]{0,2})(?=\s|\Z)}{$1.tex_format_ip($2,"ip($3)").$3}gisex; |
4220 | } |
4220 | } |
4221 | #warn "..[$x].."; |
4221 | #warn "..[$x].."; |
4222 | 4222 | ||
4223 | $x =~ s|\*(\S.*?\S)\*|\\textbf^^^^$1````|gs; # bold |
4223 | $x =~ s|\*(\S.*?\S)\*|\\textbf^^^^$1````|gs; # bold |
4224 | $x =~ s{(\A|\s|\()\+([a-z].*?[\w.])\+}{$1\\emph^^^^$2````}gsi; # italic |
4224 | $x =~ s{(\A|\s|\()\+([a-z].*?[\w.])\+}{$1\\emph^^^^$2````}gsi; # italic |
4225 | $x =~ s|~([/\#\$\w-].*?[\w\)\}:])~|tex_esc_tt_tag('texttt', $1)|gsex; # computer output |
4225 | $x =~ s|~([/\#\$\w-].*?[\w\)\}:])~|tex_esc_tt_tag('texttt', $1)|gsex; # computer output |
4226 | #$x =~ s|\+(\w.*?\w)\+|\\textsf^^^^$1````|gs; # command |
4226 | #$x =~ s|\+(\w.*?\w)\+|\\textsf^^^^$1````|gs; # command |
4227 | #$x =~ s|!(\w.*?\w)!|\\textsf^^^^\\emph^^^^$1````````|gs; # replaceable |
4227 | #$x =~ s|!(\w.*?\w)!|\\textsf^^^^\\emph^^^^$1````````|gs; # replaceable |
4228 | $x =~ s%<<tt:\s*(.*?)>>%tex_esc_tt_tag('texttt', $1)%gsex; |
4228 | $x =~ s%<<tt:\s*(.*?)>>%tex_esc_tt_tag('texttt', $1)%gsex; |
4229 | $x =~ s%<<italic:\s*(.*?)>>%tex_esc_tag('emph', $1)%gsex; |
4229 | $x =~ s%<<italic:\s*(.*?)>>%tex_esc_tag('emph', $1)%gsex; |
4230 | $x =~ s%<<bold:\s*(.*?)>>%tex_esc_tag('textbf', $1)%gsex; |
4230 | $x =~ s%<<bold:\s*(.*?)>>%tex_esc_tag('textbf', $1)%gsex; |
4231 | $x =~ s%<<br:\s*>>%\\\\%gs; |
4231 | $x =~ s%<<br:\s*>>%\\\\%gs; |
4232 | $x =~ s%<<seeix:\s*(\S[^:>]*):\s*(\S[^>]*)>>%"\\ref^^^^$1```` $2".tex_format_ref($2)%gsex; # Combined index and ref |
4232 | $x =~ s%<<seeix:\s*(\S[^:>]*):\s*(\S[^>]*)>>%"\\ref^^^^$1```` $2".tex_format_ref($2)%gsex; # Combined index and ref |
4233 | # Fredrik Jonsson: Don't do anything with references yet, resolve later |
4233 | # Fredrik Jonsson: Don't do anything with references yet, resolve later |
4234 | $x =~ s%<<see:\s*(\S[^>]*?)(?::\s+(\S[^>]*))?>>%'::::see:?:' . fold_label($1) . "=$2;;;;"%gse; |
4234 | $x =~ s%<<see:\s*(\S[^>]*?)(?::\s+(\S[^>]*))?>>%'::::see:?:' . fold_label($1) . "=$2;;;;"%gse; |
4235 | 4235 | ||
4236 | $x =~ s%<<ix:\s*(\S[^>]*)>>%$1.tex_format_ref($1)%gsex; # index entry |
4236 | $x =~ s%<<ix:\s*(\S[^>]*)>>%$1.tex_format_ref($1)%gsex; # index entry |
4237 | $x =~ s%<<ixx:\s*(\S[^>]*)>>%tex_format_ref($1)%gsex; # hidden index entry |
4237 | $x =~ s%<<ixx:\s*(\S[^>]*)>>%tex_format_ref($1)%gsex; # hidden index entry |
4238 | $x =~ s%<<ref:\s*([^:]+): (.*?)>>%$2%gs; # *** should do proper ref |
4238 | $x =~ s%<<ref:\s*([^:]+): (.*?)>>%$2%gs; # *** should do proper ref |
4239 | $x =~ s%([a-z])-se(?![a-z0-9])%$1\\hifen se%gi; # Portuguese ortography "faz-se" |
4239 | $x =~ s%([a-z])-se(?![a-z0-9])%$1\\hifen se%gi; # Portuguese ortography "faz-se" |
4240 | 4240 | ||
4241 | $x =~ s|\[(\w.*?[\w.])\]|tex_biblio($1)|gsex; # biblio refs |
4241 | $x =~ s|\[(\w.*?[\w.])\]|tex_biblio($1)|gsex; # biblio refs |
4242 | 4242 | ||
4243 | #warn "BEFORE($x)" if $x =~ /sensor/; |
4243 | #warn "BEFORE($x)" if $x =~ /sensor/; |
4244 | #$x =~ s|(\\[a-z]+)\{(.*?)\}|$1^^^^$2````|g; |
4244 | #$x =~ s|(\\[a-z]+)\{(.*?)\}|$1^^^^$2````|g; |
4245 | 4245 | ||
4246 | # Escape "TeXish" programming language hash and array constructs |
4246 | # Escape "TeXish" programming language hash and array constructs |
4247 | # foo{bar}, --> foo\{bar\} |
4247 | # foo{bar}, --> foo\{bar\} |
4248 | # 1 12 2 3 3 4 4 |
4248 | # 1 12 2 3 3 4 4 |
4249 | $x =~ s%(\A|\s|\()(\w+)\{([^\}]*?)\}([:,.!?\)]*)(?=\s|\Z)%$1$2\\\{$3\\\}$4%gs; |
4249 | $x =~ s%(\A|\s|\()(\w+)\{([^\}]*?)\}([:,.!?\)]*)(?=\s|\Z)%$1$2\\\{$3\\\}$4%gs; |
4250 | $x =~ s%(\A|\s|\()(\w+)\[([^\]]*?)\]([:,.!?\)]*)(?=\s|\Z)%$1$2\\\[$3\\\]$4%gs; |
4250 | $x =~ s%(\A|\s|\()(\w+)\[([^\]]*?)\]([:,.!?\)]*)(?=\s|\Z)%$1$2\\\[$3\\\]$4%gs; |
4251 | 4251 | ||
4252 | if ($fn_style) { |
4252 | if ($fn_style) { |
4253 | $x =~ s%<<footnote:\s*(.*?)\s*>>%\\footnote{$1}%gs; |
4253 | $x =~ s%<<footnote:\s*(.*?)\s*>>%\\footnote{$1}%gs; |
4254 | } else { |
4254 | } else { |
4255 | $x =~ s%<<footnote:\s*(.*?)\s*>>%%gs; |
4255 | $x =~ s%<<footnote:\s*(.*?)\s*>>%%gs; |
4256 | } |
4256 | } |
4257 | $x =~ s%<<feedbackopts:.*?>>%%gs; |
4257 | $x =~ s%<<feedbackopts:.*?>>%%gs; |
4258 | $x =~ s%<<addfeedbacktop:.*?>>%%gs; |
4258 | $x =~ s%<<addfeedbacktop:.*?>>%%gs; |
4259 | $x =~ s%<<addfeedbackbot:.*?>>%%gs; |
4259 | $x =~ s%<<addfeedbackbot:.*?>>%%gs; |
4260 | $x =~ s%<<infobox:(\w+):([^:]*):([^:]*):\s*(.*?)\s*>>%tex_format_infobox($1,$2,$3,$4)%gse; |
4260 | $x =~ s%<<infobox:(\w+):([^:]*):([^:]*):\s*(.*?)\s*>>%tex_format_infobox($1,$2,$3,$4)%gse; |
4261 | $x =~ s%<<label:\s*(.*?)\s*>>%\\label{$1}%gs; |
4261 | $x =~ s%<<label:\s*(.*?)\s*>>%\\label{$1}%gs; |
4262 | $x =~ s%<<link:(.*?)(:\s+(.*?))?\s*>>%defined($3)?$3:$1%gsex; |
4262 | $x =~ s%<<link:(.*?)(:\s+(.*?))?\s*>>%defined($3)?$3:$1%gsex; |
4263 | $x =~ s%<<(\S*?)(\.((gif)|(jpe?g)|(svg)|(png)|(e?ps)))>>% |
4263 | $x =~ s%<<(\S*?)(\.((gif)|(jpe?g)|(svg)|(png)|(e?ps)))>>% |
4264 | \\begin{figure}[$tex_flt_place]$includegraphics\{$1\}\\end{figure}%gs; |
4264 | \\begin{figure}[$tex_flt_place]$includegraphics\{$1\}\\end{figure}%gs; |
4265 | $x =~ s%(</?[a-z][^>]*?/?>)%tex_esc_tt_tag('texttt', $1)%gsexi; # XML or HTML <tag> or element |
4265 | $x =~ s%(</?[a-z][^>]*?/?>)%tex_esc_tt_tag('texttt', $1)%gsexi; # XML or HTML <tag> or element |
4266 | $x =~ s%((?<!\S)\@[a-z0-9-]+)%tex_esc_tt_tag('texttt', $1)%gsexi; # XML or HTML @attribute |
4266 | $x =~ s%((?<!\S)\@[a-z0-9-]+)%tex_esc_tt_tag('texttt', $1)%gsexi; # XML or HTML @attribute |
4267 | # \\ means line break but just by passing it thru LaTeX will do the right thing |
4267 | # \\ means line break but just by passing it thru LaTeX will do the right thing |
4268 | $x =~ s|\^\^\^\^\^\^\^\^RAWTEX: (.*?)~~~~~~~~|unhexit($1)|gse; |
4268 | $x =~ s|\^\^\^\^\^\^\^\^RAWTEX: (.*?)~~~~~~~~|unhexit($1)|gse; |
4269 | $x =~ s|\^\^\^\^\^\^\^\^RAWDBX: (.*?)~~~~~~~~||gse; |
4269 | $x =~ s|\^\^\^\^\^\^\^\^RAWDBX: (.*?)~~~~~~~~||gse; |
4270 | $x =~ s|\^\^\^\^\^\^\^\^RAWRTF: (.*?)~~~~~~~~||gse; |
4270 | $x =~ s|\^\^\^\^\^\^\^\^RAWRTF: (.*?)~~~~~~~~||gse; |
4271 | $x =~ s|\^\^\^\^\^\^\^\^RAWHTML: (.*?)~~~~~~~~||gse; |
4271 | $x =~ s|\^\^\^\^\^\^\^\^RAWHTML: (.*?)~~~~~~~~||gse; |
4272 | 4272 | ||
4273 | $x =~ s|([¹²³¼½¾©®±÷×°])|\$$1\$|g; # Render Latin1 special chars in math mode |
4273 | $x =~ s|([¹²³¼½¾©®±÷×°])|\$$1\$|g; # Render Latin1 special chars in math mode |
4274 | 4274 | ||
4275 | # Late undo escaping on some special characters |
4275 | # Late undo escaping on some special characters |
4276 | $x =~ s|\^\^\^\^|{|g; |
4276 | $x =~ s|\^\^\^\^|{|g; |
4277 | $x =~ s|````|}|g; |
4277 | $x =~ s|````|}|g; |
4278 | $x =~ s|::::|<|g; |
4278 | $x =~ s|::::|<|g; |
4279 | $x =~ s|;;;;|>|g; |
4279 | $x =~ s|;;;;|>|g; |
4280 | $x =~ s|~~~~|[|g; |
4280 | $x =~ s|~~~~|[|g; |
4281 | $x =~ s|\$\$\$\$|]|g; |
4281 | $x =~ s|\$\$\$\$|]|g; |
4282 | $x =~ s|''''|.|g; |
4282 | $x =~ s|''''|.|g; |
4283 | $x =~ s|""""|/|g; |
4283 | $x =~ s|""""|/|g; |
4284 | # vvvvvvv------ negative lookbehind for backslash |
4284 | # vvvvvvv------ negative lookbehind for backslash |
4285 | $x =~ s/(?<!\\)([\#\%\&])/\\$1/g; # \$ \{ \} \_ are needed for math. Be sure not to double esc. |
4285 | $x =~ s/(?<!\\)([\#\%\&])/\\$1/g; # \$ \{ \} \_ are needed for math. Be sure not to double esc. |
4286 | $x =~ s/(?<!\\)_/\\_/g if $x !~ /\$/; |
4286 | $x =~ s/(?<!\\)_/\\_/g if $x !~ /\$/; |
4287 | $x =~ s/(?<!\\)\^/\\^\{\}/g if $x !~ /\$/; |
4287 | $x =~ s/(?<!\\)\^/\\^\{\}/g if $x !~ /\$/; |
4288 | $x =~ s/!\\/\$\\backslash\$/g; # special escape for backslash itself: !\ |
4288 | $x =~ s/!\\/\$\\backslash\$/g; # special escape for backslash itself: !\ |
4289 | $x =~ s/!underscore/_/g; # special escape to support preservation of _ in <<see: la_bel>> |
4289 | $x =~ s/!underscore/_/g; # special escape to support preservation of _ in <<see: la_bel>> |
4290 | $x =~ s/!star/*/g; # special escape to support preservation of * |
4290 | $x =~ s/!star/*/g; # special escape to support preservation of * |
4291 | 4291 | ||
4292 | # Index designated words (this gets pretty inefficient when there are hundreds of words) |
4292 | # Index designated words (this gets pretty inefficient when there are hundreds of words) |
4293 | #warn "Start indexing"; |
4293 | #warn "Start indexing"; |
4294 | my $w; |
4294 | my $w; |
4295 | for $w (@ix) { |
4295 | for $w (@ix) { |
4296 | #warn " Index [$w]"; |
4296 | #warn " Index [$w]"; |
4297 | # Regexs gets recompiled every single time. Tough. |
4297 | # Regexs gets recompiled every single time. Tough. |
4298 | if (1) { |
4298 | if (1) { |
4299 | $x =~ s/\\((emph)|(texttt)|(textbf))\{$w\}/\\$1\{$w\}\\index\{$ix{$w}\}/g; |
4299 | $x =~ s/\\((emph)|(texttt)|(textbf))\{$w\}/\\$1\{$w\}\\index\{$ix{$w}\}/g; |
4300 | $x =~ s/(\A|\s|\()$w([,.!?\)]?)(?=\s|\Z)/$1$w\\index\{$ix{$w}\}$2/g; |
4300 | $x =~ s/(\A|\s|\()$w([,.!?\)]?)(?=\s|\Z)/$1$w\\index\{$ix{$w}\}$2/g; |
4301 | } else { |
4301 | } else { |
4302 | $x =~ s/\\((emph)|(texttt)|(textbf))\{$w\}/"\\$1\{$w\}".debug_ix($w)/ge; |
4302 | $x =~ s/\\((emph)|(texttt)|(textbf))\{$w\}/"\\$1\{$w\}".debug_ix($w)/ge; |
4303 | $x =~ s/(\A|\s|\()$w([,.!?\)]?)(?=\s|\Z)/$1.$w.debug_ix($w).$2/ge; |
4303 | $x =~ s/(\A|\s|\()$w([,.!?\)]?)(?=\s|\Z)/$1.$w.debug_ix($w).$2/ge; |
4304 | } |
4304 | } |
4305 | } |
4305 | } |
4306 | #warn "End indexing"; |
4306 | #warn "End indexing"; |
4307 | return $x; |
4307 | return $x; |
4308 | } |
4308 | } |
4309 | 4309 | ||
4310 | sub debug_ix { |
4310 | sub debug_ix { |
4311 | my ($w) = @_; |
4311 | my ($w) = @_; |
4312 | my $r = "\\index\{$ix{$w}\}"; |
4312 | my $r = "\\index\{$ix{$w}\}"; |
4313 | warn "word($w) ix($r)"; |
4313 | warn "word($w) ix($r)"; |
4314 | return $r; |
4314 | return $r; |
4315 | } |
4315 | } |
4316 | 4316 | ||
4317 | sub tex_para { |
4317 | sub tex_para { |
4318 | return &tex_format . "\n\n"; |
4318 | return &tex_format . "\n\n"; |
4319 | } |
4319 | } |
4320 | 4320 | ||
4321 | sub para { |
4321 | sub para { |
4322 | print DBX &dbx_para . "\n"; |
4322 | print DBX &dbx_para . "\n"; |
4323 | print NONL &nonl_para . "\n\n"; |
4323 | print NONL &nonl_para . "\n\n"; |
4324 | print PDSEAL &pdseal_para . "\n\n"; |
4324 | print PDSEAL &pdseal_para . "\n\n"; |
4325 | print RTF &rtf_para . "\n\n"; |
4325 | print RTF &rtf_para . "\n\n"; |
4326 | print HTML &html_para . "\n\n"; |
4326 | print HTML &html_para . "\n\n"; |
4327 | print HTML2 &html_para . "\n\n"; |
4327 | print HTML2 &html_para . "\n\n"; |
4328 | print TEX &tex_para; |
4328 | print TEX &tex_para; |
4329 | $para_started = 0; |
4329 | $para_started = 0; |
4330 | return (); |
4330 | return (); |
4331 | } |
4331 | } |
4332 | 4332 | ||
4333 | # sub format { |
4333 | # sub format { |
4334 | # if (!$para_started) { |
4334 | # if (!$para_started) { |
4335 | # print DBX "<para>"; |
4335 | # print DBX "<para>"; |
4336 | # print HTML "<p>"; |
4336 | # print HTML "<p>"; |
4337 | # print HTML2 "<p>"; |
4337 | # print HTML2 "<p>"; |
4338 | # } |
4338 | # } |
4339 | # $para_started = 1; |
4339 | # $para_started = 1; |
4340 | # print DBX &dbx_format . "\n\n"; |
4340 | # print DBX &dbx_format . "\n\n"; |
4341 | # print HTML &html_format . "\n\n"; |
4341 | # print HTML &html_format . "\n\n"; |
4342 | # print HTML2 &html_format . "\n\n"; |
4342 | # print HTML2 &html_format . "\n\n"; |
4343 | # print TEX &tex_format; |
4343 | # print TEX &tex_format; |
4344 | # } |
4344 | # } |
4345 | 4345 | ||
4346 | ### |
4346 | ### |
4347 | ### Image handling |
4347 | ### Image handling |
4348 | ### |
4348 | ### |
4349 | 4349 | ||
4350 | sub filenewer { |
4350 | sub filenewer { |
4351 | my ($a, $b) = @_; |
4351 | my ($a, $b) = @_; |
4352 | my $a_m = (stat $a)[9] + 0; |
4352 | my $a_m = (stat $a)[9] + 0; |
4353 | my $b_m = (stat $b)[9] + 0; |
4353 | my $b_m = (stat $b)[9] + 0; |
4354 | #warn "filenewer a($a)=$a_m b($b)=$b_m"; |
4354 | #warn "filenewer a($a)=$a_m b($b)=$b_m"; |
4355 | return $a_m > $b_m; |
4355 | return $a_m > $b_m; |
4356 | } |
4356 | } |
4357 | 4357 | ||
4358 | sub fix_dia_eps_export { |
4358 | sub fix_dia_eps_export { |
4359 | my ($path) = @_; |
4359 | my ($path) = @_; |
4360 | my $x = readall("$path.eps"); |
4360 | my $x = readall("$path.eps"); |
4361 | # Add to this table any other translations you need (open *-utf-8.eps file w/emacs) |
4361 | # Add to this table any other translations you need (open *-utf-8.eps file w/emacs) |
4362 | $x =~ s/Ã/í/g; # iacute |
4362 | $x =~ s/Ã/í/g; # iacute |
4363 | $x =~ s/ó/ó/g; # oacute |
4363 | $x =~ s/ó/ó/g; # oacute |
4364 | $x =~ s/ú/ú/g; # uacute |
4364 | $x =~ s/ú/ú/g; # uacute |
4365 | $x =~ s/ç/ç/g; # ccedil |
4365 | $x =~ s/ç/ç/g; # ccedil |
4366 | $x =~ s/ã/ã/g; # atilde |
4366 | $x =~ s/ã/ã/g; # atilde |
4367 | 4367 | ||
4368 | #$x =~ s%/Courier-BoldOblique-latin1\n\s+/Courier-BoldOblique findfont\n.*?\ndefinefont pop\n%%gs; |
4368 | #$x =~ s%/Courier-BoldOblique-latin1\n\s+/Courier-BoldOblique findfont\n.*?\ndefinefont pop\n%%gs; |
4369 | writeall("$path.eps", $x); |
4369 | writeall("$path.eps", $x); |
4370 | } |
4370 | } |
4371 | 4371 | ||
4372 | sub extract_dia_layers { |
4372 | sub extract_dia_layers { |
4373 | my ($path,$layers) = @_; |
4373 | my ($path,$layers) = @_; |
4374 | my $epspath = $path.'-'.$layers; |
4374 | my $epspath = $path.'-'.$layers; |
4375 | if (!-r "$path.dia") { |
4375 | if (!-r "$path.dia") { |
4376 | warn "x-x-x-DIA file($path.dia) missing. No conversion possible for($epspath)\n"; |
4376 | warn "x-x-x-DIA file($path.dia) missing. No conversion possible for($epspath)\n"; |
4377 | return $epspath; |
4377 | return $epspath; |
4378 | } |
4378 | } |
4379 | 4379 | ||
4380 | if ((($imggen eq 'force') |
4380 | if ((($imggen eq 'force') |
4381 | || filenewer("$path.dia", "tex/$epspath.eps") && filenewer("$path.dia", "tex/$epspath.pdf"))) { |
4381 | || filenewer("$path.dia", "tex/$epspath.eps") && filenewer("$path.dia", "tex/$epspath.pdf"))) { |
4382 | warn "-----Automatic conversion of DIA $path.dia to EPS $epspath.eps\n"; |
4382 | warn "-----Automatic conversion of DIA $path.dia to EPS $epspath.eps\n"; |
4383 | unless ($dryrun) { |
4383 | unless ($dryrun) { |
4384 | system('dia', '-t', 'eps-builtin', '-e', "tex/$epspath.eps", '-L', $layers, "$path.dia"); |
4384 | system('dia', '-t', 'eps-builtin', '-e', "tex/$epspath.eps", '-L', $layers, "$path.dia"); |
4385 | fix_dia_eps_export("tex/$epspath"); |
4385 | fix_dia_eps_export("tex/$epspath"); |
4386 | } |
4386 | } |
4387 | } |
4387 | } |
4388 | return $epspath; |
4388 | return $epspath; |
4389 | } |
4389 | } |
4390 | 4390 | ||
4391 | sub system_cmd { |
4391 | sub system_cmd { |
4392 | if (1 || $trace) { |
4392 | if (1 || $trace) { |
4393 | my ($pkg, $file, $line) = caller; |
4393 | my ($pkg, $file, $line) = caller; |
4394 | my $cmd = join ' ', @_; |
4394 | my $cmd = join ' ', @_; |
4395 | print STDERR "$file:$line: SYSTEM($cmd)\n"; |
4395 | print STDERR "$file:$line: SYSTEM($cmd)\n"; |
4396 | } |
4396 | } |
4397 | return system @_ unless $dryrun; |
4397 | return system @_ unless $dryrun; |
4398 | } |
4398 | } |
4399 | 4399 | ||
4400 | $gs_antialias = '-DDOINTERPOLATE -dTextAlphaBits=4 -dGraphicsAlphaBits=4'; |
4400 | $gs_antialias = '-DDOINTERPOLATE -dTextAlphaBits=4 -dGraphicsAlphaBits=4'; |
4401 | 4401 | ||
4402 | sub epstopng { |
4402 | sub epstopng { |
4403 | my ($eps, $png) = @_; |
4403 | my ($eps, $png) = @_; |
4404 | my $f = readall($eps); |
4404 | my $f = readall($eps); |
4405 | my ($x, $y, $m, $n) = $f =~ m{%%BoundingBox:\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)}; |
4405 | my ($x, $y, $m, $n) = $f =~ m{%%BoundingBox:\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)}; |
4406 | $m -= $x; |
4406 | $m -= $x; |
4407 | $n -= $y; |
4407 | $n -= $y; |
4408 | # -r144x144 |
4408 | # -r144x144 |
4409 | # Effect correct page size and translation. Especially latter is tricky: the -c flag |
4409 | # Effect correct page size and translation. Especially latter is tricky: the -c flag |
4410 | # causes some PostScript code to be evaluated before the eps file so origin is shifted. |
4410 | # causes some PostScript code to be evaluated before the eps file so origin is shifted. |
4411 | $cmd = "gs -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=png256 $gs_antialias -g${m}x${n} -sOutputFile=$png -c $x neg $y neg translate -- $eps >/dev/null 2>&1"; |
4411 | $cmd = "gs -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=png256 $gs_antialias -g${m}x${n} -sOutputFile=$png -c $x neg $y neg translate -- $eps >/dev/null 2>&1"; |
4412 | system_cmd($cmd); |
4412 | system_cmd($cmd); |
4413 | } |
4413 | } |
4414 | 4414 | ||
4415 | sub gen_img { |
4415 | sub gen_img { |
4416 | my ($path, $hint) = @_; |
4416 | my ($path, $hint) = @_; |
4417 | #warn "GEN($path) pwd(" . `pwd` . ") imggen($imggen)"; |
4417 | #warn "GEN($path) pwd(" . `pwd` . ") imggen($imggen)"; |
4418 | if (-r "$path.pdf" |
4418 | if (-r "$path.pdf" |
4419 | && (($imggen eq 'force') |
4419 | && (($imggen eq 'force') |
4420 | || filenewer("$path.pdf", "tex/$path.pdf"))) { |
4420 | || filenewer("$path.pdf", "tex/$path.pdf"))) { |
4421 | writeall("tex/$path.pdf", readall("$path.pdf")); |
4421 | writeall("tex/$path.pdf", readall("$path.pdf")); |
4422 | #warn "wrote(tex/$path.pdf)"; |
4422 | #warn "wrote(tex/$path.pdf)"; |
4423 | return; |
4423 | return; |
4424 | } |
4424 | } |
4425 | return if !$imggen; # -nogen |
4425 | return if !$imggen; # -nogen |
4426 | if ($imggen eq 'safe') { |
4426 | if ($imggen eq 'safe') { |
4427 | return if -r "$path.pdf"; |
4427 | return if -r "$path.pdf"; |
4428 | } |
4428 | } |
4429 | 4429 | ||
4430 | if (-r "$path.dot" |
4430 | if (-r "$path.dot" |
4431 | && (($imggen eq 'force') |
4431 | && (($imggen eq 'force') |
4432 | || filenewer("$path.dot", "tex/$path.eps") && filenewer("$path.dot", "tex/$path.pdf"))) { |
4432 | || filenewer("$path.dot", "tex/$path.eps") && filenewer("$path.dot", "tex/$path.pdf"))) { |
4433 | # apt-get install graphviz |
4433 | # apt-get install graphviz |
4434 | warn "-----Automatic conversion of DOT $path.dot to PS\n"; |
4434 | warn "-----Automatic conversion of DOT $path.dot to PS\n"; |
4435 | system_cmd('dot', '-Tps2', "$path.dot", '-o', "tex/$path.eps"); |
4435 | system_cmd('dot', '-Tps2', "$path.dot", '-o', "tex/$path.eps"); |
4436 | } elsif (-r "$path.gp" |
4436 | } elsif (-r "$path.gp" |
4437 | && (($imggen eq 'force') |
4437 | && (($imggen eq 'force') |
4438 | || filenewer("$path.gp", "tex/$path.eps") && filenewer("$path.gp", "tex/$path.pdf"))) { |
4438 | || filenewer("$path.gp", "tex/$path.eps") && filenewer("$path.gp", "tex/$path.pdf"))) { |
4439 | warn "-----Automatic conversion of GNUPLOT $path.gp to EPS\n"; |
4439 | warn "-----Automatic conversion of GNUPLOT $path.gp to EPS\n"; |
4440 | # N.B. gnuplot file itself must be set up to produce EPS output |
4440 | # N.B. gnuplot file itself must be set up to produce EPS output |
4441 | system_cmd("cd tex && gnuplot ../$path.gp"); |
4441 | system_cmd("cd tex && gnuplot ../$path.gp"); |
4442 | } elsif (-r "$path.gnuplot" |
4442 | } elsif (-r "$path.gnuplot" |
4443 | && (($imggen eq 'force') |
4443 | && (($imggen eq 'force') |
4444 | || filenewer("$path.gnuplot", "tex/$path.eps") && filenewer("$path.gnuplot", "tex/$path.pdf"))) { |
4444 | || filenewer("$path.gnuplot", "tex/$path.eps") && filenewer("$path.gnuplot", "tex/$path.pdf"))) { |
4445 | warn "-----Automatic conversion of GNUPLOT $path.gnuplot to EPS\n"; |
4445 | warn "-----Automatic conversion of GNUPLOT $path.gnuplot to EPS\n"; |
4446 | # N.B. gnuplot file itself must be set up to produce EPS output |
4446 | # N.B. gnuplot file itself must be set up to produce EPS output |
4447 | system_cmd("cd tex && gnuplot ../$path.gnuplot"); |
4447 | system_cmd("cd tex && gnuplot ../$path.gnuplot"); |
4448 | } elsif (-r "$path.dia" |
4448 | } elsif (-r "$path.dia" |
4449 | && (($imggen eq 'force') |
4449 | && (($imggen eq 'force') |
4450 | || filenewer("$path.dia", "tex/$path.eps") && filenewer("$path.dia", "tex/$path.pdf"))) { |
4450 | || filenewer("$path.dia", "tex/$path.eps") && filenewer("$path.dia", "tex/$path.pdf"))) { |
4451 | warn "-----Automatic conversion of DIA $path.dia to EPS\n"; |
4451 | warn "-----Automatic conversion of DIA $path.dia to EPS\n"; |
4452 | unless ($dryrun) { |
4452 | unless ($dryrun) { |
4453 | system_cmd('dia', '-t', 'eps-builtin', '-e', "tex/$path.eps", "$path.dia"); |
4453 | system_cmd('dia', '-t', 'eps-builtin', '-e', "tex/$path.eps", "$path.dia"); |
4454 | fix_dia_eps_export("tex/$path"); |
4454 | fix_dia_eps_export("tex/$path"); |
4455 | } |
4455 | } |
4456 | } elsif (-r "$path.png" |
4456 | } elsif (-r "$path.png" |
4457 | && (($imggen eq 'force') |
4457 | && (($imggen eq 'force') |
4458 | || filenewer("$path.png", "tex/$path.eps") && filenewer("$path.png", "tex/$path.pdf") && filenewer("$path.png", "tex/$path.ppm"))) { |
4458 | || filenewer("$path.png", "tex/$path.eps") && filenewer("$path.png", "tex/$path.pdf") && filenewer("$path.png", "tex/$path.ppm"))) { |
4459 | warn "-----Automatic conversion of IMAGE $path.png to PPM\n"; |
4459 | warn "-----Automatic conversion of IMAGE $path.png to PPM\n"; |
4460 | #system("cp $path.png tex/$path.png"); # fjon wants direct copy! |
4460 | #system("cp $path.png tex/$path.png"); # fjon wants direct copy! |
4461 | system_cmd("pngtopnm $path.png >tex/$path.ppm"); |
4461 | system_cmd("pngtopnm $path.png >tex/$path.ppm"); |
4462 | system_cmd("cp $path.png ${htmldir}i-$path.png"); |
4462 | system_cmd("cp $path.png ${htmldir}i-$path.png"); |
4463 | } elsif (-r "$path.jpg" |
4463 | } elsif (-r "$path.jpg" |
4464 | && (($imggen eq 'force') |
4464 | && (($imggen eq 'force') |
4465 | || filenewer("$path.jpg", "tex/$path.eps") |
4465 | || filenewer("$path.jpg", "tex/$path.eps") |
4466 | && filenewer("$path.jpg", "tex/$path.pdf") |
4466 | && filenewer("$path.jpg", "tex/$path.pdf") |
4467 | && filenewer("$path.jpg", "tex/$path.ppm"))) { |
4467 | && filenewer("$path.jpg", "tex/$path.ppm"))) { |
4468 | warn "-----Automatic conversion of IMAGE $path.jpg to EPS\n"; |
4468 | warn "-----Automatic conversion of IMAGE $path.jpg to EPS\n"; |
4469 | #system("cp $path.jpg tex/$path.jpg"); # fjon wants direct copy! |
4469 | #system("cp $path.jpg tex/$path.jpg"); # fjon wants direct copy! |
4470 | #system("cp $path.jpg ${htmldir}i-$path.jpg"); # fjon wants direct copy! |
4470 | #system("cp $path.jpg ${htmldir}i-$path.jpg"); # fjon wants direct copy! |
4471 | system_cmd("djpeg -pnm $path.jpg >tex/$path.ppm"); |
4471 | system_cmd("djpeg -pnm $path.jpg >tex/$path.ppm"); |
4472 | } elsif (-r "$path.gif" |
4472 | } elsif (-r "$path.gif" |
4473 | && (($imggen eq 'force') |
4473 | && (($imggen eq 'force') |
4474 | || filenewer("$path.gif", "tex/$path.eps") && filenewer("$path.gif", "tex/$path.pdf") && filenewer("$path.gif", "tex/$path.ppm"))) { |
4474 | || filenewer("$path.gif", "tex/$path.eps") && filenewer("$path.gif", "tex/$path.pdf") && filenewer("$path.gif", "tex/$path.ppm"))) { |
4475 | warn "-----Automatic conversion of IMAGE $path.gif to EPS\n"; |
4475 | warn "-----Automatic conversion of IMAGE $path.gif to EPS\n"; |
4476 | #system("giftopnm -pnm $path.gif >$path.ppm") unless $dryrun; |
4476 | #system("giftopnm -pnm $path.gif >$path.ppm") unless $dryrun; |
4477 | system_cmd("gif2ps $path.gif >tex/$path.ps"); |
4477 | system_cmd("gif2ps $path.gif >tex/$path.ps"); |
4478 | } |
4478 | } |
4479 | 4479 | ||
4480 | if (-r "$path.ppm" |
4480 | if (-r "$path.ppm" |
4481 | && (($imggen eq 'force') |
4481 | && (($imggen eq 'force') |
4482 | || filenewer("$path.ppm", "tex/$path.eps") && filenewer("$path.ppm", "tex/$path.pdf"))) { |
4482 | || filenewer("$path.ppm", "tex/$path.eps") && filenewer("$path.ppm", "tex/$path.pdf"))) { |
4483 | warn "-----Automatic conversion of IMAGE $path.ppm to EPS\n"; |
4483 | warn "-----Automatic conversion of IMAGE $path.ppm to EPS\n"; |
4484 | system_cmd("pnmtops -noturn $path.ppm >tex/$path.eps"); # output $path.eps |
4484 | system_cmd("pnmtops -noturn $path.ppm >tex/$path.eps"); # output $path.eps |
4485 | } |
4485 | } |
4486 | if (-r "tex/$path.ppm" |
4486 | if (-r "tex/$path.ppm" |
4487 | && (($imggen eq 'force') |
4487 | && (($imggen eq 'force') |
4488 | || filenewer("tex/$path.ppm", "tex/$path.eps") |
4488 | || filenewer("tex/$path.ppm", "tex/$path.eps") |
4489 | && filenewer("tex/$path.ppm", "tex/$path.pdf"))) { |
4489 | && filenewer("tex/$path.ppm", "tex/$path.pdf"))) { |
4490 | warn "-----Automatic conversion of IMAGE $path.ppm to EPS\n"; |
4490 | warn "-----Automatic conversion of IMAGE $path.ppm to EPS\n"; |
4491 | system_cmd("pnmtops -noturn tex/$path.ppm >tex/$path.eps"); # output $path.eps |
4491 | system_cmd("pnmtops -noturn tex/$path.ppm >tex/$path.eps"); # output $path.eps |
4492 | } |
4492 | } |
4493 | 4493 | ||
4494 | if (-r "$path.eps" |
4494 | if (-r "$path.eps" |
4495 | && (($imggen eq 'force') |
4495 | && (($imggen eq 'force') |
4496 | || filenewer("$path.eps", "tex/$path.pdf"))) { |
4496 | || filenewer("$path.eps", "tex/$path.pdf"))) { |
4497 | warn "+++++Automatic conversion of EPS $path.eps to PDF\n"; |
4497 | warn "+++++Automatic conversion of EPS $path.eps to PDF\n"; |
4498 | my $x = readall("$path.eps"); |
4498 | my $x = readall("$path.eps"); |
4499 | if ($x !~ /^%%BoundingBox: /m && !$dryrun) { |
4499 | if ($x !~ /^%%BoundingBox: /m && !$dryrun) { |
4500 | warn "++++++++Missing BoundingBox in EPS $path.eps. Running gs to determine it.\n"; |
4500 | warn "++++++++Missing BoundingBox in EPS $path.eps. Running gs to determine it.\n"; |
4501 | system_cmd "gs -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=bbox $path.eps >/dev/null 2>bbox"; |
4501 | system_cmd "gs -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=bbox $path.eps >/dev/null 2>bbox"; |
4502 | my $bbox = readall('bbox'); |
4502 | my $bbox = readall('bbox'); |
4503 | if ($bbox =~ /^%%BoundingBox: /m) { |
4503 | if ($bbox =~ /^%%BoundingBox: /m) { |
4504 | rename "$path.eps" => "$path-nobbox.eps"; |
4504 | rename "$path.eps" => "$path-nobbox.eps"; |
4505 | $x =~ s/^(%%EndComments)/$bbox$1/m; |
4505 | $x =~ s/^(%%EndComments)/$bbox$1/m; |
4506 | writeall("$path.eps", $x); |
4506 | writeall("$path.eps", $x); |
4507 | } else { |
4507 | } else { |
4508 | warn "Determination of BoundingBox failed: $bbox"; |
4508 | warn "Determination of BoundingBox failed: $bbox"; |
4509 | } |
4509 | } |
4510 | } |
4510 | } |
4511 | # apt-get install texlive-font-utils |
4511 | # apt-get install texlive-font-utils |
4512 | system_cmd("cd tex && epstopdf ../$path.eps"); |
4512 | system_cmd("cd tex && epstopdf ../$path.eps"); |
4513 | #if(!$dryrun){ # fjon |
4513 | #if(!$dryrun){ # fjon |
4514 | # system("epstopdf $path.eps"); |
4514 | # system("epstopdf $path.eps"); |
4515 | # system("mv $path.pdf tex/"); |
4515 | # system("mv $path.pdf tex/"); |
4516 | #} |
4516 | #} |
4517 | 4517 | ||
4518 | warn "-----Automatic conversion of EPS $path.eps to PNG\n"; |
4518 | warn "-----Automatic conversion of EPS $path.eps to PNG\n"; |
4519 | # *** FJ 070613 - Image should always be copied if mod'd, no need to check if image exist |
4519 | # *** FJ 070613 - Image should always be copied if mod'd, no need to check if image exist |
4520 | #system("convert -density 100x100 $path.eps ${htmldir}i-$path.png") unless $dryrun; |
4520 | #system("convert -density 100x100 $path.eps ${htmldir}i-$path.png") unless $dryrun; |
4521 | if (-r "${htmldir}i-$path.png") { |
4521 | if (-r "${htmldir}i-$path.png") { |
4522 | warn "++ Image already copied ++\n"; |
4522 | warn "++ Image already copied ++\n"; |
4523 | } else { |
4523 | } else { |
4524 | #system("convert -density 70x70 $path.eps ${htmldir}i-$path.png") unless $dryrun; # fjon |
4524 | #system("convert -density 70x70 $path.eps ${htmldir}i-$path.png") unless $dryrun; # fjon |
4525 | epstopng("$path.eps", "${htmldir}i-$path.png") unless $dryrun; |
4525 | epstopng("$path.eps", "${htmldir}i-$path.png") unless $dryrun; |
4526 | } |
4526 | } |
4527 | return; |
4527 | return; |
4528 | } elsif (-r "$path.ps" |
4528 | } elsif (-r "$path.ps" |
4529 | && (($imggen eq 'force') |
4529 | && (($imggen eq 'force') |
4530 | || filenewer("$path.ps", "tex/$path.pdf"))) { |
4530 | || filenewer("$path.ps", "tex/$path.pdf"))) { |
4531 | warn "+++++Automatic conversion of PS $path.ps to PDF\n"; |
4531 | warn "+++++Automatic conversion of PS $path.ps to PDF\n"; |
4532 | #system('ps2pdf', "$path.ps", "tex/i-$path.pdf") unless $dryrun; # fjon |
4532 | #system('ps2pdf', "$path.ps", "tex/i-$path.pdf") unless $dryrun; # fjon |
4533 | system_cmd('ps2pdf', "$path.ps", "tex/$path.pdf"); |
4533 | system_cmd('ps2pdf', "$path.ps", "tex/$path.pdf"); |
4534 | warn "-----Automatic conversion of PS $path.ps to PNG\n"; |
4534 | warn "-----Automatic conversion of PS $path.ps to PNG\n"; |
4535 | if (-r "${htmldir}i-$path.png") { |
4535 | if (-r "${htmldir}i-$path.png") { |
4536 | warn "++ Image already copied ++\n"; |
4536 | warn "++ Image already copied ++\n"; |
4537 | } else { |
4537 | } else { |
4538 | epstopng("$path.ps", "${htmldir}i-$path.png") unless $dryrun; |
4538 | epstopng("$path.ps", "${htmldir}i-$path.png") unless $dryrun; |
4539 | } |
4539 | } |
4540 | return; |
4540 | return; |
4541 | } |
4541 | } |
4542 | 4542 | ||
4543 | if (-r "tex/$path.eps" |
4543 | if (-r "tex/$path.eps" |
4544 | && (($imggen eq 'force') |
4544 | && (($imggen eq 'force') |
4545 | || filenewer("tex/$path.eps", "tex/$path.pdf"))) { |
4545 | || filenewer("tex/$path.eps", "tex/$path.pdf"))) { |
4546 | warn "+++++Automatic conversion of EPS tex/$path.eps to PDF\n"; |
4546 | warn "+++++Automatic conversion of EPS tex/$path.eps to PDF\n"; |
4547 | my $x = readall("tex/$path.eps"); |
4547 | my $x = readall("tex/$path.eps"); |
4548 | if ($x !~ /^%%BoundingBox: /m && !$dryrun) { |
4548 | if ($x !~ /^%%BoundingBox: /m && !$dryrun) { |
4549 | warn "++++++++Missing BoundingBox in EPS $path.eps. Running gs to determine it.\n"; |
4549 | warn "++++++++Missing BoundingBox in EPS $path.eps. Running gs to determine it.\n"; |
4550 | system_cmd "gs -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=bbox $path.eps >/dev/null 2>bbox"; |
4550 | system_cmd "gs -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=bbox $path.eps >/dev/null 2>bbox"; |
4551 | my $bbox = readall('bbox'); |
4551 | my $bbox = readall('bbox'); |
4552 | if ($bbox =~ /^%%BoundingBox: /m) { |
4552 | if ($bbox =~ /^%%BoundingBox: /m) { |
4553 | rename "$path.eps" => "$path-nobbox.eps"; |
4553 | rename "$path.eps" => "$path-nobbox.eps"; |
4554 | $x =~ s/^(%%EndComments)/$bbox$1/m; |
4554 | $x =~ s/^(%%EndComments)/$bbox$1/m; |
4555 | writeall("tex/$path.eps", $x); |
4555 | writeall("tex/$path.eps", $x); |
4556 | } else { |
4556 | } else { |
4557 | warn "Determination of BoundingBox failed: $bbox"; |
4557 | warn "Determination of BoundingBox failed: $bbox"; |
4558 | } |
4558 | } |
4559 | } |
4559 | } |
4560 | system_cmd("cd tex && epstopdf $path.eps"); |
4560 | system_cmd("cd tex && epstopdf $path.eps"); |
4561 | warn "-----Automatic conversion of EPS tex/$path.eps to PNG\n"; |
4561 | warn "-----Automatic conversion of EPS tex/$path.eps to PNG\n"; |
4562 | if (-r "${htmldir}i-$path.png") { |
4562 | if (-r "${htmldir}i-$path.png") { |
4563 | warn "++ Image already copied ++\n"; |
4563 | warn "++ Image already copied ++\n"; |
4564 | } else { |
4564 | } else { |
4565 | epstopng("tex/$path.eps", "${htmldir}i-$path.png") unless $dryrun; |
4565 | epstopng("tex/$path.eps", "${htmldir}i-$path.png") unless $dryrun; |
4566 | } |
4566 | } |
4567 | # Old way (has problem in that it rotates landscape graphics) |
4567 | # Old way (has problem in that it rotates landscape graphics) |
4568 | #system("cd tex && pstopnm -ppm $path.eps") unless $dryrun; # invokes gs |
4568 | #system("cd tex && pstopnm -ppm $path.eps") unless $dryrun; # invokes gs |
4569 | #system("pnmtopng tex/$path.eps001.ppm >${htmldir}i-$path.png") unless $dryrun; |
4569 | #system("pnmtopng tex/$path.eps001.ppm >${htmldir}i-$path.png") unless $dryrun; |
4570 | #unlink "tex/$path.eps001.ppm"; # these are huge so it behooves to rm them quickly |
4570 | #unlink "tex/$path.eps001.ppm"; # these are huge so it behooves to rm them quickly |
4571 | return; |
4571 | return; |
4572 | } elsif (-r "tex/$path.ps" |
4572 | } elsif (-r "tex/$path.ps" |
4573 | && (($imggen eq 'force') |
4573 | && (($imggen eq 'force') |
4574 | || filenewer("tex/$path.ps", "tex/$path.pdf"))) { |
4574 | || filenewer("tex/$path.ps", "tex/$path.pdf"))) { |
4575 | warn "+++++Automatic conversion of PS tex/$path.ps to PDF\n"; |
4575 | warn "+++++Automatic conversion of PS tex/$path.ps to PDF\n"; |
4576 | system_cmd('ps2pdf', "tex/$path.ps", "tex/$path.pdf"); |
4576 | system_cmd('ps2pdf', "tex/$path.ps", "tex/$path.pdf"); |
4577 | warn "-----Automatic conversion of PS $path.ps to PNG\n"; |
4577 | warn "-----Automatic conversion of PS $path.ps to PNG\n"; |
4578 | if (-r "${htmldir}i-$path.png") { |
4578 | if (-r "${htmldir}i-$path.png") { |
4579 | warn "++ Image already copied ++\n"; |
4579 | warn "++ Image already copied ++\n"; |
4580 | } else { |
4580 | } else { |
4581 | epstopng("tex/$path.ps", "${htmldir}i-$path.png") unless $dryrun; |
4581 | epstopng("tex/$path.ps", "${htmldir}i-$path.png") unless $dryrun; |
4582 | } |
4582 | } |
4583 | return; |
4583 | return; |
4584 | } |
4584 | } |
4585 | warn "*****Missing image `tex/$path.pdf' or conversion to pdf failed ($hint) pd[$i]: $pd[$i]" |
4585 | warn "*****Missing image `tex/$path.pdf' or conversion to pdf failed ($hint) pd[$i]: $pd[$i]" |
4586 | unless -r "tex/$path.pdf"; |
4586 | unless -r "tex/$path.pdf"; |
4587 | } |
4587 | } |
4588 | 4588 | ||
4589 | 4589 | ||
4590 | sub massage_image { |
4590 | sub massage_image { |
4591 | my ($path, $layers, $hint) = @_; |
4591 | my ($path, $layers, $hint) = @_; |
4592 | if ($layers) { |
4592 | if ($layers) { |
4593 | $path = extract_dia_layers($path, $layers); |
4593 | $path = extract_dia_layers($path, $layers); |
4594 | } |
4594 | } |
4595 | gen_img($path, $hint); |
4595 | gen_img($path, $hint); |
4596 | if ((!-r "tex/$path.pdf") |
4596 | if ((!-r "tex/$path.pdf") |
4597 | && (!-r "tex/$path.jpg") && (!-r "tex/$path.png") # fjon |
4597 | && (!-r "tex/$path.jpg") && (!-r "tex/$path.png") # fjon |
4598 | ) { |
4598 | ) { |
4599 | warn "*****Missing image tex/$path.pdf"; |
4599 | warn "*****Missing image tex/$path.pdf"; |
4600 | $path = "MISSING GRAPHIC ($path)"; |
4600 | $path = "MISSING GRAPHIC ($path)"; |
4601 | } |
4601 | } |
4602 | return $path; |
4602 | return $path; |
4603 | } |
4603 | } |
4604 | 4604 | ||
4605 | %tex_img_sizes = ( |
4605 | %tex_img_sizes = ( |
4606 | n => 'keepaspectratio,', # "natural" |
4606 | n => 'keepaspectratio,', # "natural" |
4607 | 'dbx90' => 'width=1.0\\textwidth,height=1.0\\textheight,keepaspectratio,', |
4607 | 'dbx90' => 'width=1.0\\textwidth,height=1.0\\textheight,keepaspectratio,', |
4608 | 'dbx80' => 'width=1.0\\textwidth,height=1.0\\textheight,keepaspectratio,', |
4608 | 'dbx80' => 'width=1.0\\textwidth,height=1.0\\textheight,keepaspectratio,', |
4609 | 'dbx70' => 'width=1.0\\textwidth,height=1.0\\textheight,keepaspectratio,', |
4609 | 'dbx70' => 'width=1.0\\textwidth,height=1.0\\textheight,keepaspectratio,', |
4610 | 'dbx60' => 'width=1.0\\textwidth,height=1.0\\textheight,keepaspectratio,', |
4610 | 'dbx60' => 'width=1.0\\textwidth,height=1.0\\textheight,keepaspectratio,', |
4611 | 'dbx50' => 'width=1.0\\textwidth,height=1.0\\textheight,keepaspectratio,', |
4611 | 'dbx50' => 'width=1.0\\textwidth,height=1.0\\textheight,keepaspectratio,', |
4612 | 'dbx40' => 'width=1.0\\textwidth,height=1.0\\textheight,keepaspectratio,', |
4612 | 'dbx40' => 'width=1.0\\textwidth,height=1.0\\textheight,keepaspectratio,', |
4613 | 'dbx30' => 'width=1.0\\textwidth,height=1.0\\textheight,keepaspectratio,', |
4613 | 'dbx30' => 'width=1.0\\textwidth,height=1.0\\textheight,keepaspectratio,', |
4614 | 'dbx20' => 'width=1.0\\textwidth,height=1.0\\textheight,keepaspectratio,', |
4614 | 'dbx20' => 'width=1.0\\textwidth,height=1.0\\textheight,keepaspectratio,', |
4615 | 'dbx10' => 'width=1.0\\textwidth,height=1.0\\textheight,keepaspectratio,', |
4615 | 'dbx10' => 'width=1.0\\textwidth,height=1.0\\textheight,keepaspectratio,', |
4616 | 1 => 'width=1.0\\textwidth,height=1.0\\textheight,keepaspectratio,', |
4616 | 1 => 'width=1.0\\textwidth,height=1.0\\textheight,keepaspectratio,', |
4617 | 15 => 'width=0.67\\textwidth,height=0.67\\textheight,keepaspectratio,', |
4617 | 15 => 'width=0.67\\textwidth,height=0.67\\textheight,keepaspectratio,', |
4618 | 2 => 'width=0.5\\textwidth,height=0.5\\textheight,keepaspectratio,', |
4618 | 2 => 'width=0.5\\textwidth,height=0.5\\textheight,keepaspectratio,', |
4619 | 3 => 'width=0.33\\textwidth,height=0.33\\textheight,keepaspectratio,', |
4619 | 3 => 'width=0.33\\textwidth,height=0.33\\textheight,keepaspectratio,', |
4620 | 4 => 'width=0.25\\textwidth,height=0.25\\textheight,keepaspectratio,', |
4620 | 4 => 'width=0.25\\textwidth,height=0.25\\textheight,keepaspectratio,', |
4621 | 8 => 'width=0.125\\textwidth,height=0.125\\textheight,keepaspectratio,', |
4621 | 8 => 'width=0.125\\textwidth,height=0.125\\textheight,keepaspectratio,', |
4622 | 10 => 'width=1.0\\textwidth,height=0.1\\textheight,keepaspectratio,', |
4622 | 10 => 'width=1.0\\textwidth,height=0.1\\textheight,keepaspectratio,', |
4623 | 20 => 'width=1.0\\textwidth,height=0.2\\textheight,keepaspectratio,', |
4623 | 20 => 'width=1.0\\textwidth,height=0.2\\textheight,keepaspectratio,', |
4624 | 30 => 'width=1.0\\textwidth,height=0.3\\textheight,keepaspectratio,', |
4624 | 30 => 'width=1.0\\textwidth,height=0.3\\textheight,keepaspectratio,', |
4625 | 40 => 'width=1.0\\textwidth,height=0.4\\textheight,keepaspectratio,', |
4625 | 40 => 'width=1.0\\textwidth,height=0.4\\textheight,keepaspectratio,', |
4626 | 50 => 'width=1.0\\textwidth,height=0.5\\textheight,keepaspectratio,', |
4626 | 50 => 'width=1.0\\textwidth,height=0.5\\textheight,keepaspectratio,', |
4627 | 60 => 'width=1.0\\textwidth,height=0.6\\textheight,keepaspectratio,', |
4627 | 60 => 'width=1.0\\textwidth,height=0.6\\textheight,keepaspectratio,', |
4628 | 70 => 'width=1.0\\textwidth,height=0.7\\textheight,keepaspectratio,', |
4628 | 70 => 'width=1.0\\textwidth,height=0.7\\textheight,keepaspectratio,', |
4629 | 75 => 'width=0.75\\textwidth,height=0.75\\textheight,keepaspectratio,', |
4629 | 75 => 'width=0.75\\textwidth,height=0.75\\textheight,keepaspectratio,', |
4630 | 80 => 'width=0.8\\textwidth,height=0.8\\textheight,keepaspectratio,', |
4630 | 80 => 'width=0.8\\textwidth,height=0.8\\textheight,keepaspectratio,', |
4631 | 85 => 'width=0.85\\textwidth,height=0.85\\textheight,keepaspectratio,', |
4631 | 85 => 'width=0.85\\textwidth,height=0.85\\textheight,keepaspectratio,', |
4632 | 90 => 'width=0.90\\textwidth,height=0.9\\textheight,keepaspectratio,', |
4632 | 90 => 'width=0.90\\textwidth,height=0.9\\textheight,keepaspectratio,', |
4633 | 95 => 'width=0.95\\textwidth,height=0.95\\textheight,keepaspectratio,', |
4633 | 95 => 'width=0.95\\textwidth,height=0.95\\textheight,keepaspectratio,', |
4634 | 120 => 'width=1.2\\textwidth,height=1.0\\textheight,keepaspectratio,', |
4634 | 120 => 'width=1.2\\textwidth,height=1.0\\textheight,keepaspectratio,', |
4635 | 130 => 'width=1.3\\textwidth,height=1.1\\textheight,keepaspectratio,', |
4635 | 130 => 'width=1.3\\textwidth,height=1.1\\textheight,keepaspectratio,', |
4636 | 140 => 'width=1.4\\textwidth,height=1.2\\textheight,keepaspectratio,', |
4636 | 140 => 'width=1.4\\textwidth,height=1.2\\textheight,keepaspectratio,', |
4637 | 150 => 'width=1.5\\textwidth,height=1.3\\textheight,keepaspectratio,', |
4637 | 150 => 'width=1.5\\textwidth,height=1.3\\textheight,keepaspectratio,', |
4638 | ); |
4638 | ); |
4639 | 4639 | ||
4640 | %dbx_img_sizes = ( |
4640 | %dbx_img_sizes = ( |
4641 | n => '', # "natural" |
4641 | n => '', # "natural" |
4642 | 'dbx90' => 'scale="90"', # scalefit="1" |
4642 | 'dbx90' => 'scale="90"', # scalefit="1" |
4643 | 'dbx80' => 'scale="80"', |
4643 | 'dbx80' => 'scale="80"', |
4644 | 'dbx70' => 'scale="70"', |
4644 | 'dbx70' => 'scale="70"', |
4645 | 'dbx60' => 'scale="60"', |
4645 | 'dbx60' => 'scale="60"', |
4646 | 'dbx50' => 'scale="50"', |
4646 | 'dbx50' => 'scale="50"', |
4647 | 'dbx40' => 'scale="40"', |
4647 | 'dbx40' => 'scale="40"', |
4648 | 'dbx30' => 'scale="30"', |
4648 | 'dbx30' => 'scale="30"', |
4649 | 'dbx20' => 'scale="20"', |
4649 | 'dbx20' => 'scale="20"', |
4650 | 'dbx10' => 'scale="10"', |
4650 | 'dbx10' => 'scale="10"', |
4651 | 1 => 'scale="100"', |
4651 | 1 => 'scale="100"', |
4652 | 15 => 'scale="67"', |
4652 | 15 => 'scale="67"', |
4653 | 2 => 'scale="50"', |
4653 | 2 => 'scale="50"', |
4654 | 3 => 'scale="33"', |
4654 | 3 => 'scale="33"', |
4655 | 4 => 'scale="25"', |
4655 | 4 => 'scale="25"', |
4656 | 8 => 'scale="12.5"', |
4656 | 8 => 'scale="12.5"', |
4657 | 10 => 'scale="10"', |
4657 | 10 => 'scale="10"', |
4658 | 20 => 'scale="20"', |
4658 | 20 => 'scale="20"', |
4659 | 30 => 'scale="30"', |
4659 | 30 => 'scale="30"', |
4660 | 40 => 'scale="40"', |
4660 | 40 => 'scale="40"', |
4661 | 50 => 'scale="50"', |
4661 | 50 => 'scale="50"', |
4662 | 60 => 'scale="60"', |
4662 | 60 => 'scale="60"', |
4663 | 70 => 'scale="70"', |
4663 | 70 => 'scale="70"', |
4664 | 75 => 'scale="75"', |
4664 | 75 => 'scale="75"', |
4665 | 80 => 'scale="80"', |
4665 | 80 => 'scale="80"', |
4666 | 85 => 'scale="85"', |
4666 | 85 => 'scale="85"', |
4667 | 90 => 'scale="90"', |
4667 | 90 => 'scale="90"', |
4668 | 95 => 'scale="95"', |
4668 | 95 => 'scale="95"', |
4669 | ); |
4669 | ); |
4670 | 4670 | ||
4671 | %tex_units = ( |
4671 | %tex_units = ( |
4672 | tw => '\\textwidth', |
4672 | tw => '\\textwidth', |
4673 | th => '\\textheight', |
4673 | th => '\\textheight', |
4674 | ); |
4674 | ); |
4675 | 4675 | ||
4676 | sub tex_graphics { |
4676 | sub tex_graphics { |
4677 | my ($siz, $path) = @_; |
4677 | my ($siz, $path) = @_; |
4678 | return $path if $path =~ /^MISS/; |
4678 | return $path if $path =~ /^MISS/; |
4679 | return qq(\\includegraphics[$siz]{$path}); |
4679 | return qq(\\includegraphics[$siz]{$path}); |
4680 | } |
4680 | } |
4681 | 4681 | ||
4682 | sub tex_caption { |
4682 | sub tex_caption { |
4683 | my ($caption) = @_; |
4683 | my ($caption) = @_; |
4684 | return '' if !$caption; |
4684 | return '' if !$caption; |
4685 | my $tex_caption = tex_format($caption); |
4685 | my $tex_caption = tex_format($caption); |
4686 | return "\\caption{\\small $tex_caption}"; |
4686 | return "\\caption{\\small $tex_caption}"; |
4687 | } |
4687 | } |
4688 | 4688 | ||
4689 | sub image { |
4689 | sub image { |
4690 | my ($path, $caption, $pos, $siz, $trim, $layers) = @_; |
4690 | my ($path, $caption, $pos, $siz, $trim, $layers) = @_; |
4691 | $path = massage_image($path, $layers, 'image'); |
4691 | $path = massage_image($path, $layers, 'image'); |
4692 | 4692 | ||
4693 | my $star = ''; |
4693 | my $star = ''; |
4694 | my ($w, $w_unit, $h, $h_unit, $k, $label, $tex_graphics, $tex_caption, $dbx_siz); |
4694 | my ($w, $w_unit, $h, $h_unit, $k, $label, $tex_graphics, $tex_caption, $dbx_siz); |
4695 | $pos ||= $tex_flt_place; |
4695 | $pos ||= $tex_flt_place; |
4696 | if ($pos =~ s/\*//) { |
4696 | if ($pos =~ s/\*//) { |
4697 | #warn "POS HAS A STAR pos($pos)"; |
4697 | #warn "POS HAS A STAR pos($pos)"; |
4698 | $star = '*'; |
4698 | $star = '*'; |
4699 | } |
4699 | } |
4700 | $siz = 1 if !$siz; |
4700 | $siz = 1 if !$siz; |
4701 | warn "SIZ($siz)"; |
4701 | warn "SIZ($siz)"; |
4702 | # 1width.d 2Unit X3height.d4Unit 5stretch |
4702 | # 1width.d 2Unit X3height.d4Unit 5stretch |
4703 | if (($w, $w_unit, $h, $h_unit, $stretch) = $siz =~ /^([0-9.]*)([^0-9.X]*?)X([0-9.]*)(\w*?)(S?)$/) { |
4703 | if (($w, $w_unit, $h, $h_unit, $stretch) = $siz =~ /^([0-9.]*)([^0-9.X]*?)X([0-9.]*)(\w*?)(S?)$/) { |
4704 | $siz = ''; |
4704 | $siz = ''; |
4705 | if ($w) { |
4705 | if ($w) { |
4706 | $w_unit = $tex_units{$w_unit} if $tex_units{$w_unit}; |
4706 | $w_unit = $tex_units{$w_unit} if $tex_units{$w_unit}; |
4707 | $siz .= "width=$w$w_unit,"; |
4707 | $siz .= "width=$w$w_unit,"; |
4708 | } |
4708 | } |
4709 | if ($h) { |
4709 | if ($h) { |
4710 | $h_unit = $tex_units{$h_unit} if $tex_units{$h_unit}; |
4710 | $h_unit = $tex_units{$h_unit} if $tex_units{$h_unit}; |
4711 | $siz .= "height=$h$h_unit,"; |
4711 | $siz .= "height=$h$h_unit,"; |
4712 | } |
4712 | } |
4713 | $siz .= 'keepaspectratio,' unless $stretch; |
4713 | $siz .= 'keepaspectratio,' unless $stretch; |
4714 | chop $siz; |
4714 | chop $siz; |
4715 | warn "SIZ($siz)"; |
4715 | warn "SIZ($siz)"; |
4716 | } else { |
4716 | } else { |
4717 | $dbx_siz = $dbx_img_sizes{$siz}; |
4717 | $dbx_siz = $dbx_img_sizes{$siz}; |
4718 | $siz = $tex_img_sizes{$siz}; |
4718 | $siz = $tex_img_sizes{$siz}; |
4719 | warn "Bad size spec `$siz' in `<<img: $path\[...\]: $caption>>'" unless $siz; |
4719 | warn "Bad size spec `$siz' in `<<img: $path\[...\]: $caption>>'" unless $siz; |
4720 | } |
4720 | } |
4721 | $siz ||= $tex_img_sizes{1}; |
4721 | $siz ||= $tex_img_sizes{1}; |
4722 | if ($trim) { |
4722 | if ($trim) { |
4723 | #warn "TRIM TRIM TRIM [$trim]"; |
4723 | #warn "TRIM TRIM TRIM [$trim]"; |
4724 | my ($trim_left, $trim_bot, $trim_right, $trim_top) = |
4724 | my ($trim_left, $trim_bot, $trim_right, $trim_top) = |
4725 | $trim =~ /L(-?\d+)B(-?\d+)R(-?\d+)T(-?\d+)/; |
4725 | $trim =~ /L(-?\d+)B(-?\d+)R(-?\d+)T(-?\d+)/; |
4726 | $siz .= "trim=$trim_left $trim_bot $trim_right $trim_top,"; |
4726 | $siz .= "trim=$trim_left $trim_bot $trim_right $trim_top,"; |
4727 | } |
4727 | } |
4728 | #chop $siz; |
4728 | #chop $siz; |
4729 | $siz .= 'clip'; |
4729 | $siz .= 'clip'; |
4730 | $label = fold_label($path); |
4730 | $label = fold_label($path); |
4731 | $tex_graphics = tex_graphics($siz, $path); |
4731 | $tex_graphics = tex_graphics($siz, $path); |
4732 | 4732 | ||
4733 | if(-e "${htmldir}i-$path.jpg"){ # fjon |
4733 | if(-e "${htmldir}i-$path.jpg"){ # fjon |
4734 | $filename = "i-$path.jpg"; |
4734 | $filename = "i-$path.jpg"; |
4735 | } else { |
4735 | } else { |
4736 | $filename = "i-$path.png"; |
4736 | $filename = "i-$path.png"; |
4737 | } |
4737 | } |
4738 | 4738 | ||
4739 | ++$n_images; |
4739 | ++$n_images; |
4740 | ++$cap_n_images; |
4740 | ++$cap_n_images; |
4741 | print TEX "\\message{===FIG $label}"; |
4741 | print TEX "\\message{===FIG $label}"; |
4742 | if ($caption) { |
4742 | if ($caption) { |
4743 | my $dbx_caption = dbx_format($caption); |
4743 | my $dbx_caption = dbx_format($caption); |
4744 | ++$img_no; |
4744 | ++$img_no; |
4745 | $refname = "fig:$label"; |
4745 | $refname = "fig:$label"; |
4746 | $reflist{$refname} = $img_no; |
4746 | $reflist{$refname} = $img_no; |
4747 | $refhtmlpage{$refname} = $html2; |
4747 | $refhtmlpage{$refname} = $html2; |
4748 | 4748 | ||
4749 | print NONL "Figure $img_no: $caption\n"; |
4749 | print NONL "Figure $img_no: $caption\n"; |
4750 | print PDSEAL "Figure $img_no: $caption\n"; |
4750 | print PDSEAL "Figure $img_no: $caption\n"; |
4751 | print DBX <<DBX; |
4751 | print DBX <<DBX; |
4752 | <figure id="$label" label="$img_no"> |
4752 | <figure id="$label" label="$img_no"> |
4753 | <title>$dbx_caption</title> |
4753 | <title>$dbx_caption</title> |
4754 | <mediaobject> |
4754 | <mediaobject> |
4755 | <imageobject><imagedata fileref="$path.eps" $dbx_siz/></imageobject> |
4755 | <imageobject><imagedata fileref="$path.eps" $dbx_siz/></imageobject> |
4756 | </mediaobject> |
4756 | </mediaobject> |
4757 | </figure> |
4757 | </figure> |
4758 | DBX |
4758 | DBX |
4759 | ; |
4759 | ; |
4760 | my $html_caption = html_format($caption); |
4760 | my $html_caption = html_format($caption); |
4761 | print HTML qq(<p><a id="$label"><img src="$filename"></a><br>Fig-$img_no: $html_caption</p>); |
4761 | print HTML qq(<p><a id="$label"><img src="$filename"></a><br>Fig-$img_no: $html_caption</p>); |
4762 | print HTML2 qq(<p><a id="$label"><img src="$filename"></a><br>Fig-$img_no: $html_caption</p>); |
4762 | print HTML2 qq(<p><a id="$label"><img src="$filename"></a><br>Fig-$img_no: $html_caption</p>); |
4763 | $tex_caption = tex_caption($caption); |
4763 | $tex_caption = tex_caption($caption); |
4764 | if ($pos =~ /^W(\d+)/) { |
4764 | if ($pos =~ /^W(\d+)/) { |
4765 | print TEX qq(\\begin{floatingfigure}{${1}cm}$tex_graphics$tex_caption\\vspace{3mm}\\label{fig:$label}\\end{floatingfigure}); |
4765 | print TEX qq(\\begin{floatingfigure}{${1}cm}$tex_graphics$tex_caption\\vspace{3mm}\\label{fig:$label}\\end{floatingfigure}); |
4766 | } else { |
4766 | } else { |
4767 | print TEX qq(\\begin{figure$star}[$pos]\\centering$tex_graphics$tex_caption\\label{fig:$label}\\end{figure$star}); |
4767 | print TEX qq(\\begin{figure$star}[$pos]\\centering$tex_graphics$tex_caption\\label{fig:$label}\\end{figure$star}); |
4768 | } |
4768 | } |
4769 | } else { |
4769 | } else { |
4770 | print DBX qq(<mediaobject><imageobject><imagedata fileref="$path.eps" $dbx_siz/></imageobject></mediaobject>); |
4770 | print DBX qq(<mediaobject><imageobject><imagedata fileref="$path.eps" $dbx_siz/></imageobject></mediaobject>); |
4771 | print HTML qq(<p><a id="$label"><img src="$filename"></a></p>); |
4771 | print HTML qq(<p><a id="$label"><img src="$filename"></a></p>); |
4772 | print HTML2 qq(<p><a id="$label"><img src="$filename"></a></p>); |
4772 | print HTML2 qq(<p><a id="$label"><img src="$filename"></a></p>); |
4773 | if ($pos =~ /^W(\d+)/) { |
4773 | if ($pos =~ /^W(\d+)/) { |
4774 | print TEX qq(\\begin{floatingfigure}{${1}cm}$tex_graphics\\end{floatingfigure}); |
4774 | print TEX qq(\\begin{floatingfigure}{${1}cm}$tex_graphics\\end{floatingfigure}); |
4775 | } elsif ($pos eq 'R') { |
4775 | } elsif ($pos eq 'R') { |
4776 | print TEX qq($tex_graphics\n); |
4776 | print TEX qq($tex_graphics\n); |
4777 | } else { |
4777 | } else { |
4778 | print TEX qq(\\begin{figure$star}[$pos]\\centering$tex_graphics \\end{figure$star}\n); |
4778 | print TEX qq(\\begin{figure$star}[$pos]\\centering$tex_graphics \\end{figure$star}\n); |
4779 | } |
4779 | } |
4780 | } |
4780 | } |
4781 | ++$sec_float_obj; |
4781 | ++$sec_float_obj; |
4782 | } |
4782 | } |
4783 | 4783 | ||
4784 | $doubleimage_half_siz = 'width=0.5\textwidth,height=0.5\textheight,keepaspectratio'; |
4784 | $doubleimage_half_siz = 'width=0.5\textwidth,height=0.5\textheight,keepaspectratio'; |
4785 | 4785 | ||
4786 | # <<doubleimg: ref-tag,posspec: Text for legend |
4786 | # <<doubleimg: ref-tag,posspec: Text for legend |
4787 | # image-file1: Sublegend for image 1 (will be labelled a) |
4787 | # image-file1: Sublegend for image 1 (will be labelled a) |
4788 | # image-file2: Sublegend for image 2 (will be labelled b) |
4788 | # image-file2: Sublegend for image 2 (will be labelled b) |
4789 | # >> |
4789 | # >> |
4790 | 4790 | ||
4791 | sub doubleimage { |
4791 | sub doubleimage { |
4792 | my ($label, $caption, $pos, # ref-tag,posspec: Text for legend |
4792 | my ($label, $caption, $pos, # ref-tag,posspec: Text for legend |
4793 | $path1, $layers1, $legend1, # image-file1: Sublegend for image 1 |
4793 | $path1, $layers1, $legend1, # image-file1: Sublegend for image 1 |
4794 | $path2, $layers2, $legend2) = @_; # image-file2: Sublegend for image 2 |
4794 | $path2, $layers2, $legend2) = @_; # image-file2: Sublegend for image 2 |
4795 | #warn "pos1($pos)"; |
4795 | #warn "pos1($pos)"; |
4796 | $path1 = massage_image($path1, $layers1, 'doubleimage 1'); |
4796 | $path1 = massage_image($path1, $layers1, 'doubleimage 1'); |
4797 | $path2 = massage_image($path2, $layers2, 'doubleimage 2'); |
4797 | $path2 = massage_image($path2, $layers2, 'doubleimage 2'); |
4798 | 4798 | ||
4799 | my ($w, $w_unit, $h, $h_unit, $k, $tex_graphics, $tex_caption); |
4799 | my ($w, $w_unit, $h, $h_unit, $k, $tex_graphics, $tex_caption); |
4800 | $pos ||= $tex_flt_place; |
4800 | $pos ||= $tex_flt_place; |
4801 | $label = fold_label($label); |
4801 | $label = fold_label($label); |
4802 | my $tex_graphics1 = tex_graphics($doubleimage_half_siz, $path1); |
4802 | my $tex_graphics1 = tex_graphics($doubleimage_half_siz, $path1); |
4803 | my $tex_graphics2 = tex_graphics($doubleimage_half_siz, $path2); |
4803 | my $tex_graphics2 = tex_graphics($doubleimage_half_siz, $path2); |
4804 | 4804 | ||
4805 | my $dbx_caption = dbx_format($caption); |
4805 | my $dbx_caption = dbx_format($caption); |
4806 | ++$n_images; |
4806 | ++$n_images; |
4807 | ++$cap_n_images; |
4807 | ++$cap_n_images; |
4808 | ++$img_no; |
4808 | ++$img_no; |
4809 | $refname = "fig:$label"; |
4809 | $refname = "fig:$label"; |
4810 | $reflist{$refname} = $img_no; |
4810 | $reflist{$refname} = $img_no; |
4811 | $refhtmlpage{$refname} = $html2; |
4811 | $refhtmlpage{$refname} = $html2; |
4812 | print TEX "\\message{===DBLFIG $label}"; |
4812 | print TEX "\\message{===DBLFIG $label}"; |
4813 | print DBX <<DBX; |
4813 | print DBX <<DBX; |
4814 | <figure id="$label" label="$img_no"> |
4814 | <figure id="$label" label="$img_no"> |
4815 | <title>$dbx_caption</title> |
4815 | <title>$dbx_caption</title> |
4816 | <mediaobject> |
4816 | <mediaobject> |
4817 | <imageobject><imagedata fileref="i-$path1.png"/></imageobject> |
4817 | <imageobject><imagedata fileref="i-$path1.png"/></imageobject> |
4818 | <imageobject><imagedata fileref="i-$path2.png"/></imageobject> |
4818 | <imageobject><imagedata fileref="i-$path2.png"/></imageobject> |
4819 | </mediaobject> |
4819 | </mediaobject> |
4820 | </figure> |
4820 | </figure> |
4821 | DBX |
4821 | DBX |
4822 | ; |
4822 | ; |
4823 | my $html_caption = html_format($caption); |
4823 | my $html_caption = html_format($caption); |
4824 | my $html_dual_fig = <<HTML; |
4824 | my $html_dual_fig = <<HTML; |
4825 | <table border=0> |
4825 | <table border=0> |
4826 | <tr><td><img src="i-$path1.png"><br>(a) $legend1</td> |
4826 | <tr><td><img src="i-$path1.png"><br>(a) $legend1</td> |
4827 | <td><img src="i-$path2.png"><br>(b) $legend2</td></tr> |
4827 | <td><img src="i-$path2.png"><br>(b) $legend2</td></tr> |
4828 | <tr><td colspan=2><a id="$label">Fig-$img_no</a>: $html_caption</td></tr> |
4828 | <tr><td colspan=2><a id="$label">Fig-$img_no</a>: $html_caption</td></tr> |
4829 | </table> |
4829 | </table> |
4830 | HTML |
4830 | HTML |
4831 | ; |
4831 | ; |
4832 | print HTML $html_dual_fig; |
4832 | print HTML $html_dual_fig; |
4833 | print HTML2 $html_dual_fig; |
4833 | print HTML2 $html_dual_fig; |
4834 | 4834 | ||
4835 | $tex_caption = tex_caption($caption); |
4835 | $tex_caption = tex_caption($caption); |
4836 | my $tex_dbl_subfig = qq(\\mbox{\\subfigure[\\small $legend1]{$tex_graphics1}\\quad\\subfigure[\\small $legend2]{$tex_graphics2}}); |
4836 | my $tex_dbl_subfig = qq(\\mbox{\\subfigure[\\small $legend1]{$tex_graphics1}\\quad\\subfigure[\\small $legend2]{$tex_graphics2}}); |
4837 | if ($pos =~ /^W(\d+)/) { |
4837 | if ($pos =~ /^W(\d+)/) { |
4838 | print TEX qq(\\begin{floatingfigure}{${1}cm}$tex_dbl_subfig$tex_caption\\vspace{3mm}\\label{fig:$label}\\end{floatingfigure}); |
4838 | print TEX qq(\\begin{floatingfigure}{${1}cm}$tex_dbl_subfig$tex_caption\\vspace{3mm}\\label{fig:$label}\\end{floatingfigure}); |
4839 | } else { |
4839 | } else { |
4840 | print TEX qq(\\begin{figure}[$pos]\\centering$tex_dbl_subfig$tex_caption\\label{fig:$label}\\end{figure}); |
4840 | print TEX qq(\\begin{figure}[$pos]\\centering$tex_dbl_subfig$tex_caption\\label{fig:$label}\\end{figure}); |
4841 | } |
4841 | } |
4842 | } |
4842 | } |
4843 | 4843 | ||
4844 | ### |
4844 | ### |
4845 | ### Preamble and Output phase |
4845 | ### Preamble and Output phase |
4846 | ### |
4846 | ### |
4847 | 4847 | ||
4848 | $cvsid =~ s/\$//g; |
4848 | $cvsid =~ s/\$//g; |
4849 | $dbx_credit = ''; |
4849 | $dbx_credit = ''; |
4850 | for $x (@credits) { |
4850 | for $x (@credits) { |
4851 | next if $x =~ /^\s*$/; |
4851 | next if $x =~ /^\s*$/; |
4852 | $y = dbx_para_raw($x); |
4852 | $y = dbx_para_raw($x); |
4853 | $dbx_credit .= qq(<othercredit><surname>$y</surname></othercredit>\n); |
4853 | $dbx_credit .= qq(<othercredit><surname>$y</surname></othercredit>\n); |
4854 | } |
4854 | } |
4855 | 4855 | ||
4856 | if ($history_ena eq '1:') { |
4856 | if ($history_ena eq '1:') { |
4857 | $dbx_history = '<revhistory>'; |
4857 | $dbx_history = '<revhistory>'; |
4858 | for ($j=0; $j<$#history; $j+=4) { |
4858 | for ($j=0; $j<$#history; $j+=4) { |
4859 | $x = $history[$j+3]; |
4859 | $x = $history[$j+3]; |
4860 | $dbx_revdesc = dbx_para_raw($x); |
4860 | $dbx_revdesc = dbx_para_raw($x); |
4861 | $dbx_revdesc =~ s%^\s+\*%</para><para>%gm; |
4861 | $dbx_revdesc =~ s%^\s+\*%</para><para>%gm; |
4862 | $x = $history[$j+2]; |
4862 | $x = $history[$j+2]; |
4863 | $dbx_auth = dbx_entity_escape($x); # Lib simplified DocBook forbids markup |
4863 | $dbx_auth = dbx_entity_escape($x); # Lib simplified DocBook forbids markup |
4864 | $dbx_history .= <<HISTORY; |
4864 | $dbx_history .= <<HISTORY; |
4865 | <revision> |
4865 | <revision> |
4866 | <revnumber>$history[$j]</revnumber> |
4866 | <revnumber>$history[$j]</revnumber> |
4867 | <date>$history[$j+1]</date> |
4867 | <date>$history[$j+1]</date> |
4868 | <authorinitials>$dbx_auth</authorinitials> |
4868 | <authorinitials>$dbx_auth</authorinitials> |
4869 | <revdescription> |
4869 | <revdescription> |
4870 | <para> |
4870 | <para> |
4871 | $dbx_revdesc |
4871 | $dbx_revdesc |
4872 | </para> |
4872 | </para> |
4873 | </revdescription> |
4873 | </revdescription> |
4874 | </revision> |
4874 | </revision> |
4875 | HISTORY |
4875 | HISTORY |
4876 | ; |
4876 | ; |
4877 | } |
4877 | } |
4878 | $dbx_history =~ s%<para>\s*</para>%%g; |
4878 | $dbx_history =~ s%<para>\s*</para>%%g; |
4879 | $dbx_history .= '</revhistory>'; |
4879 | $dbx_history .= '</revhistory>'; |
4880 | } else { |
4880 | } else { |
4881 | $dbx_history = ''; |
4881 | $dbx_history = ''; |
4882 | } |
4882 | } |
4883 | 4883 | ||
4884 | @dbx_authors = split /(?:,?\s+and\s+)|\n/, $author; |
4884 | @dbx_authors = split /(?:,?\s+and\s+)|\n/, $author; |
4885 | for $a (@dbx_authors) { |
4885 | for $a (@dbx_authors) { |
4886 | $dbx_author .= '<editor><surname>' . dbx_format($a) . "</surname></editor>\n"; |
4886 | $dbx_author .= '<editor><surname>' . dbx_format($a) . "</surname></editor>\n"; |
4887 | } |
4887 | } |
4888 | 4888 | ||
4889 | $author_squash = $author; |
4889 | $author_squash = $author; |
4890 | $author_squash =~ s/ä/a/g; |
4890 | $author_squash =~ s/ä/a/g; |
4891 | 4891 | ||
4892 | #<?xml-stylesheet type="text/xsl" href="../../src/xsl/_html.xsl"?> |
4892 | #<?xml-stylesheet type="text/xsl" href="../../src/xsl/_html.xsl"?> |
4893 | #<affiliation><orgname></orgname></affiliation> |
4893 | #<affiliation><orgname></orgname></affiliation> |
4894 | print DBX <<DBX; |
4894 | print DBX <<DBX; |
4895 | $dbxpreamble |
4895 | $dbxpreamble |
4896 | <!-- WARNING: Do not edit! This file was generated on $curdate from original |
4896 | <!-- WARNING: Do not edit! This file was generated on $curdate from original |
4897 | PlainDoc (.pd) source using pd2tex of Sampo Kellomaki (sampo\@iki.fi). |
4897 | PlainDoc (.pd) source using pd2tex of Sampo Kellomaki (sampo\@iki.fi). |
4898 | All edits to this file will be lost when it is generated next time. --> |
4898 | All edits to this file will be lost when it is generated next time. --> |
4899 | <!-- \$Id\$ --> |
4899 | <!-- \$Id\$ --> |
4900 | <!-- Original id: $cvsid --> |
4900 | <!-- Original id: $cvsid --> |
4901 | <!-- Author: $author_squash --> |
4901 | <!-- Author: $author_squash --> |
4902 | <article id="$sec_id[0]" class="specification" status="draft"> |
4902 | <article id="$sec_id[0]" class="specification" status="draft"> |
4903 | 4903 | ||
4904 | <articleinfo> |
4904 | <articleinfo> |
4905 | <title>$doctitle</title> |
4905 | <title>$doctitle</title> |
4906 | <date>$curdate</date> |
4906 | <date>$curdate</date> |
4907 | <edition role="Version">$version</edition> |
4907 | <edition role="Version">$version</edition> |
4908 | <authorgroup> |
4908 | <authorgroup> |
4909 | $dbx_author |
4909 | $dbx_author |
4910 | $dbx_credit |
4910 | $dbx_credit |
4911 | </authorgroup> |
4911 | </authorgroup> |
4912 | <abstract> |
4912 | <abstract> |
4913 | $dbx_abstract |
4913 | $dbx_abstract |
4914 | </abstract> |
4914 | </abstract> |
4915 | $additionalarticleinfodbx |
4915 | $additionalarticleinfodbx |
4916 | $dbx_history |
4916 | $dbx_history |
4917 | </articleinfo> |
4917 | </articleinfo> |
4918 | DBX |
4918 | DBX |
4919 | ; |
4919 | ; |
4920 | 4920 | ||
4921 | ### See http://latex2rtf.sourceforge.net/RTF-Spec-1.0.txt |
4921 | ### See http://latex2rtf.sourceforge.net/RTF-Spec-1.0.txt |
4922 | # http://www.boumphrey.com/rtf/rtf_tutorial_2.php |
4922 | # http://www.boumphrey.com/rtf/rtf_tutorial_2.php |
4923 | 4923 | ||
4924 | # Preamble and font table: f0 = sans serif, f1 = serif, f2 = monospaced |
4924 | # Preamble and font table: f0 = sans serif, f1 = serif, f2 = monospaced |
4925 | print RTF '{\rtf1 \ansi \deff0 |
4925 | print RTF '{\rtf1 \ansi \deff0 |
4926 | {\fonttbl |
4926 | {\fonttbl |
4927 | {\f0\fRoman Time New Roman;} |
4927 | {\f0\fRoman Time New Roman;} |
4928 | {\f1\fswiss Arial;} |
4928 | {\f1\fswiss Arial;} |
4929 | {\f2\fmodern Courier New;} |
4929 | {\f2\fmodern Courier New;} |
4930 | } |
4930 | } |
4931 | {\stylesheet |
4931 | {\stylesheet |
4932 | '; |
4932 | '; |
4933 | 4933 | ||
4934 | for $k (sort keys %rtf_styles) { |
4934 | for $k (sort keys %rtf_styles) { |
4935 | print RTF "{\\$k $rtf_styles{$k}}\n"; |
4935 | print RTF "{\\$k $rtf_styles{$k}}\n"; |
4936 | $rtf_styles{$k} =~ s/\s+[a-z0-9]+;$//si; # Chop off style name |
4936 | $rtf_styles{$k} =~ s/\s+[a-z0-9]+;$//si; # Chop off style name |
4937 | } |
4937 | } |
4938 | 4938 | ||
4939 | print RTF '} |
4939 | print RTF '} |
4940 | \plain \sa220 \fs24 \widowctrl \hyphauto \qj |
4940 | \plain \sa220 \fs24 \widowctrl \hyphauto \qj |
4941 | 4941 | ||
4942 | {\footer \pard\qc\plain\f22 \chpgn \par} |
4942 | {\footer \pard\qc\plain\f22 \chpgn \par} |
4943 | 4943 | ||
4944 | '; |
4944 | '; |
4945 | print RTF "$rtf_tabs\n"; |
4945 | print RTF "$rtf_tabs\n"; |
4946 | 4946 | ||
4947 | #{\fonttbl{\f0\froman\fprq2\fcharset0 Bitstream Vera Serif;}{\f1\froman\fprq2\fcharset0 Bitstream Vera Serif;}{\f2\fswiss\fprq2\fcharset0 Bitstream Vera Sans;}{\f3\fnil\fprq0\fcharset2 StarSymbol{\*\falt Arial Unicode MS};}{\f4\fnil\fprq2\fcharset0 Bitstream Vera Sans;}{\f5\fnil\fprq2\fcharset0 Mincho{\*\falt msmincho};}{\f6\fnil\fprq2\fcharset0 Lucidasans;}{\f7\fnil\fprq0\fcharset0 Lucidasans;}} |
4947 | #{\fonttbl{\f0\froman\fprq2\fcharset0 Bitstream Vera Serif;}{\f1\froman\fprq2\fcharset0 Bitstream Vera Serif;}{\f2\fswiss\fprq2\fcharset0 Bitstream Vera Sans;}{\f3\fnil\fprq0\fcharset2 StarSymbol{\*\falt Arial Unicode MS};}{\f4\fnil\fprq2\fcharset0 Bitstream Vera Sans;}{\f5\fnil\fprq2\fcharset0 Mincho{\*\falt msmincho};}{\f6\fnil\fprq2\fcharset0 Lucidasans;}{\f7\fnil\fprq0\fcharset0 Lucidasans;}} |
4948 | 4948 | ||
4949 | print RTF '{\stylesheet{\s0\snext0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af4\afs24\lang1081\loch\f0\fs24\lang1033 Normal;} |
4949 | print RTF '{\stylesheet{\s0\snext0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af3\langfe2052\dbch\af4\afs24\lang1081\loch\f0\fs24\lang1033 Normal;} |
4950 | {\s1\sbasedon16\snext17\ilvl0\outlinelevel0\sb240\sa120\keepn\b\hich\af3\dbch\af4\afs32\ab\loch\f2\fs32 Heading 1;} |
4950 | {\s1\sbasedon16\snext17\ilvl0\outlinelevel0\sb240\sa120\keepn\b\hich\af3\dbch\af4\afs32\ab\loch\f2\fs32 Heading 1;} |
4951 | {\s2\sbasedon16\snext17\ilvl1\outlinelevel1\sb240\sa120\keepn\i\b\hich\af3\dbch\af4\afs28\ai\ab\loch\f2\fs28 Heading 2;} |
4951 | {\s2\sbasedon16\snext17\ilvl1\outlinelevel1\sb240\sa120\keepn\i\b\hich\af3\dbch\af4\afs28\ai\ab\loch\f2\fs28 Heading 2;} |
4952 | {\s3\sbasedon16\snext17\ilvl2\outlinelevel2\sb240\sa120\keepn\b\hich\af3\dbch\af4\afs28\ab\loch\f2\fs28 Heading 3;} |
4952 | {\s3\sbasedon16\snext17\ilvl2\outlinelevel2\sb240\sa120\keepn\b\hich\af3\dbch\af4\afs28\ab\loch\f2\fs28 Heading 3;} |
4953 | {\*\cs15\snext15 Numbering Symbols;} |
4953 | {\*\cs15\snext15 Numbering Symbols;} |
4954 | {\s16\sbasedon0\snext17\sb240\sa120\keepn\hich\af3\dbch\af4\afs28\loch\f2\fs28 Heading;} |
4954 | {\s16\sbasedon0\snext17\sb240\sa120\keepn\hich\af3\dbch\af4\afs28\loch\f2\fs28 Heading;} |
4955 | {\s17\sbasedon0\snext17\sb0\sa120 Text body;} |
4955 | {\s17\sbasedon0\snext17\sb0\sa120 Text body;} |
4956 | {\s18\sbasedon17\snext18\sb0\sa120\dbch\af5 List;} |
4956 | {\s18\sbasedon17\snext18\sb0\sa120\dbch\af5 List;} |
4957 | {\s19\sbasedon0\snext19\sb120\sa120\noline\i\dbch\af5\afs24\ai\fs24 Caption;} |
4957 | {\s19\sbasedon0\snext19\sb120\sa120\noline\i\dbch\af5\afs24\ai\fs24 Caption;} |
4958 | {\s20\sbasedon0\snext20\noline\dbch\af5 Index;} |
4958 | {\s20\sbasedon0\snext20\noline\dbch\af5 Index;} |
4959 | {\s21\sbasedon16\snext22\qc\sb240\sa120\keepn\b\hich\af3\dbch\af4\afs36\ab\loch\f2\fs36 Title;} |
4959 | {\s21\sbasedon16\snext22\qc\sb240\sa120\keepn\b\hich\af3\dbch\af4\afs36\ab\loch\f2\fs36 Title;} |
4960 | {\s22\sbasedon16\snext17\qc\sb240\sa120\keepn\i\hich\af3\dbch\af4\afs28\ai\loch\f2\fs28 Subtitle;} |
4960 | {\s22\sbasedon16\snext17\qc\sb240\sa120\keepn\i\hich\af3\dbch\af4\afs28\ai\loch\f2\fs28 Subtitle;} |
4961 | } |
4961 | } |
4962 | ' if 0; |
4962 | ' if 0; |
4963 | 4963 | ||
4964 | # Summary, like title |
4964 | # Summary, like title |
4965 | print RTF "\\ftnbj\n{\\info {\\title $doctitle}{\\author $author}} |
4965 | print RTF "\\ftnbj\n{\\info {\\title $doctitle}{\\author $author}} |
4966 | 4966 | ||
4967 | {\\pard $rtf_styles{'s14'} \\s14\n$doctitle\\par} |
4967 | {\\pard $rtf_styles{'s14'} \\s14\n$doctitle\\par} |
4968 | 4968 | ||
4969 | {\\pard $rtf_styles{'s15'} \\s15\n$author\\par} |
4969 | {\\pard $rtf_styles{'s15'} \\s15\n$author\\par} |
4970 | 4970 | ||
4971 | {\\pard $rtf_styles{'s16'} \\s16\n$rtf_abstract\\par}"; |
4971 | {\\pard $rtf_styles{'s16'} \\s16\n$rtf_abstract\\par}"; |
4972 | 4972 | ||
4973 | print NONL "$doctitle\n\n"; |
4973 | print NONL "$doctitle\n\n"; |
4974 | print PDSEAL "$doctitle\n\n"; |
4974 | print PDSEAL "$doctitle\n\n"; |
4975 | print NONL "$author\n\n" if $author && $author ne 'N.N.'; |
4975 | print NONL "$author\n\n" if $author && $author ne 'N.N.'; |
4976 | print PDSEAL "$author\n\n" if $author && $author ne 'N.N.'; |
4976 | print PDSEAL "$author\n\n" if $author && $author ne 'N.N.'; |
4977 | if ($nonl_abstract) { |
4977 | if ($nonl_abstract) { |
4978 | $nonl_abstract =~ s/\r?\n\r?\n/<<PAR>>/g; |
4978 | $nonl_abstract =~ s/\r?\n\r?\n/<<PAR>>/g; |
4979 | $nonl_abstract =~ s/\s*\r?\n/ /g; |
4979 | $nonl_abstract =~ s/\s*\r?\n/ /g; |
4980 | $nonl_abstract =~ s/<<PAR>>/\n\n/g; |
4980 | $nonl_abstract =~ s/<<PAR>>/\n\n/g; |
4981 | print NONL "$nonl_abstract\n\n"; |
4981 | print NONL "$nonl_abstract\n\n"; |
4982 | print PDSEAL "$nonl_abstract\n\n"; |
4982 | print PDSEAL "$nonl_abstract\n\n"; |
4983 | } |
4983 | } |
4984 | 4984 | ||
4985 | ### |
4985 | ### |
4986 | 4986 | ||
4987 | #warn "doctitle($doctitle)"; |
4987 | #warn "doctitle($doctitle)"; |
4988 | #<meta http-equiv="Content-type" content="text/html; charset=utf-8"> |
4988 | #<meta http-equiv="Content-type" content="text/html; charset=utf-8"> |
4989 | 4989 | ||
4990 | print HTML $htmlpreamble ? $htmlpreamble : <<HTML unless $nohtmlpreamb; |
4990 | print HTML $htmlpreamble ? $htmlpreamble : <<HTML unless $nohtmlpreamb; |
4991 | <title>$doctitle</title> |
4991 | <title>$doctitle</title> |
4992 | <link type="text/css" rel="stylesheet" href="$base.css"> |
4992 | <link type="text/css" rel="stylesheet" href="$base.css"> |
4993 | <body bgcolor=white> |
4993 | <body bgcolor=white> |
4994 | <H1>$doctitle</H1> |
4994 | <H1>$doctitle</H1> |
4995 | HTML |
4995 | HTML |
4996 | ; |
4996 | ; |
4997 | 4997 | ||
4998 | print HTML2 <<HTML unless $nohtmlpreamb; |
4998 | print HTML2 <<HTML unless $nohtmlpreamb; |
4999 | <title>$doctitle</title> |
4999 | <title>$doctitle</title> |
5000 | <body bgcolor=white> |
5000 | <body bgcolor=white> |
5001 | <link type="text/css" rel="stylesheet" href="$base.css"> |
5001 | <link type="text/css" rel="stylesheet" href="$base.css"> |
5002 | <H1>$doctitle</H1> |
5002 | <H1>$doctitle</H1> |
5003 | HTML |
5003 | HTML |
5004 | ; |
5004 | ; |
5005 | 5005 | ||
5006 | if ($author && $author ne 'N.N.') { |
5006 | if ($author && $author ne 'N.N.') { |
5007 | $html_author = html_format($author); |
5007 | $html_author = html_format($author); |
5008 | print HTML "<i>$html_author</i>\n"; |
5008 | print HTML "<i>$html_author</i>\n"; |
5009 | print HTML2 "<i>$html_author</i>\n"; |
5009 | print HTML2 "<i>$html_author</i>\n"; |
5010 | } |
5010 | } |
5011 | 5011 | ||
5012 | if ($abstract) { |
5012 | if ($abstract) { |
5013 | print HTML "<blockquote>$html_abstract</blockquote>\n"; |
5013 | print HTML "<blockquote>$html_abstract</blockquote>\n"; |
5014 | print HTML2 "<blockquote>$html_abstract</blockquote>\n"; |
5014 | print HTML2 "<blockquote>$html_abstract</blockquote>\n"; |
5015 | } |
5015 | } |
5016 | 5016 | ||
5017 | # See also: \overlay{image} for background image, or \background{color}, or \emblema{logoimg} |
5017 | # See also: \overlay{image} for background image, or \background{color}, or \emblema{logoimg} |
5018 | # in pdfscreen section (sec 4.8, p. 80 of lshort.pdf). |
5018 | # in pdfscreen section (sec 4.8, p. 80 of lshort.pdf). |
5019 | 5019 | ||
5020 | #$tex_1st = tex_para($first_page); |
5020 | #$tex_1st = tex_para($first_page); |
5021 | #warn "###".$first_page."###\n"; |
5021 | #warn "###".$first_page."###\n"; |
5022 | #warn "###".$tex_1st."###\n"; |
5022 | #warn "###".$tex_1st."###\n"; |
5023 | 5023 | ||
5024 | if ($makeindex) { |
5024 | if ($makeindex) { |
5025 | $tex_index = ($makeindex == 2) ? "\\usepackage{makeidx,showidx}" : "\\usepackage{makeidx}"; |
5025 | $tex_index = ($makeindex == 2) ? "\\usepackage{makeidx,showidx}" : "\\usepackage{makeidx}"; |
5026 | $tex_index .= "\n\\makeindex\n"; |
5026 | $tex_index .= "\n\\makeindex\n"; |
5027 | } |
5027 | } |
5028 | 5028 | ||
5029 | # N.B. Add \\hbadness=10000 to disable 90% of the warnings |
5029 | # N.B. Add \\hbadness=10000 to disable 90% of the warnings |
5030 | 5030 | ||
5031 | print TEX <<LATEX; |
5031 | print TEX <<LATEX; |
5032 | % Generated on $curdate using pd2tex of Sampo Kellomaki (sampo\@iki.fi) |
5032 | % Generated on $curdate using pd2tex of Sampo Kellomaki (sampo\@iki.fi) |
5033 | % Do not edit this file: your changes will be lost next time this is regenerated. |
5033 | % Do not edit this file: your changes will be lost next time this is regenerated. |
5034 | LATEX |
5034 | LATEX |
5035 | ; |
5035 | ; |
5036 | 5036 | ||
5037 | # If the $moremoretexpreamble wants to use the enumitem package, then |
5037 | # If the $moremoretexpreamble wants to use the enumitem package, then |
5038 | # the enumerate must get used after that (must be done in $moremoretexpreamble). |
5038 | # the enumerate must get used after that (must be done in $moremoretexpreamble). |
5039 | # Thus we need to prevent premature use of enumerate here. |
5039 | # Thus we need to prevent premature use of enumerate here. |
5040 | $usepackage_enumerate = '\\usepackage{enumerate}' |
5040 | $usepackage_enumerate = '\\usepackage{enumerate}' |
5041 | unless $moremoretexpreamble =~ /\\usepackage\{enumerate\}/; |
5041 | unless $moremoretexpreamble =~ /\\usepackage\{enumerate\}/; |
5042 | 5042 | ||
5043 | print TEX $texpreamble ? $texpreamble : <<LATEX; |
5043 | print TEX $texpreamble ? $texpreamble : <<LATEX; |
5044 | $tex_doc_class |
5044 | $tex_doc_class |
5045 | \\usepackage{floatflt} |
5045 | \\usepackage{floatflt} |
5046 | \\usepackage{pslatex} |
5046 | \\usepackage{pslatex} |
5047 | \\usepackage[T1]{fontenc} |
5047 | \\usepackage[T1]{fontenc} |
5048 | \\usepackage[latin1]{inputenc} |
5048 | \\usepackage[latin1]{inputenc} |
5049 | $usepackage_enumerate |
5049 | $usepackage_enumerate |
5050 | \\usepackage{amssymb} |
5050 | \\usepackage{amssymb} |
5051 | \\usepackage{subfigure} |
5051 | \\usepackage{subfigure} |
5052 | $lineno |
5052 | $lineno |
5053 | \\usepackage{longtable} |
5053 | \\usepackage{longtable} |
5054 | \\usepackage[bookmarks=true,bookmarksnumbered=true,pdftex]{hyperref} |
5054 | \\usepackage[bookmarks=true,bookmarksnumbered=true,pdftex]{hyperref} |
5055 | \\usepackage{supertabular,lscape} % fjon |
5055 | \\usepackage{supertabular,lscape} % fjon |
5056 | \\usepackage{fancyvrb} % fjon |
5056 | \\usepackage{fancyvrb} % fjon |
5057 | $vmargin |
5057 | $vmargin |
5058 | $pagestyle |
5058 | $pagestyle |
5059 | \\usepackage[pdftex]{color,graphicx} |
5059 | \\usepackage[pdftex]{color,graphicx} |
5060 | \\pdfpagewidth=\\paperwidth |
5060 | \\pdfpagewidth=\\paperwidth |
5061 | \\pdfpageheight=\\paperheight |
5061 | \\pdfpageheight=\\paperheight |
5062 | \\hbadness=$hbadness |
5062 | \\hbadness=$hbadness |
5063 | \\newcommand{\\hifen}{\\discretionary{-}{-}{-}} |
5063 | \\newcommand{\\hifen}{\\discretionary{-}{-}{-}} |
5064 | $tex_index |
5064 | $tex_index |
5065 | \\author{$author} |
5065 | \\author{$author} |
5066 | \\title{$doctitle} |
5066 | \\title{$doctitle} |
5067 | $moretexpreamble |
5067 | $moretexpreamble |
5068 | $linespace |
5068 | $linespace |
5069 | $moremoretexpreamble |
5069 | $moremoretexpreamble |
5070 | \\begin{document} |
5070 | \\begin{document} |
5071 | $maketitle |
5071 | $maketitle |
5072 | LATEX |
5072 | LATEX |
5073 | ; |
5073 | ; |
5074 | 5074 | ||
5075 | print TEX "\\begin{slide}\n" if $class eq 'slide'; |
5075 | print TEX "\\begin{slide}\n" if $class eq 'slide'; |
5076 | 5076 | ||
5077 | sec(); # recursively processes the entire document |
5077 | sec(); # recursively processes the entire document |
5078 | 5078 | ||
5079 | print DBX qq(</article>\n); |
5079 | print DBX qq(</article>\n); |
5080 | print RTF "}"; |
5080 | print RTF "}"; |
5081 | print TEX "\\end{slide}\n" if $class eq 'slide'; |
5081 | print TEX "\\end{slide}\n" if $class eq 'slide'; |
5082 | print TEX qq(\\end{document}\n); |
5082 | print TEX qq(\\end{document}\n); |
5083 | close TEX; |
5083 | close TEX; |
5084 | close DBX; |
5084 | close DBX; |
5085 | close RTF; |
5085 | close RTF; |
5086 | 5086 | ||
5087 | $amb = $htmlpostamble; |
5087 | $amb = $htmlpostamble; |
5088 | $amb =~ s/!\?!TITLE/$doctitle: $sec_no$x/gs; |
5088 | $amb =~ s/!\?!TITLE/$doctitle: $sec_no$x/gs; |
5089 | $amb =~ s/!\?!BASE/$base/gs; |
5089 | $amb =~ s/!\?!BASE/$base/gs; |
5090 | $amb =~ s/!\?!PREV/$prevprev/gs; |
5090 | $amb =~ s/!\?!PREV/$prevprev/gs; |
5091 | $amb =~ s/!\?!NEXT/$html2/gs; |
5091 | $amb =~ s/!\?!NEXT/$html2/gs; |
5092 | print HTML $amb; |
5092 | print HTML $amb; |
5093 | close HTML; |
5093 | close HTML; |
5094 | 5094 | ||
5095 | $amb = $htmlpostamble2; |
5095 | $amb = $htmlpostamble2; |
5096 | $amb =~ s/!\?!TITLE/$doctitle: $sec_no$x/gs; |
5096 | $amb =~ s/!\?!TITLE/$doctitle: $sec_no$x/gs; |
5097 | $amb =~ s/!\?!BASE/$base/gs; |
5097 | $amb =~ s/!\?!BASE/$base/gs; |
5098 | $amb =~ s/!\?!PREV/$prevprev/gs; |
5098 | $amb =~ s/!\?!PREV/$prevprev/gs; |
5099 | $amb =~ s/!\?!NEXT/$html2/gs; |
5099 | $amb =~ s/!\?!NEXT/$html2/gs; |
5100 | print HTML2 $amb; |
5100 | print HTML2 $amb; |
5101 | close HTML2; |
5101 | close HTML2; |
5102 | 5102 | ||
5103 | @months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); |
5103 | @months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); |
5104 | @weekDays = qw(Sun Mon Tue Wed Thu Fri Sat Sun); |
5104 | @weekDays = qw(Sun Mon Tue Wed Thu Fri Sat Sun); |
5105 | ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek) = localtime(); |
5105 | ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek) = localtime(); |
5106 | $year = 1900 + $yearOffset; |
5106 | $year = 1900 + $yearOffset; |
5107 | $today = "$months[$month] $dayOfMonth, $year"; |
5107 | $today = "$months[$month] $dayOfMonth, $year"; |
5108 | # $today = join(' ', @today); |
5108 | # $today = join(' ', @today); |
5109 | 5109 | ||
5110 | if ($html1) { # ToC for monolith document |
5110 | if ($html1) { # ToC for monolith document |
5111 | open HTML, ">$htmldir$base-toc1.html" or die "Can't open $htmldir$base-toc1.html for writing: $!"; |
5111 | open HTML, ">$htmldir$base-toc1.html" or die "Can't open $htmldir$base-toc1.html for writing: $!"; |
5112 | warn "Writing $htmldir$base-toc1.html"; |
5112 | warn "Writing $htmldir$base-toc1.html"; |
5113 | print HTML <<HTML; |
5113 | print HTML <<HTML; |
5114 | <title>$doctitle TOC</title> |
5114 | <title>$doctitle TOC</title> |
5115 | <link type="text/css" rel="stylesheet" href="$base.css"> |
5115 | <link type="text/css" rel="stylesheet" href="$base.css"> |
5116 | <body bgcolor=white> |
5116 | <body bgcolor=white> |
5117 | <H1>$doctitle</H1> |
5117 | <H1>$doctitle</H1> |
5118 | $today<br><br> |
5118 | $today<br><br> |
5119 | <a href="$base.pdf" target="_top">Download as pdf</a><br> |
5119 | <a href="$base.pdf" target="_top">Download as pdf</a><br> |
5120 | <a href="index1.html" target="_top">Multi page</a> |
5120 | <a href="index1.html" target="_top">Multi page</a> |
5121 | <H3>Table of Contents (monolithic)</H3> |
5121 | <H3>Table of Contents (monolithic)</H3> |
5122 | HTML |
5122 | HTML |
5123 | ; |
5123 | ; |
5124 | for ($i = 0; $i <= $#html_toc_title; ++$i) { |
5124 | for ($i = 0; $i <= $#html_toc_title; ++$i) { |
5125 | print HTML qq(<a href="$html1\#$html_toc_link[$i]" target=c>$html_toc_title[$i]</a><br>\n); |
5125 | print HTML qq(<a href="$html1\#$html_toc_link[$i]" target=c>$html_toc_title[$i]</a><br>\n); |
5126 | } |
5126 | } |
5127 | close HTML; |
5127 | close HTML; |
5128 | } |
5128 | } |
5129 | 5129 | ||
5130 | if ($html2) { # ToC for multipage document |
5130 | if ($html2) { # ToC for multipage document |
5131 | open HTML2, ">$htmldir$base-toc.html" or die "Can't open $htmldir$base-toc.html for writing: $!"; |
5131 | open HTML2, ">$htmldir$base-toc.html" or die "Can't open $htmldir$base-toc.html for writing: $!"; |
5132 | warn "Writing $htmldir$base-toc.html"; |
5132 | warn "Writing $htmldir$base-toc.html"; |
5133 | print HTML2 <<HTML2; |
5133 | print HTML2 <<HTML2; |
5134 | <title>$doctitle TOC</title> |
5134 | <title>$doctitle TOC</title> |
5135 | <link type="text/css" rel="stylesheet" href="$base.css"> |
5135 | <link type="text/css" rel="stylesheet" href="$base.css"> |
5136 | <body bgcolor=white> |
5136 | <body bgcolor=white> |
5137 | <H1>$doctitle</H1> |
5137 | <H1>$doctitle</H1> |
5138 | $today<br><br> |
5138 | $today<br><br> |
5139 | <a href="$base.pdf" target="_top">Download as pdf</a><br> |
5139 | <a href="$base.pdf" target="_top">Download as pdf</a><br> |
5140 | <a href="index.html" target="_top">Single page</a> |
5140 | <a href="index.html" target="_top">Single page</a> |
5141 | <H3>Table of Contents</H3> |
5141 | <H3>Table of Contents</H3> |
5142 | HTML2 |
5142 | HTML2 |
5143 | ; |
5143 | ; |
5144 | for ($i = 0; $i <= $#html_toc_title; ++$i) { |
5144 | for ($i = 0; $i <= $#html_toc_title; ++$i) { |
5145 | print HTML2 qq(<a href="$html2_toc_link[$i]" target=c>$html_toc_title[$i]</a><br>\n); |
5145 | print HTML2 qq(<a href="$html2_toc_link[$i]" target=c>$html_toc_title[$i]</a><br>\n); |
5146 | } |
5146 | } |
5147 | close HTML2; |
5147 | close HTML2; |
5148 | } |
5148 | } |
5149 | 5149 | ||
5150 | ### |
5150 | ### |
5151 | ### Recommended stylesheet (if you do not have one, one will be created for you) |
5151 | ### Recommended stylesheet (if you do not have one, one will be created for you) |
5152 | ### |
5152 | ### |
5153 | 5153 | ||
5154 | $css = <<CSS |
5154 | $css = <<CSS |
5155 | BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV { |
5155 | BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV { |
5156 | font-family: Geneva, Arial, Helvetica, sans-serif; |
5156 | font-family: Geneva, Arial, Helvetica, sans-serif; |
5157 | } |
5157 | } |
5158 | BODY,TD { |
5158 | BODY,TD { |
5159 | font-size: 100%; |
5159 | font-size: 100%; |
5160 | } |
5160 | } |
5161 | BODY { |
5161 | BODY { |
5162 | background-color: white; |
5162 | background-color: white; |
5163 | color: black; |
5163 | color: black; |
5164 | margin-right: 20px; |
5164 | margin-right: 20px; |
5165 | margin-left: 20px; |
5165 | margin-left: 20px; |
5166 | } |
5166 | } |
5167 | H1 { |
5167 | H1 { |
5168 | text-align: left; |
5168 | text-align: left; |
5169 | font-size: 160%; |
5169 | font-size: 160%; |
5170 | } |
5170 | } |
5171 | H2 { font-size: 120%; } |
5171 | H2 { font-size: 120%; } |
5172 | H3 { font-size: 100%; } |
5172 | H3 { font-size: 100%; } |
5173 | PRE { |
5173 | PRE { |
5174 | border: 1px solid #CCCCCC; |
5174 | border: 1px solid #CCCCCC; |
5175 | background-color: #f5f5f5; |
5175 | background-color: #f5f5f5; |
5176 | padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px; |
5176 | padding-top: 4px; padding-bottom: 4px; padding-left: 6px; padding-right: 6px; |
5177 | margin-top: 4px; margin-bottom: 4px; margin-left: 2px; margin-right: 8px; |
5177 | margin-top: 4px; margin-bottom: 4px; margin-left: 2px; margin-right: 8px; |
5178 | } |
5178 | } |
5179 | a { |
5179 | a { |
5180 | color: #1A41A8; |
5180 | color: #1A41A8; |
5181 | } |
5181 | } |
5182 | a:visited { |
5182 | a:visited { |
5183 | color: #2A3798; |
5183 | color: #2A3798; |
5184 | } |
5184 | } |
5185 | HR { height: 1px; |
5185 | HR { height: 1px; |
5186 | border: none; |
5186 | border: none; |
5187 | border-top: 1px solid black; |
5187 | border-top: 1px solid black; |
5188 | } |
5188 | } |
5189 | 5189 | ||
5190 | TH { |
5190 | TH { |
5191 | background-color: #C0C0CA; |
5191 | background-color: #C0C0CA; |
5192 | text-align : left; |
5192 | text-align : left; |
5193 | vertical-align : bottom; |
5193 | vertical-align : bottom; |
5194 | font-weight : bold; |
5194 | font-weight : bold; |
5195 | padding-top: 2px; padding-bottom: 2px; padding-left: 10px; padding-right: 10px; |
5195 | padding-top: 2px; padding-bottom: 2px; padding-left: 10px; padding-right: 10px; |
5196 | margin-top: 2px; margin-bottom: 2px; margin-left: 0px; margin-right: 0px; |
5196 | margin-top: 2px; margin-bottom: 2px; margin-left: 0px; margin-right: 0px; |
5197 | border: 1px solid #CCCCCC; |
5197 | border: 1px solid #CCCCCC; |
5198 | } |
5198 | } |
5199 | TD { |
5199 | TD { |
5200 | background-color: #e8eef2; |
5200 | background-color: #e8eef2; |
5201 | padding-top: 2px; padding-bottom: 2px; padding-left: 10px; padding-right: 10px; |
5201 | padding-top: 2px; padding-bottom: 2px; padding-left: 10px; padding-right: 10px; |
5202 | margin-top: 2px; margin-bottom: 2px; margin-left: 0px; margin-right: 0px; |
5202 | margin-top: 2px; margin-bottom: 2px; margin-left: 0px; margin-right: 0px; |
5203 | border: 1px solid #CCCCCC; |
5203 | border: 1px solid #CCCCCC; |
5204 | } |
5204 | } |
5205 | TD.eqn { |
5205 | TD.eqn { |
5206 | background-color: white; |
5206 | background-color: white; |
5207 | vertical-align : middle; |
5207 | vertical-align : middle; |
5208 | padding-top: 2px; padding-bottom: 2px; padding-left: 10px; padding-right: 10px; |
5208 | padding-top: 2px; padding-bottom: 2px; padding-left: 10px; padding-right: 10px; |
5209 | margin-top: 2px; margin-bottom: 2px; margin-left: 0px; margin-right: 0px; |
5209 | margin-top: 2px; margin-bottom: 2px; margin-left: 0px; margin-right: 0px; |
5210 | border: 0px solid white; |
5210 | border: 0px solid white; |
5211 | } |
5211 | } |
5212 | CSS |
5212 | CSS |
5213 | ; |
5213 | ; |
5214 | 5214 | ||
5215 | if(!-f "$htmldir$base.css") { |
5215 | if(!-f "$htmldir$base.css") { |
5216 | open (CSS,">$htmldir$base.css") or die "Can't open $htmldir$base.css for write:$!"; |
5216 | open (CSS,">$htmldir$base.css") or die "Can't open $htmldir$base.css for write:$!"; |
5217 | warn "Writing $htmldir$base.css"; |
5217 | warn "Writing $htmldir$base.css"; |
5218 | print CSS $css; |
5218 | print CSS $css; |
5219 | close CSS; |
5219 | close CSS; |
5220 | } |
5220 | } |
5221 | 5221 | ||
5222 | ### |
5222 | ### |
5223 | ### Create HTML index and framesets as expected |
5223 | ### Create HTML index and framesets as expected |
5224 | ### |
5224 | ### |
5225 | 5225 | ||
5226 | if (!-f "${htmldir}index1.html") { |
5226 | if (!-f "${htmldir}index1.html") { |
5227 | open(HTML,">${htmldir}index1.html") or die "Can't open(${htmldir}index1.html) for write:$!"; |
5227 | open(HTML,">${htmldir}index1.html") or die "Can't open(${htmldir}index1.html) for write:$!"; |
5228 | warn "Writing ${htmldir}index1.html"; |
5228 | warn "Writing ${htmldir}index1.html"; |
5229 | print HTML <<HTML; |
5229 | print HTML <<HTML; |
5230 | <title>$doctitle</title> |
5230 | <title>$doctitle</title> |
5231 | <frameset cols="300,*"> |
5231 | <frameset cols="300,*"> |
5232 | <frame name=toc src="$base-toc.html"> |
5232 | <frame name=toc src="$base-toc.html"> |
5233 | <frame name=c src="$base-front-matter.html"> |
5233 | <frame name=c src="$base-front-matter.html"> |
5234 | </frameset> |
5234 | </frameset> |
5235 | HTML |
5235 | HTML |
5236 | ; |
5236 | ; |
5237 | close HTML; |
5237 | close HTML; |
5238 | } |
5238 | } |
5239 | 5239 | ||
5240 | if (!-f "${htmldir}index.html") { |
5240 | if (!-f "${htmldir}index.html") { |
5241 | open(HTML,">${htmldir}index.html") or die "Can't open(${htmldir}index.html) for write:$!"; |
5241 | open(HTML,">${htmldir}index.html") or die "Can't open(${htmldir}index.html) for write:$!"; |
5242 | warn "Writing ${htmldir}index.html"; |
5242 | warn "Writing ${htmldir}index.html"; |
5243 | print HTML "<title>$doctitle</title>\n". |
5243 | print HTML "<title>$doctitle</title>\n". |
5244 | "<frameset cols=\"300,*\">\n". |
5244 | "<frameset cols=\"300,*\">\n". |
5245 | "<frame name=toc src=\"$base-toc1.html\">\n". |
5245 | "<frame name=toc src=\"$base-toc1.html\">\n". |
5246 | "<frame name=c src=\"$base.html\">". |
5246 | "<frame name=c src=\"$base.html\">". |
5247 | "</frameset>\n"; |
5247 | "</frameset>\n"; |
5248 | close HTML; |
5248 | close HTML; |
5249 | } |
5249 | } |
5250 | 5250 | ||
5251 | if ($pipemode) { |
5251 | if ($pipemode) { |
5252 | warn "Waiting for pdflatex process (pid $texpid) to complete.\n"; |
5252 | warn "Waiting for pdflatex process (pid $texpid) to complete.\n"; |
5253 | waitpid $texpid,0; |
5253 | waitpid $texpid,0; |
5254 | if ($?) { |
5254 | if ($?) { |
5255 | warn "### pdflatex error. Exit value=".($? >> 8).", sig=".($? & 0x7f).".\n"; |
5255 | warn "### pdflatex error. Exit value=".($? >> 8).", sig=".($? & 0x7f).".\n"; |
5256 | } else { |
5256 | } else { |
5257 | warn "--- pdflatex completed with success.\n"; |
5257 | warn "--- pdflatex completed with success.\n"; |
5258 | } |
5258 | } |
5259 | } |
5259 | } |
5260 | 5260 | ||
5261 | warn "Total figures: $n_images\nFigures in last chapter: $cap_n_images\n"; |
5261 | warn "Total figures: $n_images\nFigures in last chapter: $cap_n_images\n"; |
5262 | 5262 | ||
5263 | exit if $nopdf; |
5263 | exit if $nopdf; |
5264 | 5264 | ||
5265 | ### Post processing to generate the pdf document |
5265 | ### Post processing to generate the pdf document |
5266 | 5266 | ||
5267 | # *** need to check and process picture dependencies here! |
5267 | # *** need to check and process picture dependencies here! |
5268 | 5268 | ||
5269 | resolve_file_tex("$texdir$base.tex") unless $notex; |
5269 | resolve_file_tex("$texdir$base.tex") unless $notex; |
5270 | 5270 | ||
5271 | chdir $texdir; |
5271 | chdir $texdir; |
5272 | unless ($dryrun || $pipemode) { |
5272 | unless ($dryrun || $pipemode) { |
5273 | warn "pdflatex -file-line-error-style $base.tex"; |
5273 | warn "pdflatex -file-line-error-style $base.tex"; |
5274 | system ('pdflatex', '-file-line-error-style', "$base.tex"); |
5274 | system ('pdflatex', '-file-line-error-style', "$base.tex"); |
5275 | system ("cp $base.pdf ../$htmldir"); # fjon |
5275 | system ("cp $base.pdf ../$htmldir"); # fjon |
5276 | ##system ("mv $base.pdf .."); # fjon |
5276 | ##system ("mv $base.pdf .."); # fjon |
5277 | #system('latex', "../$base.tex"); # fjon |
5277 | #system('latex', "../$base.tex"); # fjon |
5278 | #system('dvipdf', "$base.dvi", "../$base.pdf"); # fjon |
5278 | #system('dvipdf', "$base.dvi", "../$base.pdf"); # fjon |
5279 | 5279 | ||
5280 | if ($makeindex) { |
5280 | if ($makeindex) { |
5281 | # Fix spurious whitespace in formatted index entries generated from table |
5281 | # Fix spurious whitespace in formatted index entries generated from table |
5282 | $idx = readall("$base.idx"); |
5282 | $idx = readall("$base.idx"); |
5283 | $idx =~ s/\@\\((emph)|(texttt)|(textbf))\s+\{/\@\\$1\{/g; |
5283 | $idx =~ s/\@\\((emph)|(texttt)|(textbf))\s+\{/\@\\$1\{/g; |
5284 | writeall("$base.idx", $idx); |
5284 | writeall("$base.idx", $idx); |
5285 | system ('makeindex', '-q', "$base.idx"); |
5285 | system ('makeindex', '-q', "$base.idx"); |
5286 | } |
5286 | } |
5287 | } |
5287 | } |
5288 | system ('acroread', "$base.pdf") if $acroread; |
5288 | system ('acroread', "$base.pdf") if $acroread; |
5289 | chdir '..'; # so further post processing will work! (fjon) |
5289 | chdir '..'; # so further post processing will work! (fjon) |
5290 | 5290 | ||
5291 | ### Post process: Resolve references in html files |
5291 | ### Post process: Resolve references in html files |
5292 | unless ($nohtml || $noref) { |
5292 | unless ($nohtml || $noref) { |
5293 | warn "\nResolving html references\n-------------------------\n"; |
5293 | warn "\nResolving html references\n-------------------------\n"; |
5294 | resolve_file_html("$htmldir$base.html", 0); |
5294 | resolve_file_html("$htmldir$base.html", 0); |
5295 | for (<${htmldir}*.html>) { |
5295 | for (<${htmldir}*.html>) { |
5296 | resolve_file_html($_, 1); |
5296 | resolve_file_html($_, 1); |
5297 | } |
5297 | } |
5298 | } |
5298 | } |
5299 | 5299 | ||
5300 | ### |
5300 | ### |
5301 | ### Functions to resolve references (from fjon) |
5301 | ### Functions to resolve references (from fjon) |
5302 | ### |
5302 | ### |
5303 | 5303 | ||
5304 | sub resolve_ref { |
5304 | sub resolve_ref { |
5305 | my ($ref, $see_caption, $quiet) = @_; |
5305 | my ($ref, $see_caption, $quiet) = @_; |
5306 | my($caption, $found, $page, $key, $value); |
5306 | my($caption, $found, $page, $key, $value); |
5307 | 5307 | ||
5308 | $ref = fold_label($ref); |
5308 | $ref = fold_label($ref); |
5309 | $page = ""; |
5309 | $page = ""; |
5310 | if ($reflist{$ref}) { |
5310 | if ($reflist{$ref}) { |
5311 | $caption = $reflist{$ref}; |
5311 | $caption = $reflist{$ref}; |
5312 | $page = $refhtmlpage{$ref}; |
5312 | $page = $refhtmlpage{$ref}; |
5313 | } else { |
5313 | } else { |
5314 | $found = 0; |
5314 | $found = 0; |
5315 | while (($key, $value) = each(%reflist)) { |
5315 | while (($key, $value) = each(%reflist)) { |
5316 | if($key =~ "$ref"){ |
5316 | if($key =~ "$ref"){ |
5317 | ++$found; |
5317 | ++$found; |
5318 | if ($found == 1){ |
5318 | if ($found == 1){ |
5319 | warn "Note: Not exact reference. '$ref' match '$key'" if !$quiet; |
5319 | warn "Note: Not exact reference. '$ref' match '$key'" if !$quiet; |
5320 | $ref = $key; |
5320 | $ref = $key; |
5321 | $caption = $value; |
5321 | $caption = $value; |
5322 | $page = $refhtmlpage{$ref}; |
5322 | $page = $refhtmlpage{$ref}; |
5323 | } else { |
5323 | } else { |
5324 | warn "Error: Ambigous reference. '$ref' also match '$key'" if !$quiet; |
5324 | warn "Error: Ambigous reference. '$ref' also match '$key'" if !$quiet; |
5325 | } |
5325 | } |
5326 | } |
5326 | } |
5327 | } |
5327 | } |
5328 | 5328 | ||
5329 | if (!$found) { |
5329 | if (!$found) { |
5330 | warn "Error: Missing reference:$ref" if !$quiet; |
5330 | warn "Error: Missing reference:$ref" if !$quiet; |
5331 | $caption = "?$ref?"; |
5331 | $caption = "?$ref?"; |
5332 | } |
5332 | } |
5333 | } |
5333 | } |
5334 | return ($ref, $see_caption || $caption, $page); |
5334 | return ($ref, $see_caption || $caption, $page); |
5335 | } |
5335 | } |
5336 | 5336 | ||
5337 | sub format_ref_html { |
5337 | sub format_ref_html { |
5338 | my ($guess, $caption, $quiet) = @_; |
5338 | my ($guess, $caption, $quiet) = @_; |
5339 | my ($ref, $caption, $page) = resolve_ref($guess, $caption, $quiet); |
5339 | my ($ref, $caption, $page) = resolve_ref($guess, $caption, $quiet); |
5340 | if ($quiet) { |
5340 | if ($quiet) { |
5341 | return "<a href=\"$page#$ref\">$caption</a>"; |
5341 | return "<a href=\"$page#$ref\">$caption</a>"; |
5342 | } else { |
5342 | } else { |
5343 | return "<a href=\"#$ref\">$caption</a>"; |
5343 | return "<a href=\"#$ref\">$caption</a>"; |
5344 | } |
5344 | } |
5345 | } |
5345 | } |
5346 | 5346 | ||
5347 | sub resolve_file_html { |
5347 | sub resolve_file_html { |
5348 | my($filename, $quiet) = @_; |
5348 | my($filename, $quiet) = @_; |
5349 | 5349 | ||
5350 | open F, $filename or die "Can not read($filename)"; |
5350 | open F, $filename or die "Can not read($filename)"; |
5351 | my($x) = <F>; |
5351 | my($x) = <F>; |
5352 | close F; |
5352 | close F; |
5353 | 5353 | ||
5354 | #Resolve links |
5354 | #Resolve links |
5355 | $x =~ s/<see:\?:\s*([^>]+?)(?:=([^>]*))?>/format_ref_html($1, $2, $quiet)/gse; |
5355 | $x =~ s/<see:\?:\s*([^>]+?)(?:=([^>]*))?>/format_ref_html($1, $2, $quiet)/gse; |
5356 | 5356 | ||
5357 | #Print errors |
5357 | #Print errors |
5358 | if ($quiet) { |
5358 | if ($quiet) { |
5359 | $x =~ s/<error:\s*([^>]+)>//gse; |
5359 | $x =~ s/<error:\s*([^>]+)>//gse; |
5360 | } else { |
5360 | } else { |
5361 | $x =~ s/<error:\s*([^>]+)>/print "Error: $1\n"/gse; |
5361 | $x =~ s/<error:\s*([^>]+)>/print "Error: $1\n"/gse; |
5362 | } |
5362 | } |
5363 | writeall($filename, $x); |
5363 | writeall($filename, $x); |
5364 | } |
5364 | } |
5365 | 5365 | ||
5366 | # Reference resolution pass. Read in almost ready file and fix references, then write it out! |
5366 | # Reference resolution pass. Read in almost ready file and fix references, then write it out! |
5367 | 5367 | ||
5368 | sub format_ref_tex { |
5368 | sub format_ref_tex { |
5369 | my ($see, $see_caption) = @_; |
5369 | my ($see, $see_caption) = @_; |
5370 | my ($ref, $caption) = resolve_ref($see, $caption, 1); |
5370 | my ($ref, $caption) = resolve_ref($see, $caption, 1); |
5371 | warn "see($see:$ref:$caption)"; |
5371 | warn "see($see:$ref:$caption)"; |
5372 | return "$see_caption\\ref{$ref}"; |
5372 | return "$see_caption\\ref{$ref}"; |
5373 | } |
5373 | } |
5374 | 5374 | ||
5375 | sub resolve_file_tex { |
5375 | sub resolve_file_tex { |
5376 | my($filename) = @_; |
5376 | my($filename) = @_; |
5377 | my $x = readall($filename); |
5377 | my $x = readall($filename); |
5378 | $x =~ s/<see:\?:([^>]+?)(?:=([^>]*))?>/format_ref_tex($1,$2)/gse; |
5378 | $x =~ s/<see:\?:([^>]+?)(?:=([^>]*))?>/format_ref_tex($1,$2)/gse; |
5379 | writeall($filename, $x); |
5379 | writeall($filename, $x); |
5380 | } |
5380 | } |
5381 | 5381 | ||
5382 | #EOF |
5382 | #EOF |