3 # Helper script for context help in Cinelerra
4 # Calling: ContextManual.pl "<help keyphrase>"
5 # Searches the requested key in the following order:
8 # 3) all manual pages via grep
9 # 4) FFmpeg or Ladspa plugins
10 # The first item found is shown via the default web browser
11 # If nothing found, the Contents itself is shown
12 # On empty keyphrase do nothing
13 # The special keyphrase "TOC" shows Contents, "IDX" shows Index
14 # The keyphrase starting with "FILE:" shows the file named after colon
15 # The special keyphrase "API" shows the numeric version of the script itself
17 # Several important definitions
19 # ContextManual.pl script API version. Must not be changed !
22 # Web browser executable, can be redefined on user's demand
23 $cin_browser = $ENV{'CIN_BROWSER'};
24 # a likely default browser
25 $cin_browser = 'firefox' if $cin_browser eq '';
26 # another possible browser
27 #$cin_browser = 'xdg-open' if $cin_browser eq '';
28 # a fake browser for debugging
29 #$cin_browser = 'echo';
31 # The following definitions depend on the HTML manual structure
32 # There is nothing to change below this line
34 # The node with the manual contents
35 $contents_node = 'Contents.html';
37 # The node with the actual index if needed will be found after parsing contents
41 # Several special plugin names necessary to rewrite
43 # Rendered effects and transitions are not segmented in the Contents
44 "CD Ripper" => "Rendered Audio Effects",
45 "Normalize" => "Rendered Audio Effects",
46 "Resample" => "Rendered Audio Effects",
47 "Time stretch" => "Rendered Audio Effects",
49 "720 to 480" => "Rendered Video Effects",
50 "Reframe" => "Rendered Video Effects",
52 # Audio transitions are segmented in the Index
53 # "Crossfade" => "Audio Transitions",
55 # Video transitions are segmented in the Index
56 # "BandSlide" => "Video Transitions",
57 # "BandWipe" => "Video Transitions",
58 # "Dissolve" => "Video Transitions",
59 # "Flash" => "Video Transitions",
60 # "IrisSquare" => "Video Transitions",
61 # "Shape Wipe" => "Video Transitions",
62 # "Slide" => "Video Transitions",
63 # "Wipe" => "Video Transitions",
64 # "Zoom" => "Video Transitions",
66 # Several not properly matched names
67 "AgingTV" => "Aging TV",
68 "Brightness/Contrast" => "Brightness\\/Contrast",
69 "Chroma key (HSV)" => "Chroma Key \\(HSV\\)",
70 "Crop & Position" => "Crop & Position",
71 "FindObj" => "Find Object",
72 "RGB - 601" => "RGB-601",
73 "ShiftInterlace" => "Shift Interlace",
74 "Cinelerra: Scopes" => "Videoscope"
77 # Cinelerra installation path
78 $cin_dat = $ENV{'CIN_DAT'};
79 $cin_dat = '.' if $cin_dat eq '';
81 # Cinelerra HTML manual must reside here
82 $cin_man = "$cin_dat/doc/CinelerraGG_Manual";
83 $contents = $cin_man.'/'.$contents_node;
84 #print "ContextManual: using contents $contents\n";
86 # Cinelerra user's config directory
87 $cin_config = $ENV{'CIN_CONFIG'};
88 $cin_config = $ENV{'HOME'}.'/.bcast5'
89 if $cin_config eq '' && $ENV{'HOME'} ne '';
90 $cin_config = '.' if $cin_config eq '';
91 $me_config = "$cin_config/ContextManual.pl";
92 #print "ContextManual: user script=$me_config\n";
94 # 1st argument is the requested key
96 #print "ContextManual: request=$help_key\n";
97 # Do nothing if no key requested
98 exit 0 if $help_key eq '';
100 # A special internal request: output own API version
101 if ($help_key eq 'API')
103 print "$cin_cm_api\n";
107 # If a system (not user's) script instance is executed, and the API versions
108 # of both scripts do not match, then copy the system script to the user's one
109 # (making a backup copy of the latter). Then execute it with the same key.
110 if ($0 ne $me_config)
113 $me_api = `\"$me_config\" API` if -x $me_config;
114 if ($me_api != $cin_cm_api)
116 print "ContextManual: copying \"$0\" to \"$me_config\"\n";
117 unlink "$me_config.bak" if -f "$me_config.bak";
118 rename "$me_config", "$me_config.bak" if -f $me_config;
119 system "cp \"$0\" \"$me_config\"";
120 system "chmod +x \"$me_config\"";
122 exec "\"$me_config\" \"$help_key\"" if -x $me_config;
125 # If a user's script instance is executed, do everything by myself
126 #print "ContextManual: executing \"$0\" \"$help_key\"\n";
128 # Show contents on this special request
129 if ($help_key eq 'TOC')
131 system "$cin_browser \"file://$contents\" &";
134 # Show index on this special request
135 if ($help_key eq 'IDX')
137 # Index node will be needed now, find it
138 if ($index_node eq '')
141 open CONTENTS, $contents or die "Cannot open $contents: $!";
145 last if ($node) = /^\s*HREF=\"(.+?\.html)\">\s*Index\s*<\/A>(?:<\/B>)?$/;
148 $index_node = $node if $node ne '';
149 $index_node = 'Index.html' if $index_node eq '';
150 $index = $cin_man.'/'.$index_node;
152 system "$cin_browser \"file://$index\" &";
155 # Show the named file on this special request
156 if ($help_key =~ /^FILE:/)
158 $help_key =~ s/^FILE://;
159 $help_key = $cin_man.'/'.$help_key;
160 system "$cin_browser \"file://$help_key\" &";
164 $help_key = $rewrite{$help_key} if exists $rewrite{$help_key};
165 # Do nothing if no key requested
166 exit 0 if $help_key eq '';
167 # Show contents on this special request
168 if ($help_key eq 'TOC')
170 system "$cin_browser \"file://$contents\" &";
173 # Show index on this special request
174 if ($help_key eq 'IDX')
176 # Index node will be needed now, find it
177 if ($index_node eq '')
180 open CONTENTS, $contents or die "Cannot open $contents: $!";
184 last if ($node) = /^\s*HREF=\"(.+?\.html)\">\s*Index\s*<\/A>(?:<\/B>)?$/;
187 $index_node = $node if $node ne '';
188 $index_node = 'Index.html' if $index_node eq '';
189 $index = $cin_man.'/'.$index_node;
191 system "$cin_browser \"file://$index\" &";
194 # Show the named file on this special request
195 if ($help_key =~ /^FILE:/)
197 $help_key =~ s/^FILE://;
198 $help_key = $cin_man.'/'.$help_key;
199 system "$cin_browser \"file://$help_key\" &";
203 # Now try searching...
204 open CONTENTS, $contents or die "Cannot open $contents: $!";
206 # First search contents for the exact key
210 last if ($node) = /^\s*HREF=\"(.+?\.html)\">\s*$help_key\s*<\/A>$/;
212 # If not found, search contents for an approximate key
219 last if ($node) = /^\s*HREF=\"(.+?\.html)\">.*?$help_key.*?<\/A>$/i;
223 # Index node will be needed now, find it
224 if ($node eq '' && $index_node eq '')
230 last if ($node) = /^\s*HREF=\"(.+?\.html)\">\s*Index\s*<\/A>(?:<\/B>)?$/;
232 $index_node = $node if $node ne '';
233 $index_node = 'Index.html' if $index_node eq '';
234 $index = $cin_man.'/'.$index_node;
238 # If not found, search index for the exact key
241 open INDEX, $index or die "Cannot open $index: $!";
245 # Cut off anchor: xdg-open does not like it
246 last if ($node) = /<A\s+HREF=\"(.+?\.html)(?:#\d+)?\">\s*$help_key\s*<\/A>$/;
248 # last if ($node) = /<A\s+HREF=\"(.+?\.html(?:#\d+)?)\">\s*$help_key\s*<\/A>$/;
252 # If not found, search index for an approximate key
255 open INDEX, $index or die "Cannot open $index: $!";
259 # Cut off anchor: xdg-open does not like it
260 last if ($node) = /<A\s+HREF=\"(.+?\.html)(?:#\d+)?\">.*?$help_key.*?<\/A>$/i;
262 # last if ($node) = /<A\s+HREF=\"(.+?\.html(?:#\d+)?)\">.*?$help_key.*?<\/A>$/i;
267 # If not found, grep manual for exact key instance
270 $_ = `grep -l \"$help_key\" \"$cin_dat\"/doc/CinelerraGG_Manual/*.html`;
273 # If not found, grep manual for case insensitive key instance
276 $_ = `grep -il \"$help_key\" \"$cin_dat\"/doc/CinelerraGG_Manual/*.html`;
282 if ($help_key =~ /^F_/)
283 { # If not found, search contents for FFmpeg plugins
284 $help_key = 'FFmpeg Audio and Video Plugins';
289 last if ($node) = /^\s*HREF=\"(.+?\.html)\">\s*$help_key\s*<\/A>$/;
292 elsif ($help_key =~ /^L_/)
293 { # If not found, search contents for LADSPA plugins
294 $help_key = 'Audio Ladspa Effects';
299 last if ($node) = /^\s*HREF=\"(.+?\.html)\">\s*$help_key\s*<\/A>$/;
306 # If still nothing found, show contents
307 $node = $contents_node if $node eq '';
308 $node = $cin_man.'/'.$node unless $node =~ /\//;
309 #print "ContextManual: found $node\n";
311 # Call browser to show the proposed HTML file
312 system "$cin_browser \"file://$node\" &";
314 # And immediately return to the caller