1+ # !/usr/bin/perl
2+ # requires: perl >= 5.10
3+
4+ # generate-htdocs-help-form-jabref-src-help.pl
5+ # (c) 2012 Kolja Brix and Oliver Kopp
6+
7+ # This scripts converts the help files
8+ # from the source directory of JabRef (HELPDIR_JABREF)
9+ # to help files for the web page (HELPDIR_WEB)
10+
11+ # Start it from the root directory of your git repository.
12+ # Windows: perl generate-htdocs-help-form-jabref-src-help.pl
13+ # It will overwrite all help files in HELPDIR_WEB
14+ # It will NOT delete files in HELPDIR_WEB which were removed in HELPDIR_JABREF
15+
16+ # There are NO command line parameters
17+
18+ # If you have newline issues at the generated files,
19+ # adapt FORCE_WINDOWS_NEWLINES
20+
21+
22+ # Error:
23+ # Use of uninitialized value in concatenation (.) or string at generate-htdocs-help-from-jabref-src-help.pl line 174, <$infileH> line 138.
24+ # Reason:
25+ # A new language has been added to HELPDIR_JABREF, where no translation is contained in
26+ # %translation_back_to_contents. Please add the language to there.
27+
28+ use constant HELPDIR_JABREF => " ../src/main/resources/help" ;
29+ use constant HELPDIR_WEB => " ../../htdocs/help" ;
30+
31+ # 0 for normal operationrequired
32+ # 1 for cygwin's perl
33+ use constant FORCE_WINDOWS_NEWLINES => 0;
34+
35+ # translations for "Back to contents"
36+ our %translation_back_to_contents = (
37+ " da" => " Back to contents" ,
38+ " de" => " Zurück zum Inhaltsverzeichnis" ,
39+ " en" => " Back to contents" ,
40+ " fr" => " Retour au contenu" ,
41+ " in" => " Kembali ke Daftar Isi" ,
42+ " ja" => " 目次に戻る"
43+ );
44+
45+
46+ # build.xml for getting string replacements @version@ and @year@
47+ use constant BUILDXML => " ../build.xml" ;
48+
49+ use warnings;
50+ use strict;
51+
52+ # enable "given/when"
53+ use feature " :5.10" ;
54+
55+ sub handleDir ;
56+ sub handleFile ;
57+ sub loadPreferences ;
58+
59+ our $jabref_version ;
60+ our $jabref_year ;
61+ our $jabref_placeholder_version ;
62+ our $jabref_placeholder_year ;
63+
64+ loadPreferences();
65+
66+ # Debug call for a single file
67+ # handleFile("../src/main/resources/help/About.html", "../../htdocs/help/About.php", "en");
68+ # exit;
69+
70+
71+ # handle English
72+ handleDir(HELPDIR_JABREF, HELPDIR_WEB, " en" );
73+
74+ # handle other languages (contained in sub directories)
75+
76+ my $helpdirJabRef ;
77+
78+ opendir ($helpdirJabRef , HELPDIR_JABREF) or die $! ;
79+
80+ my $sourcedir ;
81+ my $targetdir ;
82+ my $lang ;
83+
84+ while (my $subdir = readdir ($helpdirJabRef )) {
85+ $sourcedir = HELPDIR_JABREF . " /$subdir " ;
86+ next unless (-d $sourcedir );
87+ next if ($subdir =~ / \.\. ?/ );
88+
89+ $targetdir = HELPDIR_WEB . " /$subdir " ;
90+ $lang = $subdir ;
91+
92+ handleDir($sourcedir , $targetdir , $lang );
93+ }
94+ close ($helpdirJabRef );
95+
96+ exit 0;
97+
98+
99+
100+ # Parameters:
101+ # sourcedir
102+ # targetdir
103+ # language
104+ sub handleDir {
105+ my $sourcedir = shift ;
106+ my $targetdir = shift ;
107+ my $lang = shift ;
108+
109+ print (" Handling $sourcedir ...\n " );
110+
111+ if (!-d $targetdir ) {
112+ mkdir ($targetdir );
113+ }
114+
115+ my $dh ;
116+ opendir ($dh , $sourcedir ) or die $! ;
117+ while (my $infilename = readdir ($dh )) {
118+ next unless ($infilename =~ / \. html$ / );
119+ my $outfilename = $infilename ;
120+ $outfilename =~ s /\. html/ \. php/ g ;
121+ my $sourcefilename = $sourcedir . " /" . $infilename ;
122+ my $targetfilename = $targetdir . " /" . $outfilename ;
123+ handleFile($sourcefilename , $targetfilename , $lang );
124+ }
125+ close ($dh );
126+ }
127+
128+ #
129+ # Parameters:
130+ # infilename: source file (html)
131+ # outfile: target file (php)
132+ # lang: language (ISO-format)
133+ #
134+ sub handleFile {
135+ my $infilename = shift ;
136+ my $outfilename = shift ;
137+ my $lang = shift ;
138+
139+ my $replace_placeholders = ($infilename =~ / About.html$ / );
140+
141+ # Debug output
142+ # print("handleFile:\n$infilename\n$outfilename\n$lang\n$replace_placeholders\n\n");
143+
144+ open (my $infileH , " <" , $infilename ) or die " cannot open < $infilename : $! " ;
145+ my @infile = <$infileH >;
146+
147+ my @outfile =();
148+
149+ # Determine title out of first h1 heading
150+ my $title =" " ;
151+ my $line ;
152+ foreach $line (@infile ) {
153+ if ($line =~ / \< h1\> (.*)\<\/ h1\> / ) {
154+ $title =$1 ;
155+ if ($replace_placeholders ) {
156+ $title =~ s / $jabref_placeholder_version/ $jabref_version / ;
157+ $title =~ s / $jabref_placeholder_year/ $jabref_year / ;
158+ }
159+ # title is found, go to the normal handling
160+ last ;
161+ }
162+ }
163+
164+ # remove html tags from title
165+ # even if <em> is not allowed in h1 elements, JabRef doc uses that
166+ $title =~ s # <(.|\n )*?>## g ;
167+
168+ # Following prefix does not work at sourceforge.
169+ # <?xml version=\"1.0\" encoding=\"UTF-8\"?>
170+ # We use php's header statement instead
171+
172+ # add to the relative path to navigation|footer if help is non-english
173+ my $pathaddition ;
174+ if ($lang eq ' en' ) {
175+ $pathaddition = " " ;
176+ } else {
177+ $pathaddition = " ../" ;
178+ }
179+
180+ my $navigationlink = $pathaddition . " ../navigation.php" ;
181+ my $footerlink = $pathaddition . " ../footer.php" ;
182+
183+ my $header =<<HTML ;
184+ <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"
185+ \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\" >
186+ <html xmlns =\ " http://www.w3.org/1999/xhtml\" lang =\ " $lang\" xml:lang =\ " $lang\" >
187+ <?php
188+ header('Content-type: application/xhtml+xml; charset=utf-8');
189+
190+ // DO NOT EDIT BY HAND
191+ // This file is generated from jabref/src/help.
192+ // Run generate-htdocs-help-from-jabref-src-help.pl in the root directory
193+ // of the JabRef repository to regenerate the htdocs out of JabRef's help.
194+ ?>
195+ <head >
196+ <meta http-equiv =\ " content-type\" content =\ " application/xhtml+xml; charset=UTF-8\" />
197+ <title >$title </title >
198+ <link href =\ " /css/style.css\" rel =\ " stylesheet\" type =\ " text/css\" />
199+ </head >
200+
201+ <body >
202+ <div id =\ " container\" >
203+ <?php include(\" $navigationlink \" ); ?>
204+ <a href =\ " Contents.php\" >$translation_back_to_contents {$lang }</a >
205+
206+ HTML
207+
208+ my $footer =<<HTML ;
209+ <?php include(\" $footerlink \" ); ?>
210+ </div >\n\n </body >\n </html >
211+ HTML
212+
213+ push (@outfile , $header );
214+
215+ my $status =0;
216+ # 0 out of html
217+ # 1 in html
218+ # 2 within basefont
219+
220+ foreach $line (@infile ) {
221+ # Debug states
222+ # print "$status / $line";
223+
224+ if ($status ==0 && $line =~ / \< body/ ) {
225+ $status =1;
226+ } elsif ($status ==1 && $line =~ / \<\/ body\> / ) {
227+ $status =0;
228+ } elsif ($status ==1) {
229+ # we may not transfer a "basefont"
230+ if ($line =~ / \< basefont/ ) {
231+ if ($line !~ / \/\> / ) {
232+ $status = 2;
233+ }
234+ } else {
235+ if ($replace_placeholders ) {
236+ $line =~ s / $jabref_placeholder_version/ $jabref_version / ;
237+ $line =~ s / $jabref_placeholder_year/ $jabref_year / ;
238+ }
239+ if (!($line =~ / href=\" http:\/\/ / )) {
240+ # line does NOT contain a href to some http address
241+ # we assume that line is NOT a reference to an external site
242+ # replace "html" extension with "php" extension
243+ # still allow links as "...html#part".
244+ $line =~ s / href=\" ([^\" ]*)\. html/ href=\" $1 \. php/ g ;
245+ }
246+ push (@outfile , $line );
247+ }
248+ } elsif (($status ==2) && ($line =~ / \/\> / )) {
249+ # basefont ended, reset to "inhtml"
250+ $status = 1;
251+ }
252+ }
253+
254+ push (@outfile , $footer );
255+
256+ open (OUTFILE," >$outfilename " );
257+
258+ if (FORCE_WINDOWS_NEWLINES) {
259+ foreach my $line (@outfile ) {
260+ $line =~ s /\r ?\n |\r / \r\n / g ;
261+ }
262+ }
263+
264+ print OUTFILE @outfile ;
265+
266+ close (OUTFILE);
267+
268+ close ($infileH );
269+ }
270+
271+ # extracts info out of build.xml
272+ # <property name="jabref.version" value="2.8b" />
273+ # <property name="jabref.year" value="2012" />
274+ # <property name="jabref.placeholder.version" value="@version@" />
275+ # <property name="jabref.placeholder.year" value="@year@" />
276+ sub loadPreferences {
277+ open (my $buildXML , " <" , BUILDXML) or die " cannot open < " . BUILDXML . " : $! " ;
278+ my @buildxml = <$buildXML >;
279+ close ($buildXML );
280+ foreach my $line (@buildxml ) {
281+ # check for one-line property declaration name / value
282+ if ($line =~ / property name="([^"]*)" value="([^"]*)"/ ) {
283+ # copy value from value to local variable
284+ # a non-hardcoded version using "eval" would also be possible
285+ # the SLOC count would be equal to the count of the following (easier) given/when construct.
286+ given ($1 ) {
287+ when (" jabref.version" ) {
288+ $jabref_version = $2 ;
289+ }
290+ when (" jabref.year" ) {
291+ $jabref_year = $2 ;
292+ }
293+ when (" jabref.placeholder.version" ) {
294+ $jabref_placeholder_version = $2 ;
295+ }
296+ when (" jabref.placeholder.year" ) {
297+ $jabref_placeholder_year = $2 ;
298+ }
299+ }
300+ }
301+ }
302+ }
0 commit comments