/
sdoc
executable file
·474 lines (412 loc) · 24.7 KB
/
sdoc
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
#!/usr/bin/perl
# 99aeabc9ec7fe80b1b39f5e53dc7e49e <- self-modifying Perl magic
# state: kGojbLr1aJBFYmIkEQn7FwuqgQqNbwgo99CmzKvp9UE
# istate: TBP4VqMuHSrBGYCiWy55lQf/m9n+oFaFNxsHIxBGCnQ
# id: a1e8480e579614c01dabeecf0f963bcc
# This is a self-modifying Perl file. I'm sorry you're viewing the source (it's
# really gnarly). If you're curious what it's made of, I recommend reading
# http://github.com/spencertipping/writing-self-modifying-perl.
#
# If you got one of these from someone and don't know what to do with it, send
# it to spencer@spencertipping.com and I'll see if I can figure out what it
# does.
# For the benefit of HTML viewers (this is a hack):
# <div id='cover' style='position: absolute; left: 0; top: 0; width: 10000px; height: 10000px; background: white'></div>
$|++;
my %data;
my %transient;
my %externalized_functions;
my %datatypes;
my %locations; # Maps eval-numbers to attribute names
my $global_data = join '', <DATA>;
sub meta::define_form {
my ($namespace, $delegate) = @_;
$datatypes{$namespace} = $delegate;
*{"meta::${namespace}::implementation"} = $delegate;
*{"meta::$namespace"} = sub {
my ($name, $value, %options) = @_;
chomp $value;
$data{"${namespace}::$name"} = $value unless $options{no_binding};
&$delegate($name, $value) unless $options{no_delegate}}}
sub meta::eval_in {
my ($what, $where) = @_;
# Obtain next eval-number and alias it to the designated location
@locations{eval('__FILE__') =~ /\(eval (\d+)\)/} = ($where);
my $result = eval $what;
$@ =~ s/\(eval \d+\)/$where/ if $@;
warn $@ if $@;
$result}
meta::define_form 'meta', sub {
my ($name, $value) = @_;
meta::eval_in($value, "meta::$name")};
eval `object serialize -p`; die $@ if $@;
meta::meta('type::sdoc', <<'__');
# A meta-type for other types. So retrieve('js::main') will work if you have
# the attribute 'sdoc::js::main'. The filename will be main.js.sdoc.
meta::functor::editable 'sdoc', inherit => 1, extension => sub {
extension_for(attribute($_[0])) . '.sdoc';
};
__
meta::meta('type::slibrary', <<'__');
meta::configure 'slibrary', extension => '.pl.sdoc', inherit => 1;
meta::define_form 'slibrary', sub {
my ($name, $value) = @_;
meta::eval_in(sdoc("slibrary::$name"), "slibrary::$name");
};
__
meta::cache('parent-identification', 'object 99aeabc9ec7fe80b1b39f5e53dc7e49e');
meta::cache('parent-state', '99aeabc9ec7fe80b1b39f5e53dc7e49e 8o6O4hqEnGDxNC5FgK+q340aKWykAb+LRLAe0Fi9xMc');
meta::data('author', 'Spencer Tipping');
meta::data('default-action', 'shell');
meta::data('file-nuke-backend', 'shred');
meta::data('license', <<'__');
MIT License
Copyright (c) 2010 Spencer Tipping
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
__
meta::data('permanent-identity', 'a1e8480e579614c01dabeecf0f963bcc');
meta::data('save-indirect', '1');
meta::data('watching', '1');
meta::function('sdoc', <<'__');
# Applies SDoc processing to a file or attribute. Takes the file or attribute
# name as the first argument and returns the processed text.
my %comments_for_extension =
qw|c /*,*/ cpp // cc // h /*,*/ java // py # rb # pl # pm # ml (*,*) js //
hs -- sh # lisp ;;; lsp ;;; s # scm ;;; sc ;;; as // html <!--,--> mli (*,*) cs //
vim " elisp ; bas ' ada -- asm ; awk # bc # boo # tex % fss (*,*) erl %
scala // hx // io // j NB. lua -- n // m % php // sql -- pov // pro %
r # self "," tcl # texi @c tk # csh # vala // vbs ' v /*,*/ vhdl -- ss ;;;
haml -# sass /*,*/ scss /*,*/ css /*,*/ fig / waul # hh // ps % canard nb[,] x /*,*/ xr /*,*/
xu /*,*/ xn /*,*/ xbn /*,*/ xs /*,*/ m4 dnl|;
# No extension suggests a shebang line, which generally requires # to denote a comment.
$comments_for_extension{''} = '#';
my $generated_string = 'Generated by SDoc';
sub is_code {map /^\s*[^A-Z\|\s]/o, @_}
sub is_blank {map /^\n/o, @_}
sub comment {my ($text, $s, $e) = @_; join "\n", map("$s $_" . (length $e ? " $e" : ''), split /\n/, $text)}
sub paragraphs {map split(/(\n(?:\h*\n)+)/, $_), @_}
my ($filename, $specified_extension) = @_;
my $logical_filename = $filename =~ /^sdoc::(.*)$/ ? $1 : $filename;
# Two possibilities here. One is that the filename is an attribute, in which case
# we want to look up the extension in the transients table. The other is that
# it's a real filename.
my $extension = $specified_extension || extension_for($logical_filename) || ($filename =~ /\.sdoc$/io ? $filename =~ /\.(\w+)\.sdoc$/igo : $filename =~ /\.(\w+)$/igo)[0];
$extension =~ s/^\.//o;
my ($start, $end) = split /,/o, $comments_for_extension{lc $extension} // $comments_for_extension{''} // '#';
join '', map(is_code($_) || is_blank($_) ? ($_ =~ /^\s*c\n(.*)$/so ? $1 : $_) : comment($_, $start, $end), paragraphs retrieve($filename)),
"\n" . comment($generated_string, $start, $end) . "\n";
__
meta::function('sdoc-html', <<'__');
# Converts SDoc to logically-structured HTML. Sections end up being nested,
# and code sections and examples are marked as such. For instance, here is some
# sample output:
# <div class='section level1'>
# <h1 class='title'>Foo</h1>
# <p>This is a paragraph...</p>
# <p>This is another paragraph...</p>
# <pre class='code'>int main () {return 0;}</pre>
# <pre class='quoted'>int main () {return 0} // Won't compile</pre>
# <div class='section level2'>
# <h2 class='title'>Bar</h2>
# ...
# </div>
# </div>
# It is generally good about escaping things that would interfere with HTML,
# but within text paragraphs it lets you write literal HTML. The heuristic is
# that known tags that are reasonably well-formed are allowed, but unknown ones
# are escaped.
my ($attribute) = @_;
my @paragraphs = split /\n(?:\s*\n)+/, retrieve($attribute);
my $known_tags = join '|', qw[html head body meta script style link title div a span input button textarea option select form label iframe blockquote code caption
table tbody tr td th thead tfoot img h1 h2 h3 h4 h5 h6 li ol ul noscript p pre samp sub sup var canvas audio video strong em];
my $section_level = 0;
my @markup;
my $indent = sub {' ' x ($_[0] || $section_level)};
my $unindent = sub {my $spaces = ' ' x ($section_level - 1); s/^$spaces//gm};
my $escape_all = sub {s/&/&/g; s/</</g; s/>/>/g};
my $escape_some = sub {s/&/&/g; s/<(?!\/|($known_tags)[^>]*>.*<\/\1>)/</gs};
my $code = sub {&$escape_all(); &$unindent(); s/^c\n//; push @markup, &$indent() . "<pre class='code'>$_</pre>"};
my $quoted = sub {&$escape_all(); &$unindent(); s/^\|(\s?)/ \1/; s/^ //mg; push @markup, &$indent() . "<pre class='quoted'>$_</pre>"};
my $paragraph = sub {&$escape_some(); push @markup, &$indent() . "<p>$_</p>"};
my $section = sub {my $h = $_[0] > 6 ? 6 : $_[0]; push @markup, &$indent($_[0] - 1) . "<div class='section level$_[0]'>", &$indent($_[0]) . "<h$h>$2</h$h>"};
my $close_section = sub {push @markup, &$indent($_[0]) . "</div>"};
my $title = sub {
my $indentation = (length($1) >> 1) + 1;
&$close_section($section_level) while $section_level-- >= $indentation;
&$section($indentation);
$section_level = $indentation;
};
for (@paragraphs) {
&$code(), next unless /^\h*[A-Z|]/;
&$quoted(), next if /^\h*\|/;
&$title(), s/^.*\n// if /^(\s*)(\S.*)\.\n([^\n]+)/ and length("$1$2") < 60 and length("$1$2") - 10 < length($3);
&$paragraph();
}
&$close_section($section_level) while $section_level--;
join "\n", @markup;
__
meta::function('sdoc-markdown', <<'__');
# Renders a chunk of SDoc as Markdown. This involves converting quoted and
# unquoted code and section headings, but not numbered lists.
my ($attribute, %options) = @_;
my ($adjust, $quote_code) = @options{qw/adjust quote_code/};
$adjust //= 0;
my $extension = extension_for($attribute =~ /^sdoc::(.*)$/g) || ($attribute =~ /.*?\.([^\.]+)(?:\.sdoc)?$/gi)[0];
my @paragraphs = split /\n(?:\s*\n)+/, retrieve($attribute);
my $section_level = 0;
my @markup;
my $indent = sub {' ' x ($_[0] || $section_level)};
my $unindent = sub {my $spaces = ' ' x ($section_level - $adjust - 1); s/^$spaces//gm; $_};
my $code = sub {goto &$quoted if $quote_code;
&$unindent(); s/^c\n//; push @markup, "```$extension\n$_\n```"};
my $quoted = sub {&$unindent(); s/^\|(\s?)/ \1/; s/^ //mg; push @markup, join("\n", map &$indent(2) . $_, split /\n/)};
my $heading = sub {'#' x $_[0]};
my $section = sub {&$unindent(); push @markup, &$heading($_[0]) . ' ' . $2};
my $title = sub {
my $indentation = (length($1) >> 1) + 1 + $adjust;
&$section($indentation);
$section_level = $indentation;
};
for (@paragraphs) {
&$code(), next unless /^\h*[A-Z|]/;
&$quoted(), next if /^\h*\|/;
&$title(), s/^.*\n// if /^(\s*)(\S.*)\.\n([^\n]+)/ and length("$1$2") < 60 and length("$1$2") - 10 < length($3);
push @markup, join "\n", map &$unindent(), split /\n/;
}
join "\n\n", @markup;
__
meta::function('sdoc-packed', <<'__');
# An SDoc preprocessor that removes all comment paragraphs. Paragraph breaks
# are preserved, and no "generated by SDoc" string is added.
join "\n", grep /^\s*[^A-Z| ]/, split /\n(?:\s*\n)+/, retrieve(@_);
__
meta::function('sdoc-pod', <<'__');
# Renders a chunk of SDoc as POD. This involves converting quoted and
# unquoted code and section headings, but not numbered lists. It also
# involves converting Markdown's code-text and link syntax.
use List::Util qw/min/;
my ($attribute, %options) = @_;
my ($adjust, $quote_code) = @options{qw/adjust quote_code/};
$adjust //= 0;
my $extension = extension_for($attribute =~ /^sdoc::(.*)$/g) || ($attribute =~ /.*?\.([^\.]+)(?:\.sdoc)?$/gi)[0];
my @paragraphs = split /\n(?:\s*\n)+/, retrieve($attribute);
my $section_level = 0;
my @markup;
my $indent = sub {' ' x ($_[0] || $section_level)};
my $unindent = sub {my $spaces = ' ' x ($section_level - $adjust - 1); s/^$spaces//gm; $_};
my $code = sub {goto &$quoted if $quote_code;
&$unindent(); s/^c\n//; push @markup, "=cut\n\n$_\n\n=pod"};
my $quoted = sub {&$unindent(); s/^\|(\s?)/ \1/; s/^ //mg; push @markup, join "\n", map " $_", split /\n/};
my $section = sub {&$unindent(); push @markup, "=head$_[0] $2"};
my $title = sub {
my $indentation = (length($1) >> 1) + 1 + $adjust;
&$section($indentation);
$section_level = $indentation;
};
for (@paragraphs) {
&$code(), next unless /^\h*[A-Z|]/;
&$quoted(), next if /^\h*\|/;
# Anything below here is a "normal" (i.e. commented) paragraph, so
# normal text-transformation rules apply.
s/`([^`]+?)`/C<<<<< $1 >>>>>/g; # Markdown inline code
s/\[([^]]+)\]\(([^)]+)\)/L<$1|$2>/g; # Markdown link
&$title(), s/^.*\n// if /^(\s*)(\S.*)\.\n([^\n]+)/ and length("$1$2") < 60 and length("$1$2") - 10 < length($3);
# Undo any consistent indentation within a paragraph.
{
my $paragraph = $_;
my $indentation_level = min(map length(s/^(\s*).*/$1/rmg), split /\n/);
my $spaces = ' ' x $indentation_level;
$_ = $paragraph =~ s/^$spaces//mgr;
}
push @markup, join "\n", map &$unindent(), split /\n/;
}
join "\n\n", @markup;
__
meta::function('sdocp', <<'__');
# Renders an attribute as SDocP. This logic was taken directly from the sdoc script.
my $attribute = retrieve($_[0]);
sub escape {my @results = map {s/\\/\\\\/go; s/\n/\\n/go; s/'/\\'/go; $_} @_; wantarray ? @results : $results[0]}
"sdocp('" . escape($_[0]) . "', '" . escape($attribute) . "');";
__
meta::parent('object', <<'__');
bootstrap::html /9nKOzNlCVjt5KpPCw6ktpNdorICJPOmdsxw8gRbQgs
bootstrap::initialization TvbsjnluOC8KVyAVtB4a6Yzd+QlZ0Caz+PywmbS+RsE
bootstrap::perldoc Yun55m+nTQKU5l0UCuImJQGrDnrhsJ18adHGKgtzQ6M
function::ad TDzQEoFVHn4cxoMC1v2lQtvbymt7TDA+fzzf8ZdKBTY
function::alias 76cEB7oBB2F8XdFTKnJy1lDh45nPgZ0c0xeoQUesLDk
function::cat 6DwhwhDw7GTCE8Ll4Hwi13L3agMbCK7nbX0tDdC4MNU
function::cc YUoFsxNwVjmiHsdz9J7A13fBhp0++EiinFxETzF8+3g
function::ccc T3ySqmDsgIDdk55Fm4agtCEe1OOYWihhUcfiPtTupAs
function::cd cH/fs1az9tELnBgTC7JW/eb/ZSsf7s+K8Os8cMCeEG8
function::child y8XMjuUj//66Rj5jSs4HdEn1SqEIT1UVO6/2zb12Ln8
function::clone 3ImmJEgQg9iM1gqe/hfKBFBm/Ky0HR/+xWj6XLXF3xk
function::cp +586T+V2LWthllDZvvTJzGNtngNo5c1pcS36XgTh1gs
function::create EG9exU+k3oTxSMX2TJHp660yAjhAe7+KZd4qBC1+vR8
function::current-state BPu6xpOyr3Ns0vYdawRlNxsmeRPITGp1bm0QtMaXFw4
function::cwd kUuYtqZpgzhXPJOe4f+SLRCFTG+tNl5j8p7+0yqE6C0
function::disable ETVjo3v6gmGncp7YgrEmQiDlF7GTHP0EX3yMOsn0M98
function::edit QgBU/tNoicpE+PHlVDKuUZ5vn5Da36GrycIxE0MwbA0
function::edit-self CnLk1bZDZ7VYrDQlYzfHXZ1aP5+0FrGCRBU1CUhel5I
function::enable uj6pBBIjv0ahKWcnbyL1IU4bsvDQqVJrQt6LrsUMzc4
function::expanded-bootstrap 20atbt3JeNY20woVBrxVH1IRnx/Sk8gPrY/nayXBIvs
function::export a/OWMZFsFsvHwnlvCBEZMg8WhZ9IP9ZwqJZBj7Garq8
function::extern EG6Lhkqo4xNy3xxWJgDv22Ij987xFAYgtwSXWNzwgDw
function::grep V4XnzOTDllwCW/e2EMuFITuX/q6stdhIQaCCOPo6ob4
function::hash +KkJP3kfAnYIXy1BBSEDdfzhnLpQPqz52RJpwgk+OCc
function::hook rhEyOmCy+ZDyO727aPXfTrEtkOOGaGKcezlkYf9BK0k
function::hooks 2rZQUo7p9iu9gmM4wR+G6/RukNXgAk+ZcFepCgnfef8
function::identity 6+JeD3ohDjevZF5UG7V3iRFkxIwp4KwwibpVc9dwcm4
function::import 9HGjc6wuWn6+ElU//UxgjcG8dTo4aml/Bs117zcBdXY
function::initial-state E45KKMXa7YYzleuQNeMa+2XTkvSxKw40KaWN0lHLhV0
function::is R4wqjFaGUQnk3q8Ru9HEoyuoiTd0nEXs8655T50bO3I
function::load-state eLPBMJvlKzYr+6ZrhVj3kwYhpyxc9NS6veacMaV3sLk
function::lock rgtPo1uxq+ZA8QVPi2hstfNkbTojY7P7S4KmEwad/J4
function::ls qrAno4J3gk8dgDQv2/uX4Tf2Togs4RA6ijzCGuyCS4U
function::mv oGOOV1RR5dS32B/rTSJI2w/8FEt7LbMwDfMMZwjpqLY
function::name CJWkv4fyzTENKSfoZBLH4yjeaP9YkzqCiNcsULOibaE
function::parents PvAkixp0hXE4Q/1z7CKPil5BLkSGdGwMfg6QCGgW0EY
function::perl pOOr9RtVKIQI6kNIDkC1HmsIDll4TPio8OM3Cmi3htE
function::rd HC6cTSNHAtUtreuzLHKP6HkkDTCgI4gkzTY7t9EO//Q
function::reload FK+ITbNziplYOjLH/y5f4MzIJOaq/dQlHJ2CLp3+RDo
function::rm EwSp4uAK0uVy4lCYpJYvd0qu12q24rIlEiDUbfcW+YA
function::rmparent 3RgK0wVGkKinmoqBJ0fZEyv72qWiL6a3unkz3etJC+M
function::save r7HLe7LppWXiaooOuUztnOK04LpIb+ck3bEvQ2SzY14
function::save-state KyoEB2NXy0ko1IYUVujXqEfbNbsoDckiKjwn8+zjvxs
function::serialize wGWkVgwClONRAAC0P+m5biPd+tJTjtrYWQa8VS3XL8Y
function::serialize-single bOoEGNxf7jcYMAbvT4n492g5aUQ9e+umiaYC574Re6E
function::sh PA9Q/R+AEXXCDtU8QIPNFbZr/iITh4DXEG6EWY6n4DM
function::shb /COiQpKD0k/4B4/fnj1q1GtH+Z+ZQV0fJUwX6kSseks
function::shell vmp2+XW/dSS4KbXsVcimZAzAuJloTDaQASZgG0Y07Dg
function::size UFrBxczp+lDNQsbGtXE7IlZULMMP2NWLqJQsUvHlr1Y
function::snapshot zTuPSITfomNBxxegaGuSzov/JMWJ3vUWGqAAbYx/MsY
function::snapshot-if-necessary V2hG5mBuDkIzwasK2iNJt5v+7iK2yAYD1/Omir19AmM
function::state EmD3LgRcBLmEIu1loHDBwhS+F73W0KLjm9mRNws0BVI
function::touch MvxEZzMCnQsgc44DzkQmPpuY/gVpZjNIVGgAqznIUPE
function::u hxjOve/ti/MyoyBAl/1EkoXIEAB/4bOdIh8eXM3oNJs
function::unlock ab+C+O37Wm9wHXqiOaF+0uwd3asIzlcJcChqOpFqiwk
function::update 67tiKQo3l50gnH1KAXcfUH6tf/tB3K64UEM2lKrcge4
function::update-from ZnceaN1aTEkye6SRPhI/eLnjd56gyBdAAC74YAzKkbI
function::usage ITBRGF9rUVDwVE+YpFc2XXNeU2tD+IJKuvUGzqp30BA
function::verify nRZZh97ekQOHcDQUnxrHxMhybS2RlZifwYbH56KrL3M
indicator::cc 2ikhlSjKzneE/3j6mqjUwNQe7gyTJ6IP39JuZJXB8ow
indicator::locked ZtHtnMoF2VDZ6rNdzy8JHnnrO71UXJgLN+OUoiQr9Fs
indicator::path XVIgNhtNzG44gG2fWuZOsKqfInEUa7hFABIN1mkM6S4
internal_function::around_hook zWPc/eIWZMVUXDctAd/u34J1WA40nlbh8SvBx2tE2VA
internal_function::associate aRtHj4eVjuRHamUSAHaI9DVezimcdFaqFkva+dz0x7M
internal_function::attribute T4JEqOUYjMzssdVwV/rdgAhvr0Vz9TQUo0noTdeBLxw
internal_function::attribute_is O+KJhA7B6+N7gkDV2ajInPi947wIMEDHzAaRvWqB0a0
internal_function::cache H0Rgkwopfv+3kVOCYBuUrh32L0pwHwBzy3LK6jhG2nU
internal_function::chmod_self jwP33VbXCB7ZGtZ6rAm3ITeudyt+gq8wdkK/JYFvu8c
internal_function::dangerous hpmVjFqxl2K7Kn+JMjADIOB4ZRwpsNKjulPWkUnwqng
internal_function::debug_trace Py4lyrgkcj9TD3WxREcAOIu5qSk5ovMw/NJX/hsezMw
internal_function::execute u5QsUyqazbIXg102zvkkR9c+U70uoAExjjTtRVss4SI
internal_function::exported lt+j/oJ17agFjOp8QSeb2GN3j4iwEOqMulXaoAj91rI
internal_function::extension_for VeNEZFjlo6u8rC3yvntP4xu/xpjW36Rq3PCPqlkjTiI
internal_function::fast_hash BP8vJF0piDed/aGYR1H8SLjk9XqoGdhjpOH3wqUEFLU
internal_function::file::nuke vRgROFbL2G7rrwziDIcamYLXWb4Sd6q325jGfqSk1f0
internal_function::file::read ZxBqZsMZZRuLMQp8Sy//ZsoAvriDebjYLGAX7p7AxXg
internal_function::file::write nMg2QO30cjzzI8/maAYtxQ76Ny3Tn0+67CX7xPkMu64
internal_function::fnv_hash N2uv6uAkri1qLYjFmFOzWITS8UX0nj29kSN/Y1Z2+MM
internal_function::hypothetically 5h4k5A1NACvCeZF+auxnVnBOTfHvGYMINpFARejGqAA
internal_function::internal::main MJVtZ4FOaoIiqG+CM+fMjVugUyU7+S6xLeirkoamEzU
internal_function::invoke_editor_on T6uVYs1mq/VotsBwgqfn3aCoJD6JIG9+jp5M7y38ciw
internal_function::is_locked EN0WP8v+JfHjxrEUDR5BMAJ4pMfNwj3UgG7zuj3B+yU
internal_function::metadata_from fdIYuVCLs5te7JJdp7n2GhcSZRhZBp9O9hDdFZ3MV1s
internal_function::namespace D7UfKyyYZ1slZZyaS28hIt8a68jkI3ELBaddROXOHug
internal_function::parent_attributes R4t2hz0vRzfeLwj0BJWd6tIG92nhwgnJ0ghbwM9+074
internal_function::parent_ordering jYxqyDRm6Gp0MgwofcisBAy0mFiD+TzRO4kGUo0AfW8
internal_function::retrieve x/cC8A6IVrv7cGYc06LjgxCmn9bXFKUIWx12NXRJP8U
internal_function::retrieve_trimmed zCzstBKNEuJKINlRSdyhF8TA812YClYWNPh6b3mhtXc
internal_function::retrieve_with_hooks Ed7iEFKqmGXxS3JPwmygtLjlOhycYvGsGlxNt3m2vk4
internal_function::select_keys Kpg0B01VaBHfRb1YeI3/J8KpycHwXi1c0VdLNYkagqQ
internal_function::separate_options qvGsY0MQiEVjugLRXbi/QfHvEI+3kQr+7jDZMbapfX4
internal_function::strip jnRBmqPwpXGicECRagXsULSsEzBuO19OHHxvE0R4zVA
internal_function::table_display qe/73ZK9+GlMti8pCl/CPvcJYK5q5moMUiXzDgKqoJg
internal_function::temporary_name I6v0e9aXFvCgVCeVSb84b22rwrAIOX2ywYdcr44s3Vg
internal_function::translate_backtrace n8iPtziEsVmBboZKnIsoUXc3mbe1RLOKJFenszUeHus
internal_function::with_cwd DCrQF2lCsAa/lbEA3i1fimbTRS//b/L4qxicIsxg+Tg
internal_function::with_exported sFgG++rvoIvOTTIZ2QlxgblZQ7R2W9kHUn48wVvIxXI
internal_function::with_fork fB68GdZBM7LfsOmfVsCLBv2+blwEpLgg5aXOphf7P7E
library::process 27/7yTUHKovr2X+dF2BhebepYF81cYQA1z9Ku97kiKk
library::shell z9Whrvl2xc4VLK7zIYdiYnODlXqrNXY1h3TWWNip4z4
library::terminal Iw5HMLpx/iJYD3QzZEU7GMDAsEGK700ormCZ+biuDz0
message_color::cc dqUIh9jxwukwF1VCiZCtgUee4hwltDIVz1JFQeBQMmk
message_color::state jgobCtpCFyiG/RKX4lq/mfFDlqlACsvV8g2iAonP8C8
message_color::states xoWiybqyNczdKrDqkigaUhyKrzeJVJPQgAcOoA/H9dc
meta::configure wNvmS+fdr/xIUde0ah7ZA51enuGxvC34oW+5c+xeXIM
meta::externalize SAxyF6wDNTRSGW2MB+K/k5/kvjykbj5X/xtTandqrQI
meta::functor::editable YCK6idpseu9YEyQOH/VIRmaixSpD2Fh9/Zae85p3Z5o
meta::type::alias GXKpeJdADYWyo/tSo2INXijrQlakqaBtfPEHcOI5BGI
meta::type::bootstrap pvkTkoPACRd4InQ7QezB82EYxJJMhbvFZKPGJeN44R0
meta::type::cache R/GhPTCblttoS9U3XHP/UnmfQAv3pH9Q4Wt0oCKWTlc
meta::type::data r27u83LwuNHMNErij+j31pmG0/YiHc9Cz0JS3g0AKPA
meta::type::function +aTLimxYFh3zNR3AwTblpHo32WMmzet3MgkvTQNfU7I
meta::type::hook ivXS9PJvGTKPUaGpYgAqV2dam2DMKwIj5GFUBHstKIg
meta::type::inc utWgF45+/EOqDQ+Yiez7nwDBcBacz+oxdzX3G6AKxHs
meta::type::indicator 0kZ6fU5Gw7XVjKac1A6kna6UOwjWiJB2nTtM+bWYFS8
meta::type::internal_function i5Z/e6riR0QCY6XoP1PZNGqe29wUhWMP2iNbpMakhT0
meta::type::library 2LKXPuOHFk8JgPJF4c/PDwpbg+jWK4/E+jeZaZd+fQY
meta::type::message_color pxp5xSe9bUnOdskJ78dpsSeJO17phMFhVyT12w/YCGA
meta::type::meta E78aF6OgcaZMsgJiEo3sIPzmwen+ib/V8iFLEE2rHaU
meta::type::parent MH85O3I0OH6/ZemosX9G8TmHGyWVcR2TPR9LTp8WldU
meta::type::retriever 3YDISpeCeZ0ymbeXkLIhryRyK1R7fYA8SZkQxwD1d7c
meta::type::state cy3e7h9soIZRo3LkUS85L+6Pz9s2pf4LKBwY7La/YII
retriever::file lOSZ5sIxv78zFrly1i7NEp608wPPnFvPLcAwja2WmyI
retriever::global RQa5dsjawOzXJqAEeMc1PWKmWZqEZYnEtbseQDph3kk
retriever::id uWjP6vgjXeyfpsYSJVVeS5MxmFgSAcyDWvK42znkd9c
retriever::object /qBb5wkKa+URfmjZ3iQFnol8IgPV9lF0UOi6PmIfLWw
retriever::perl DD0+Y+2YiFJ997xsJ33MrySz5MDYb2FTx9SckMnfgPI
__
meta::retriever('code-sdoc', <<'__');
# Lets you specify the SDoc extension manually. For instance:
# code.js::sdoc::foo causes sdoc::foo to be SDoc-rendered using Javascript comments.
my ($name) = @_;
return undef unless $name =~ s/^code\.(\w+)::// and defined retrieve($name);
sdoc($name, $1);
__
meta::retriever('html-sdoc', <<'__');
my ($attribute) = @_;
return undef unless $attribute =~ s/^html::/sdoc::/ and defined retrieve($attribute) || $attribute =~ s/^sdoc::// && defined retrieve($attribute);
sdoc_html($attribute);
__
meta::retriever('markdown-sdoc', <<'__');
my ($attribute) = @_;
return undef unless $attribute =~ s/^markdown(?:\.(\d+))?(\.q)?::/sdoc::/;
my ($adjust, $quote_code) = ($1, $2);
return undef unless defined retrieve($attribute) || $attribute =~ s/^sdoc::// && defined retrieve($attribute);
sdoc_markdown($attribute, adjust => $adjust,
quote_code => $quote_code);
__
meta::retriever('pod-sdoc', <<'__');
my ($attribute) = @_;
return undef unless $attribute =~ s/^pod(?:\.(\d+))?(\.q)?::/sdoc::/;
my ($adjust, $quote_code) = ($1, $2);
return undef unless defined retrieve($attribute) || $attribute =~ s/^sdoc::// && defined retrieve($attribute);
sdoc_pod($attribute, adjust => $adjust,
quote_code => $quote_code);
__
meta::retriever('sdoc', 'exists $data{"sdoc::$_[0]"} ? sdoc("sdoc::$_[0]", extension_for($_[0])) : undef;');
meta::retriever('sdoc-packed', <<'__');
return undef unless $_[0] =~ /^sdoc-packed::(.*)$/;
exists $data{"sdoc::$1"} ? sdoc_packed("sdoc::$1") : undef;
__
meta::retriever('sdocp', <<'__');
return undef unless $_[0] =~ /^sdocp::(.*)$/;
exists $data{"sdoc::$1"} ? sdocp("sdoc::$1") : undef;
__
internal::main();
__DATA__