Mercurial > hg > Members > atton > generated_seminar_slides
annotate slides/20140701/scripts/prettify.js @ 138:ae4746c201f9 default tip
auto-Update generated slides by script
author | atton <atton@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 17 Jan 2017 17:18:05 +0900 |
parents | d4e4ecc1c347 |
children |
rev | line source |
---|---|
104
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 // Copyright (C) 2006 Google Inc. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 // |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 // Licensed under the Apache License, Version 2.0 (the "License"); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 // you may not use this file except in compliance with the License. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 // You may obtain a copy of the License at |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 // |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 // http://www.apache.org/licenses/LICENSE-2.0 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 // |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 // Unless required by applicable law or agreed to in writing, software |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 // distributed under the License is distributed on an "AS IS" BASIS, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 // See the License for the specific language governing permissions and |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13 // limitations under the License. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
15 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16 /** |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 * @fileoverview |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18 * some functions for browser-side pretty printing of code contained in html. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19 * |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20 * <p> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 * For a fairly comprehensive set of languages see the |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
22 * <a href="http://google-code-prettify.googlecode.com/svn/trunk/README.html#langs">README</a> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 * file that came with this source. At a minimum, the lexer should work on a |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 * number of languages including C and friends, Java, Python, Bash, SQL, HTML, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25 * XML, CSS, Javascript, and Makefiles. It works passably on Ruby, PHP and Awk |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 * and a subset of Perl, but, because of commenting conventions, doesn't work on |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28 * <p> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 * Usage: <ol> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
30 * <li> include this source file in an html page via |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
31 * {@code <script type="text/javascript" src="/path/to/prettify.js"></script>} |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32 * <li> define style rules. See the example page for examples. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33 * <li> mark the {@code <pre>} and {@code <code>} tags in your source with |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
34 * {@code class=prettyprint.} |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
35 * You can also use the (html deprecated) {@code <xmp>} tag, but the pretty |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
36 * printer needs to do more substantial DOM manipulations to support that, so |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
37 * some css styles may not be preserved. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
38 * </ol> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
39 * That's it. I wanted to keep the API as simple as possible, so there's no |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 * need to specify which language the code is in, but if you wish, you can add |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41 * another class to the {@code <pre>} or {@code <code>} element to specify the |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
42 * language, as in {@code <pre class="prettyprint lang-java">}. Any class that |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
43 * starts with "lang-" followed by a file extension, specifies the file type. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
44 * See the "lang-*.js" files in this directory for code that implements |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
45 * per-language file handlers. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46 * <p> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
47 * Change log:<br> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
48 * cbeust, 2006/08/22 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
49 * <blockquote> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
50 * Java annotations (start with "@") are now captured as literals ("lit") |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
51 * </blockquote> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
52 * @requires console |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
53 */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
54 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
55 // JSLint declarations |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
56 /*global console, document, navigator, setTimeout, window */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
57 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
58 /** |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
59 * Split {@code prettyPrint} into multiple timeouts so as not to interfere with |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
60 * UI events. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
61 * If set to {@code false}, {@code prettyPrint()} is synchronous. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
62 */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
63 window['PR_SHOULD_USE_CONTINUATION'] = true; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
64 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
65 /** the number of characters between tab columns */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
66 window['PR_TAB_WIDTH'] = 8; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
67 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
68 /** Contains functions for creating and registering new language handlers. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
69 * @type {Object} |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
70 */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
71 window['PR'] |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
72 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
73 /** Pretty print a chunk of code. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
74 * |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
75 * @param {string} sourceCodeHtml code as html |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
76 * @return {string} code as html, but prettier |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
77 */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
78 = window['prettyPrintOne'] |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
79 /** Find all the {@code <pre>} and {@code <code>} tags in the DOM with |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
80 * {@code class=prettyprint} and prettify them. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
81 * @param {Function?} opt_whenDone if specified, called when the last entry |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
82 * has been finished. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
83 */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
84 = window['prettyPrint'] = void 0; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
85 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
86 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
87 (function () { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
88 // Keyword lists for various languages. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
89 var FLOW_CONTROL_KEYWORDS = |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
90 "break continue do else for if return while "; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
91 var C_KEYWORDS = FLOW_CONTROL_KEYWORDS + "auto case char const default " + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
92 "double enum extern float goto int long register short signed sizeof " + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
93 "static struct switch typedef union unsigned void volatile "; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
94 var COMMON_KEYWORDS = C_KEYWORDS + "catch class delete false import " + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
95 "new operator private protected public this throw true try typeof "; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
96 var CPP_KEYWORDS = COMMON_KEYWORDS + "alignof align_union asm axiom bool " + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
97 "concept concept_map const_cast constexpr decltype " + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
98 "dynamic_cast explicit export friend inline late_check " + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
99 "mutable namespace nullptr reinterpret_cast static_assert static_cast " + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
100 "template typeid typename using virtual wchar_t where "; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
101 var JAVA_KEYWORDS = COMMON_KEYWORDS + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
102 "abstract boolean byte extends final finally implements import " + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
103 "instanceof null native package strictfp super synchronized throws " + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
104 "transient "; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
105 var CSHARP_KEYWORDS = JAVA_KEYWORDS + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
106 "as base by checked decimal delegate descending dynamic event " + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
107 "fixed foreach from group implicit in interface internal into is lock " + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
108 "object out override orderby params partial readonly ref sbyte sealed " + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
109 "stackalloc string select uint ulong unchecked unsafe ushort var "; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
110 var COFFEE_KEYWORDS = "all and by catch class else extends false finally " + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
111 "for if in is isnt loop new no not null of off on or return super then " + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
112 "true try unless until when while yes "; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
113 var JSCRIPT_KEYWORDS = COMMON_KEYWORDS + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
114 "debugger eval export function get null set undefined var with " + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
115 "Infinity NaN "; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
116 var PERL_KEYWORDS = "caller delete die do dump elsif eval exit foreach for " + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
117 "goto if import last local my next no our print package redo require " + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
118 "sub undef unless until use wantarray while BEGIN END "; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
119 var PYTHON_KEYWORDS = FLOW_CONTROL_KEYWORDS + "and as assert class def del " + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
120 "elif except exec finally from global import in is lambda " + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
121 "nonlocal not or pass print raise try with yield " + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
122 "False True None "; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
123 var RUBY_KEYWORDS = FLOW_CONTROL_KEYWORDS + "alias and begin case class def" + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
124 " defined elsif end ensure false in module next nil not or redo rescue " + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
125 "retry self super then true undef unless until when yield BEGIN END "; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
126 var SH_KEYWORDS = FLOW_CONTROL_KEYWORDS + "case done elif esac eval fi " + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
127 "function in local set then until "; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
128 var ALL_KEYWORDS = ( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
129 CPP_KEYWORDS + CSHARP_KEYWORDS + JSCRIPT_KEYWORDS + PERL_KEYWORDS + |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
130 PYTHON_KEYWORDS + RUBY_KEYWORDS + SH_KEYWORDS); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
131 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
132 // token style names. correspond to css classes |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
133 /** token style for a string literal */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
134 var PR_STRING = 'str'; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
135 /** token style for a keyword */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
136 var PR_KEYWORD = 'kwd'; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
137 /** token style for a comment */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
138 var PR_COMMENT = 'com'; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
139 /** token style for a type */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
140 var PR_TYPE = 'typ'; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
141 /** token style for a literal value. e.g. 1, null, true. */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
142 var PR_LITERAL = 'lit'; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
143 /** token style for a punctuation string. */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
144 var PR_PUNCTUATION = 'pun'; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
145 /** token style for a punctuation string. */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
146 var PR_PLAIN = 'pln'; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
147 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
148 /** token style for an sgml tag. */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
149 var PR_TAG = 'tag'; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
150 /** token style for a markup declaration such as a DOCTYPE. */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
151 var PR_DECLARATION = 'dec'; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
152 /** token style for embedded source. */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
153 var PR_SOURCE = 'src'; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
154 /** token style for an sgml attribute name. */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
155 var PR_ATTRIB_NAME = 'atn'; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
156 /** token style for an sgml attribute value. */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
157 var PR_ATTRIB_VALUE = 'atv'; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
158 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
159 /** |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
160 * A class that indicates a section of markup that is not code, e.g. to allow |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
161 * embedding of line numbers within code listings. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
162 */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
163 var PR_NOCODE = 'nocode'; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
164 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
165 /** A set of tokens that can precede a regular expression literal in |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
166 * javascript. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
167 * http://www.mozilla.org/js/language/js20/rationale/syntax.html has the full |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
168 * list, but I've removed ones that might be problematic when seen in |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
169 * languages that don't support regular expression literals. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
170 * |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
171 * <p>Specifically, I've removed any keywords that can't precede a regexp |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
172 * literal in a syntactically legal javascript program, and I've removed the |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
173 * "in" keyword since it's not a keyword in many languages, and might be used |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
174 * as a count of inches. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
175 * |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
176 * <p>The link a above does not accurately describe EcmaScript rules since |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
177 * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
178 * very well in practice. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
179 * |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
180 * @private |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
181 */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
182 var REGEXP_PRECEDER_PATTERN = function () { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
183 var preceders = [ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
184 "!", "!=", "!==", "#", "%", "%=", "&", "&&", "&&=", |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
185 "&=", "(", "*", "*=", /* "+", */ "+=", ",", /* "-", */ "-=", |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
186 "->", /*".", "..", "...", handled below */ "/", "/=", ":", "::", ";", |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
187 "<", "<<", "<<=", "<=", "=", "==", "===", ">", |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
188 ">=", ">>", ">>=", ">>>", ">>>=", "?", "@", "[", |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
189 "^", "^=", "^^", "^^=", "{", "|", "|=", "||", |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
190 "||=", "~" /* handles =~ and !~ */, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
191 "break", "case", "continue", "delete", |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
192 "do", "else", "finally", "instanceof", |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
193 "return", "throw", "try", "typeof" |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
194 ]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
195 var pattern = '(?:^^|[+-]'; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
196 for (var i = 0; i < preceders.length; ++i) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
197 pattern += '|' + preceders[i].replace(/([^=<>:&a-z])/g, '\\$1'); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
198 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
199 pattern += ')\\s*'; // matches at end, and matches empty string |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
200 return pattern; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
201 // CAVEAT: this does not properly handle the case where a regular |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
202 // expression immediately follows another since a regular expression may |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
203 // have flags for case-sensitivity and the like. Having regexp tokens |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
204 // adjacent is not valid in any language I'm aware of, so I'm punting. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
205 // TODO: maybe style special characters inside a regexp as punctuation. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
206 }(); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
207 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
208 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
209 /** |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
210 * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
211 * matches the union of the sets of strings matched by the input RegExp. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
212 * Since it matches globally, if the input strings have a start-of-input |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
213 * anchor (/^.../), it is ignored for the purposes of unioning. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
214 * @param {Array.<RegExp>} regexs non multiline, non-global regexs. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
215 * @return {RegExp} a global regex. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
216 */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
217 function combinePrefixPatterns(regexs) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
218 var capturedGroupIndex = 0; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
219 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
220 var needToFoldCase = false; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
221 var ignoreCase = false; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
222 for (var i = 0, n = regexs.length; i < n; ++i) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
223 var regex = regexs[i]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
224 if (regex.ignoreCase) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
225 ignoreCase = true; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
226 } else if (/[a-z]/i.test(regex.source.replace( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
227 /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
228 needToFoldCase = true; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
229 ignoreCase = false; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
230 break; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
231 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
232 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
233 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
234 function decodeEscape(charsetPart) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
235 if (charsetPart.charAt(0) !== '\\') { return charsetPart.charCodeAt(0); } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
236 switch (charsetPart.charAt(1)) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
237 case 'b': return 8; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
238 case 't': return 9; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
239 case 'n': return 0xa; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
240 case 'v': return 0xb; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
241 case 'f': return 0xc; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
242 case 'r': return 0xd; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
243 case 'u': case 'x': |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
244 return parseInt(charsetPart.substring(2), 16) |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
245 || charsetPart.charCodeAt(1); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
246 case '0': case '1': case '2': case '3': case '4': |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
247 case '5': case '6': case '7': |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
248 return parseInt(charsetPart.substring(1), 8); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
249 default: return charsetPart.charCodeAt(1); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
250 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
251 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
252 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
253 function encodeEscape(charCode) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
254 if (charCode < 0x20) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
255 return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
256 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
257 var ch = String.fromCharCode(charCode); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
258 if (ch === '\\' || ch === '-' || ch === '[' || ch === ']') { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
259 ch = '\\' + ch; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
260 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
261 return ch; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
262 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
263 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
264 function caseFoldCharset(charSet) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
265 var charsetParts = charSet.substring(1, charSet.length - 1).match( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
266 new RegExp( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
267 '\\\\u[0-9A-Fa-f]{4}' |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
268 + '|\\\\x[0-9A-Fa-f]{2}' |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
269 + '|\\\\[0-3][0-7]{0,2}' |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
270 + '|\\\\[0-7]{1,2}' |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
271 + '|\\\\[\\s\\S]' |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
272 + '|-' |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
273 + '|[^-\\\\]', |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
274 'g')); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
275 var groups = []; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
276 var ranges = []; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
277 var inverse = charsetParts[0] === '^'; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
278 for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
279 var p = charsetParts[i]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
280 switch (p) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
281 case '\\B': case '\\b': |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
282 case '\\D': case '\\d': |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
283 case '\\S': case '\\s': |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
284 case '\\W': case '\\w': |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
285 groups.push(p); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
286 continue; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
287 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
288 var start = decodeEscape(p); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
289 var end; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
290 if (i + 2 < n && '-' === charsetParts[i + 1]) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
291 end = decodeEscape(charsetParts[i + 2]); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
292 i += 2; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
293 } else { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
294 end = start; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
295 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
296 ranges.push([start, end]); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
297 // If the range might intersect letters, then expand it. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
298 if (!(end < 65 || start > 122)) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
299 if (!(end < 65 || start > 90)) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
300 ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
301 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
302 if (!(end < 97 || start > 122)) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
303 ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
304 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
305 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
306 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
307 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
308 // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]] |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
309 // -> [[1, 12], [14, 14], [16, 17]] |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
310 ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1] - a[1]); }); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
311 var consolidatedRanges = []; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
312 var lastRange = [NaN, NaN]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
313 for (var i = 0; i < ranges.length; ++i) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
314 var range = ranges[i]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
315 if (range[0] <= lastRange[1] + 1) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
316 lastRange[1] = Math.max(lastRange[1], range[1]); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
317 } else { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
318 consolidatedRanges.push(lastRange = range); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
319 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
320 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
321 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
322 var out = ['[']; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
323 if (inverse) { out.push('^'); } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
324 out.push.apply(out, groups); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
325 for (var i = 0; i < consolidatedRanges.length; ++i) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
326 var range = consolidatedRanges[i]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
327 out.push(encodeEscape(range[0])); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
328 if (range[1] > range[0]) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
329 if (range[1] + 1 > range[0]) { out.push('-'); } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
330 out.push(encodeEscape(range[1])); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
331 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
332 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
333 out.push(']'); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
334 return out.join(''); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
335 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
336 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
337 function allowAnywhereFoldCaseAndRenumberGroups(regex) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
338 // Split into character sets, escape sequences, punctuation strings |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
339 // like ('(', '(?:', ')', '^'), and runs of characters that do not |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
340 // include any of the above. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
341 var parts = regex.source.match( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
342 new RegExp( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
343 '(?:' |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
344 + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]' // a character set |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
345 + '|\\\\u[A-Fa-f0-9]{4}' // a unicode escape |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
346 + '|\\\\x[A-Fa-f0-9]{2}' // a hex escape |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
347 + '|\\\\[0-9]+' // a back-reference or octal escape |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
348 + '|\\\\[^ux0-9]' // other escape sequence |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
349 + '|\\(\\?[:!=]' // start of a non-capturing group |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
350 + '|[\\(\\)\\^]' // start/emd of a group, or line start |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
351 + '|[^\\x5B\\x5C\\(\\)\\^]+' // run of other characters |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
352 + ')', |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
353 'g')); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
354 var n = parts.length; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
355 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
356 // Maps captured group numbers to the number they will occupy in |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
357 // the output or to -1 if that has not been determined, or to |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
358 // undefined if they need not be capturing in the output. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
359 var capturedGroups = []; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
360 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
361 // Walk over and identify back references to build the capturedGroups |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
362 // mapping. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
363 for (var i = 0, groupIndex = 0; i < n; ++i) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
364 var p = parts[i]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
365 if (p === '(') { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
366 // groups are 1-indexed, so max group index is count of '(' |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
367 ++groupIndex; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
368 } else if ('\\' === p.charAt(0)) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
369 var decimalValue = +p.substring(1); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
370 if (decimalValue && decimalValue <= groupIndex) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
371 capturedGroups[decimalValue] = -1; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
372 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
373 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
374 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
375 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
376 // Renumber groups and reduce capturing groups to non-capturing groups |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
377 // where possible. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
378 for (var i = 1; i < capturedGroups.length; ++i) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
379 if (-1 === capturedGroups[i]) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
380 capturedGroups[i] = ++capturedGroupIndex; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
381 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
382 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
383 for (var i = 0, groupIndex = 0; i < n; ++i) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
384 var p = parts[i]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
385 if (p === '(') { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
386 ++groupIndex; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
387 if (capturedGroups[groupIndex] === undefined) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
388 parts[i] = '(?:'; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
389 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
390 } else if ('\\' === p.charAt(0)) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
391 var decimalValue = +p.substring(1); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
392 if (decimalValue && decimalValue <= groupIndex) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
393 parts[i] = '\\' + capturedGroups[groupIndex]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
394 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
395 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
396 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
397 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
398 // Remove any prefix anchors so that the output will match anywhere. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
399 // ^^ really does mean an anchored match though. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
400 for (var i = 0, groupIndex = 0; i < n; ++i) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
401 if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
402 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
403 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
404 // Expand letters to groups to handle mixing of case-sensitive and |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
405 // case-insensitive patterns if necessary. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
406 if (regex.ignoreCase && needToFoldCase) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
407 for (var i = 0; i < n; ++i) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
408 var p = parts[i]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
409 var ch0 = p.charAt(0); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
410 if (p.length >= 2 && ch0 === '[') { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
411 parts[i] = caseFoldCharset(p); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
412 } else if (ch0 !== '\\') { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
413 // TODO: handle letters in numeric escapes. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
414 parts[i] = p.replace( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
415 /[a-zA-Z]/g, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
416 function (ch) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
417 var cc = ch.charCodeAt(0); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
418 return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']'; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
419 }); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
420 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
421 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
422 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
423 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
424 return parts.join(''); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
425 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
426 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
427 var rewritten = []; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
428 for (var i = 0, n = regexs.length; i < n; ++i) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
429 var regex = regexs[i]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
430 if (regex.global || regex.multiline) { throw new Error('' + regex); } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
431 rewritten.push( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
432 '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')'); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
433 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
434 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
435 return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g'); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
436 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
437 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
438 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
439 /** |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
440 * Split markup into a string of source code and an array mapping ranges in |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
441 * that string to the text nodes in which they appear. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
442 * |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
443 * <p> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
444 * The HTML DOM structure:</p> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
445 * <pre> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
446 * (Element "p" |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
447 * (Element "b" |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
448 * (Text "print ")) ; #1 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
449 * (Text "'Hello '") ; #2 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
450 * (Element "br") ; #3 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
451 * (Text " + 'World';")) ; #4 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
452 * </pre> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
453 * <p> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
454 * corresponds to the HTML |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
455 * {@code <p><b>print </b>'Hello '<br> + 'World';</p>}.</p> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
456 * |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
457 * <p> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
458 * It will produce the output:</p> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
459 * <pre> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
460 * { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
461 * source: "print 'Hello '\n + 'World';", |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
462 * // 1 2 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
463 * // 012345678901234 5678901234567 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
464 * spans: [0, #1, 6, #2, 14, #3, 15, #4] |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
465 * } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
466 * </pre> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
467 * <p> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
468 * where #1 is a reference to the {@code "print "} text node above, and so |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
469 * on for the other text nodes. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
470 * </p> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
471 * |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
472 * <p> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
473 * The {@code} spans array is an array of pairs. Even elements are the start |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
474 * indices of substrings, and odd elements are the text nodes (or BR elements) |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
475 * that contain the text for those substrings. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
476 * Substrings continue until the next index or the end of the source. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
477 * </p> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
478 * |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
479 * @param {Node} node an HTML DOM subtree containing source-code. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
480 * @return {Object} source code and the text nodes in which they occur. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
481 */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
482 function extractSourceSpans(node) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
483 var nocode = /(?:^|\s)nocode(?:\s|$)/; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
484 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
485 var chunks = []; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
486 var length = 0; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
487 var spans = []; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
488 var k = 0; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
489 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
490 var whitespace; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
491 if (node.currentStyle) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
492 whitespace = node.currentStyle.whiteSpace; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
493 } else if (window.getComputedStyle) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
494 whitespace = document.defaultView.getComputedStyle(node, null) |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
495 .getPropertyValue('white-space'); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
496 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
497 var isPreformatted = whitespace && 'pre' === whitespace.substring(0, 3); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
498 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
499 function walk(node) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
500 switch (node.nodeType) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
501 case 1: // Element |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
502 if (nocode.test(node.className)) { return; } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
503 for (var child = node.firstChild; child; child = child.nextSibling) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
504 walk(child); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
505 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
506 var nodeName = node.nodeName; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
507 if ('BR' === nodeName || 'LI' === nodeName) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
508 chunks[k] = '\n'; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
509 spans[k << 1] = length++; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
510 spans[(k++ << 1) | 1] = node; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
511 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
512 break; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
513 case 3: case 4: // Text |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
514 var text = node.nodeValue; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
515 if (text.length) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
516 if (!isPreformatted) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
517 text = text.replace(/[ \t\r\n]+/g, ' '); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
518 } else { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
519 text = text.replace(/\r\n?/g, '\n'); // Normalize newlines. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
520 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
521 // TODO: handle tabs here? |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
522 chunks[k] = text; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
523 spans[k << 1] = length; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
524 length += text.length; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
525 spans[(k++ << 1) | 1] = node; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
526 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
527 break; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
528 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
529 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
530 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
531 walk(node); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
532 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
533 return { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
534 source: chunks.join('').replace(/\n$/, ''), |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
535 spans: spans |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
536 }; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
537 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
538 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
539 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
540 /** |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
541 * Apply the given language handler to sourceCode and add the resulting |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
542 * decorations to out. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
543 * @param {number} basePos the index of sourceCode within the chunk of source |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
544 * whose decorations are already present on out. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
545 */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
546 function appendDecorations(basePos, sourceCode, langHandler, out) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
547 if (!sourceCode) { return; } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
548 var job = { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
549 source: sourceCode, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
550 basePos: basePos |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
551 }; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
552 langHandler(job); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
553 out.push.apply(out, job.decorations); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
554 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
555 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
556 /** Given triples of [style, pattern, context] returns a lexing function, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
557 * The lexing function interprets the patterns to find token boundaries and |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
558 * returns a decoration list of the form |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
559 * [index_0, style_0, index_1, style_1, ..., index_n, style_n] |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
560 * where index_n is an index into the sourceCode, and style_n is a style |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
561 * constant like PR_PLAIN. index_n-1 <= index_n, and style_n-1 applies to |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
562 * all characters in sourceCode[index_n-1:index_n]. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
563 * |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
564 * The stylePatterns is a list whose elements have the form |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
565 * [style : string, pattern : RegExp, DEPRECATED, shortcut : string]. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
566 * |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
567 * Style is a style constant like PR_PLAIN, or can be a string of the |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
568 * form 'lang-FOO', where FOO is a language extension describing the |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
569 * language of the portion of the token in $1 after pattern executes. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
570 * E.g., if style is 'lang-lisp', and group 1 contains the text |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
571 * '(hello (world))', then that portion of the token will be passed to the |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
572 * registered lisp handler for formatting. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
573 * The text before and after group 1 will be restyled using this decorator |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
574 * so decorators should take care that this doesn't result in infinite |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
575 * recursion. For example, the HTML lexer rule for SCRIPT elements looks |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
576 * something like ['lang-js', /<[s]cript>(.+?)<\/script>/]. This may match |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
577 * '<script>foo()<\/script>', which would cause the current decorator to |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
578 * be called with '<script>' which would not match the same rule since |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
579 * group 1 must not be empty, so it would be instead styled as PR_TAG by |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
580 * the generic tag rule. The handler registered for the 'js' extension would |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
581 * then be called with 'foo()', and finally, the current decorator would |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
582 * be called with '<\/script>' which would not match the original rule and |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
583 * so the generic tag rule would identify it as a tag. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
584 * |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
585 * Pattern must only match prefixes, and if it matches a prefix, then that |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
586 * match is considered a token with the same style. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
587 * |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
588 * Context is applied to the last non-whitespace, non-comment token |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
589 * recognized. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
590 * |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
591 * Shortcut is an optional string of characters, any of which, if the first |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
592 * character, gurantee that this pattern and only this pattern matches. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
593 * |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
594 * @param {Array} shortcutStylePatterns patterns that always start with |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
595 * a known character. Must have a shortcut string. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
596 * @param {Array} fallthroughStylePatterns patterns that will be tried in |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
597 * order if the shortcut ones fail. May have shortcuts. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
598 * |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
599 * @return {function (Object)} a |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
600 * function that takes source code and returns a list of decorations. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
601 */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
602 function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
603 var shortcuts = {}; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
604 var tokenizer; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
605 (function () { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
606 var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
607 var allRegexs = []; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
608 var regexKeys = {}; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
609 for (var i = 0, n = allPatterns.length; i < n; ++i) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
610 var patternParts = allPatterns[i]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
611 var shortcutChars = patternParts[3]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
612 if (shortcutChars) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
613 for (var c = shortcutChars.length; --c >= 0;) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
614 shortcuts[shortcutChars.charAt(c)] = patternParts; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
615 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
616 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
617 var regex = patternParts[1]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
618 var k = '' + regex; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
619 if (!regexKeys.hasOwnProperty(k)) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
620 allRegexs.push(regex); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
621 regexKeys[k] = null; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
622 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
623 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
624 allRegexs.push(/[\0-\uffff]/); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
625 tokenizer = combinePrefixPatterns(allRegexs); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
626 })(); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
627 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
628 var nPatterns = fallthroughStylePatterns.length; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
629 var notWs = /\S/; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
630 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
631 /** |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
632 * Lexes job.source and produces an output array job.decorations of style |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
633 * classes preceded by the position at which they start in job.source in |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
634 * order. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
635 * |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
636 * @param {Object} job an object like {@code |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
637 * source: {string} sourceText plain text, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
638 * basePos: {int} position of job.source in the larger chunk of |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
639 * sourceCode. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
640 * } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
641 */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
642 var decorate = function (job) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
643 var sourceCode = job.source, basePos = job.basePos; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
644 /** Even entries are positions in source in ascending order. Odd enties |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
645 * are style markers (e.g., PR_COMMENT) that run from that position until |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
646 * the end. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
647 * @type {Array.<number|string>} |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
648 */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
649 var decorations = [basePos, PR_PLAIN]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
650 var pos = 0; // index into sourceCode |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
651 var tokens = sourceCode.match(tokenizer) || []; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
652 var styleCache = {}; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
653 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
654 for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
655 var token = tokens[ti]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
656 var style = styleCache[token]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
657 var match = void 0; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
658 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
659 var isEmbedded; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
660 if (typeof style === 'string') { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
661 isEmbedded = false; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
662 } else { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
663 var patternParts = shortcuts[token.charAt(0)]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
664 if (patternParts) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
665 match = token.match(patternParts[1]); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
666 style = patternParts[0]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
667 } else { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
668 for (var i = 0; i < nPatterns; ++i) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
669 patternParts = fallthroughStylePatterns[i]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
670 match = token.match(patternParts[1]); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
671 if (match) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
672 style = patternParts[0]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
673 break; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
674 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
675 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
676 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
677 if (!match) { // make sure that we make progress |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
678 style = PR_PLAIN; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
679 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
680 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
681 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
682 isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
683 if (isEmbedded && !(match && typeof match[1] === 'string')) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
684 isEmbedded = false; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
685 style = PR_SOURCE; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
686 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
687 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
688 if (!isEmbedded) { styleCache[token] = style; } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
689 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
690 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
691 var tokenStart = pos; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
692 pos += token.length; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
693 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
694 if (!isEmbedded) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
695 decorations.push(basePos + tokenStart, style); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
696 } else { // Treat group 1 as an embedded block of source code. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
697 var embeddedSource = match[1]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
698 var embeddedSourceStart = token.indexOf(embeddedSource); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
699 var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
700 if (match[2]) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
701 // If embeddedSource can be blank, then it would match at the |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
702 // beginning which would cause us to infinitely recurse on the |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
703 // entire token, so we catch the right context in match[2]. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
704 embeddedSourceEnd = token.length - match[2].length; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
705 embeddedSourceStart = embeddedSourceEnd - embeddedSource.length; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
706 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
707 var lang = style.substring(5); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
708 // Decorate the left of the embedded source |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
709 appendDecorations( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
710 basePos + tokenStart, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
711 token.substring(0, embeddedSourceStart), |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
712 decorate, decorations); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
713 // Decorate the embedded source |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
714 appendDecorations( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
715 basePos + tokenStart + embeddedSourceStart, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
716 embeddedSource, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
717 langHandlerForExtension(lang, embeddedSource), |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
718 decorations); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
719 // Decorate the right of the embedded section |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
720 appendDecorations( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
721 basePos + tokenStart + embeddedSourceEnd, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
722 token.substring(embeddedSourceEnd), |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
723 decorate, decorations); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
724 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
725 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
726 job.decorations = decorations; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
727 }; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
728 return decorate; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
729 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
730 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
731 /** returns a function that produces a list of decorations from source text. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
732 * |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
733 * This code treats ", ', and ` as string delimiters, and \ as a string |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
734 * escape. It does not recognize perl's qq() style strings. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
735 * It has no special handling for double delimiter escapes as in basic, or |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
736 * the tripled delimiters used in python, but should work on those regardless |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
737 * although in those cases a single string literal may be broken up into |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
738 * multiple adjacent string literals. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
739 * |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
740 * It recognizes C, C++, and shell style comments. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
741 * |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
742 * @param {Object} options a set of optional parameters. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
743 * @return {function (Object)} a function that examines the source code |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
744 * in the input job and builds the decoration list. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
745 */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
746 function sourceDecorator(options) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
747 var shortcutStylePatterns = [], fallthroughStylePatterns = []; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
748 if (options['tripleQuotedStrings']) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
749 // '''multi-line-string''', 'single-line-string', and double-quoted |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
750 shortcutStylePatterns.push( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
751 [PR_STRING, /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
752 null, '\'"']); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
753 } else if (options['multiLineStrings']) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
754 // 'multi-line-string', "multi-line-string" |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
755 shortcutStylePatterns.push( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
756 [PR_STRING, /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
757 null, '\'"`']); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
758 } else { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
759 // 'single-line-string', "single-line-string" |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
760 shortcutStylePatterns.push( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
761 [PR_STRING, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
762 /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
763 null, '"\'']); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
764 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
765 if (options['verbatimStrings']) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
766 // verbatim-string-literal production from the C# grammar. See issue 93. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
767 fallthroughStylePatterns.push( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
768 [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
769 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
770 var hc = options['hashComments']; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
771 if (hc) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
772 if (options['cStyleComments']) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
773 if (hc > 1) { // multiline hash comments |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
774 shortcutStylePatterns.push( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
775 [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
776 } else { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
777 // Stop C preprocessor declarations at an unclosed open comment |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
778 shortcutStylePatterns.push( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
779 [PR_COMMENT, /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
780 null, '#']); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
781 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
782 fallthroughStylePatterns.push( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
783 [PR_STRING, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
784 /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
785 null]); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
786 } else { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
787 shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
788 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
789 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
790 if (options['cStyleComments']) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
791 fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
792 fallthroughStylePatterns.push( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
793 [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
794 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
795 if (options['regexLiterals']) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
796 var REGEX_LITERAL = ( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
797 // A regular expression literal starts with a slash that is |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
798 // not followed by * or / so that it is not confused with |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
799 // comments. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
800 '/(?=[^/*])' |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
801 // and then contains any number of raw characters, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
802 + '(?:[^/\\x5B\\x5C]' |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
803 // escape sequences (\x5C), |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
804 + '|\\x5C[\\s\\S]' |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
805 // or non-nesting character sets (\x5B\x5D); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
806 + '|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+' |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
807 // finally closed by a /. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
808 + '/'); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
809 fallthroughStylePatterns.push( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
810 ['lang-regex', |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
811 new RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')') |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
812 ]); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
813 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
814 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
815 var keywords = options['keywords'].replace(/^\s+|\s+$/g, ''); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
816 if (keywords.length) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
817 fallthroughStylePatterns.push( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
818 [PR_KEYWORD, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
819 new RegExp('^(?:' + keywords.replace(/\s+/g, '|') + ')\\b'), null]); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
820 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
821 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
822 shortcutStylePatterns.push([PR_PLAIN, /^\s+/, null, ' \r\n\t\xA0']); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
823 fallthroughStylePatterns.push( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
824 // TODO(mikesamuel): recognize non-latin letters and numerals in idents |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
825 [PR_LITERAL, /^@[a-z_$][a-z_$@0-9]*/i, null], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
826 [PR_TYPE, /^@?[A-Z]+[a-z][A-Za-z_$@0-9]*/, null], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
827 [PR_PLAIN, /^[a-z_$][a-z_$@0-9]*/i, null], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
828 [PR_LITERAL, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
829 new RegExp( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
830 '^(?:' |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
831 // A hex number |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
832 + '0x[a-f0-9]+' |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
833 // or an octal or decimal number, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
834 + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)' |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
835 // possibly in scientific notation |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
836 + '(?:e[+\\-]?\\d+)?' |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
837 + ')' |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
838 // with an optional modifier like UL for unsigned long |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
839 + '[a-z]*', 'i'), |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
840 null, '0123456789'], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
841 // Don't treat escaped quotes in bash as starting strings. See issue 144. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
842 [PR_PLAIN, /^\\[\s\S]?/, null], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
843 [PR_PUNCTUATION, /^.[^\s\w\.$@\'\"\`\/\#\\]*/, null]); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
844 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
845 return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
846 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
847 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
848 var decorateSource = sourceDecorator({ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
849 'keywords': ALL_KEYWORDS, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
850 'hashComments': true, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
851 'cStyleComments': true, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
852 'multiLineStrings': true, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
853 'regexLiterals': true |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
854 }); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
855 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
856 /** |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
857 * Given a DOM subtree, wraps it in a list, and puts each line into its own |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
858 * list item. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
859 * |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
860 * @param {Node} node modified in place. Its content is pulled into an |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
861 * HTMLOListElement, and each line is moved into a separate list item. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
862 * This requires cloning elements, so the input might not have unique |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
863 * IDs after numbering. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
864 */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
865 function numberLines(node, opt_startLineNum) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
866 var nocode = /(?:^|\s)nocode(?:\s|$)/; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
867 var lineBreak = /\r\n?|\n/; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
868 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
869 var document = node.ownerDocument; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
870 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
871 var whitespace; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
872 if (node.currentStyle) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
873 whitespace = node.currentStyle.whiteSpace; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
874 } else if (window.getComputedStyle) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
875 whitespace = document.defaultView.getComputedStyle(node, null) |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
876 .getPropertyValue('white-space'); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
877 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
878 // If it's preformatted, then we need to split lines on line breaks |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
879 // in addition to <BR>s. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
880 var isPreformatted = whitespace && 'pre' === whitespace.substring(0, 3); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
881 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
882 var li = document.createElement('LI'); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
883 while (node.firstChild) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
884 li.appendChild(node.firstChild); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
885 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
886 // An array of lines. We split below, so this is initialized to one |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
887 // un-split line. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
888 var listItems = [li]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
889 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
890 function walk(node) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
891 switch (node.nodeType) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
892 case 1: // Element |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
893 if (nocode.test(node.className)) { break; } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
894 if ('BR' === node.nodeName) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
895 breakAfter(node); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
896 // Discard the <BR> since it is now flush against a </LI>. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
897 if (node.parentNode) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
898 node.parentNode.removeChild(node); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
899 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
900 } else { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
901 for (var child = node.firstChild; child; child = child.nextSibling) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
902 walk(child); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
903 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
904 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
905 break; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
906 case 3: case 4: // Text |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
907 if (isPreformatted) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
908 var text = node.nodeValue; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
909 var match = text.match(lineBreak); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
910 if (match) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
911 var firstLine = text.substring(0, match.index); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
912 node.nodeValue = firstLine; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
913 var tail = text.substring(match.index + match[0].length); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
914 if (tail) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
915 var parent = node.parentNode; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
916 parent.insertBefore( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
917 document.createTextNode(tail), node.nextSibling); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
918 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
919 breakAfter(node); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
920 if (!firstLine) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
921 // Don't leave blank text nodes in the DOM. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
922 node.parentNode.removeChild(node); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
923 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
924 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
925 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
926 break; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
927 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
928 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
929 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
930 // Split a line after the given node. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
931 function breakAfter(lineEndNode) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
932 // If there's nothing to the right, then we can skip ending the line |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
933 // here, and move root-wards since splitting just before an end-tag |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
934 // would require us to create a bunch of empty copies. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
935 while (!lineEndNode.nextSibling) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
936 lineEndNode = lineEndNode.parentNode; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
937 if (!lineEndNode) { return; } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
938 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
939 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
940 function breakLeftOf(limit, copy) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
941 // Clone shallowly if this node needs to be on both sides of the break. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
942 var rightSide = copy ? limit.cloneNode(false) : limit; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
943 var parent = limit.parentNode; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
944 if (parent) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
945 // We clone the parent chain. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
946 // This helps us resurrect important styling elements that cross lines. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
947 // E.g. in <i>Foo<br>Bar</i> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
948 // should be rewritten to <li><i>Foo</i></li><li><i>Bar</i></li>. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
949 var parentClone = breakLeftOf(parent, 1); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
950 // Move the clone and everything to the right of the original |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
951 // onto the cloned parent. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
952 var next = limit.nextSibling; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
953 parentClone.appendChild(rightSide); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
954 for (var sibling = next; sibling; sibling = next) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
955 next = sibling.nextSibling; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
956 parentClone.appendChild(sibling); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
957 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
958 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
959 return rightSide; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
960 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
961 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
962 var copiedListItem = breakLeftOf(lineEndNode.nextSibling, 0); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
963 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
964 // Walk the parent chain until we reach an unattached LI. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
965 for (var parent; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
966 // Check nodeType since IE invents document fragments. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
967 (parent = copiedListItem.parentNode) && parent.nodeType === 1;) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
968 copiedListItem = parent; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
969 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
970 // Put it on the list of lines for later processing. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
971 listItems.push(copiedListItem); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
972 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
973 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
974 // Split lines while there are lines left to split. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
975 for (var i = 0; // Number of lines that have been split so far. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
976 i < listItems.length; // length updated by breakAfter calls. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
977 ++i) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
978 walk(listItems[i]); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
979 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
980 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
981 // Make sure numeric indices show correctly. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
982 if (opt_startLineNum === (opt_startLineNum|0)) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
983 listItems[0].setAttribute('value', opt_startLineNum); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
984 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
985 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
986 var ol = document.createElement('OL'); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
987 ol.className = 'linenums'; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
988 var offset = Math.max(0, ((opt_startLineNum - 1 /* zero index */)) | 0) || 0; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
989 for (var i = 0, n = listItems.length; i < n; ++i) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
990 li = listItems[i]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
991 // Stick a class on the LIs so that stylesheets can |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
992 // color odd/even rows, or any other row pattern that |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
993 // is co-prime with 10. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
994 li.className = 'L' + ((i + offset) % 10); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
995 if (!li.firstChild) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
996 li.appendChild(document.createTextNode('\xA0')); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
997 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
998 ol.appendChild(li); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
999 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1000 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1001 node.appendChild(ol); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1002 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1003 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1004 /** |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1005 * Breaks {@code job.source} around style boundaries in {@code job.decorations} |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1006 * and modifies {@code job.sourceNode} in place. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1007 * @param {Object} job like <pre>{ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1008 * source: {string} source as plain text, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1009 * spans: {Array.<number|Node>} alternating span start indices into source |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1010 * and the text node or element (e.g. {@code <BR>}) corresponding to that |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1011 * span. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1012 * decorations: {Array.<number|string} an array of style classes preceded |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1013 * by the position at which they start in job.source in order |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1014 * }</pre> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1015 * @private |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1016 */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1017 function recombineTagsAndDecorations(job) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1018 var isIE = /\bMSIE\b/.test(navigator.userAgent); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1019 var newlineRe = /\n/g; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1020 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1021 var source = job.source; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1022 var sourceLength = source.length; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1023 // Index into source after the last code-unit recombined. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1024 var sourceIndex = 0; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1025 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1026 var spans = job.spans; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1027 var nSpans = spans.length; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1028 // Index into spans after the last span which ends at or before sourceIndex. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1029 var spanIndex = 0; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1030 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1031 var decorations = job.decorations; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1032 var nDecorations = decorations.length; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1033 // Index into decorations after the last decoration which ends at or before sourceIndex. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1034 var decorationIndex = 0; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1035 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1036 // Simplify decorations. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1037 var decPos = 0; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1038 for (var i = 0; i < nDecorations;) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1039 // Skip over any zero-length decorations. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1040 var startPos = decorations[i]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1041 var start = i; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1042 while (start + 2 < nDecorations && decorations[start + 2] === startPos) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1043 start += 2; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1044 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1045 // Conflate all adjacent decorations that use the same style. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1046 var startDec = decorations[start + 1]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1047 var end = start + 2; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1048 while (end + 2 <= nDecorations |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1049 && (decorations[end + 1] === startDec |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1050 || decorations[end] === decorations[end + 2])) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1051 end += 2; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1052 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1053 decorations[decPos++] = startPos; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1054 decorations[decPos++] = startDec; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1055 i = end; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1056 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1057 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1058 // Strip any zero-length decoration at the end. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1059 if (decPos && decorations[decPos - 2] === sourceLength) { decPos -= 2; } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1060 nDecorations = decorations.length = decPos; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1061 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1062 var decoration = null; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1063 while (spanIndex < nSpans) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1064 var spanStart = spans[spanIndex]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1065 var spanEnd = spans[spanIndex + 2] || sourceLength; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1066 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1067 var decStart = decorations[decorationIndex]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1068 var decEnd = decorations[decorationIndex + 2] || sourceLength; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1069 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1070 var end = Math.min(spanEnd, decEnd); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1071 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1072 var textNode = spans[spanIndex + 1]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1073 if (textNode.nodeType !== 1) { // Don't muck with <BR>s or <LI>s |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1074 var styledText = source.substring(sourceIndex, end); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1075 // This may seem bizarre, and it is. Emitting LF on IE causes the |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1076 // code to display with spaces instead of line breaks. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1077 // Emitting Windows standard issue linebreaks (CRLF) causes a blank |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1078 // space to appear at the beginning of every line but the first. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1079 // Emitting an old Mac OS 9 line separator makes everything spiffy. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1080 if (isIE) { styledText = styledText.replace(newlineRe, '\r'); } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1081 textNode.nodeValue = styledText; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1082 var document = textNode.ownerDocument; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1083 var span = document.createElement('SPAN'); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1084 span.className = decorations[decorationIndex + 1]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1085 var parentNode = textNode.parentNode; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1086 parentNode.replaceChild(span, textNode); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1087 span.appendChild(textNode); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1088 if (sourceIndex < spanEnd) { // Split off a text node. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1089 spans[spanIndex + 1] = textNode |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1090 // TODO: Possibly optimize by using '' if there's no flicker. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1091 = document.createTextNode(source.substring(end, spanEnd)); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1092 parentNode.insertBefore(textNode, span.nextSibling); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1093 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1094 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1095 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1096 sourceIndex = end; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1097 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1098 if (sourceIndex >= spanEnd) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1099 spanIndex += 2; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1100 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1101 if (sourceIndex >= decEnd) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1102 decorationIndex += 2; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1103 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1104 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1105 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1106 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1107 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1108 /** Maps language-specific file extensions to handlers. */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1109 var langHandlerRegistry = {}; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1110 /** Register a language handler for the given file extensions. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1111 * @param {function (Object)} handler a function from source code to a list |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1112 * of decorations. Takes a single argument job which describes the |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1113 * state of the computation. The single parameter has the form |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1114 * {@code { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1115 * source: {string} as plain text. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1116 * decorations: {Array.<number|string>} an array of style classes |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1117 * preceded by the position at which they start in |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1118 * job.source in order. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1119 * The language handler should assigned this field. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1120 * basePos: {int} the position of source in the larger source chunk. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1121 * All positions in the output decorations array are relative |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1122 * to the larger source chunk. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1123 * } } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1124 * @param {Array.<string>} fileExtensions |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1125 */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1126 function registerLangHandler(handler, fileExtensions) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1127 for (var i = fileExtensions.length; --i >= 0;) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1128 var ext = fileExtensions[i]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1129 if (!langHandlerRegistry.hasOwnProperty(ext)) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1130 langHandlerRegistry[ext] = handler; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1131 } else if ('console' in window) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1132 console['warn']('cannot override language handler %s', ext); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1133 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1134 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1135 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1136 function langHandlerForExtension(extension, source) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1137 if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1138 // Treat it as markup if the first non whitespace character is a < and |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1139 // the last non-whitespace character is a >. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1140 extension = /^\s*</.test(source) |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1141 ? 'default-markup' |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1142 : 'default-code'; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1143 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1144 return langHandlerRegistry[extension]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1145 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1146 registerLangHandler(decorateSource, ['default-code']); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1147 registerLangHandler( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1148 createSimpleLexer( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1149 [], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1150 [ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1151 [PR_PLAIN, /^[^<?]+/], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1152 [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1153 [PR_COMMENT, /^<\!--[\s\S]*?(?:-\->|$)/], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1154 // Unescaped content in an unknown language |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1155 ['lang-', /^<\?([\s\S]+?)(?:\?>|$)/], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1156 ['lang-', /^<%([\s\S]+?)(?:%>|$)/], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1157 [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1158 ['lang-', /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1159 // Unescaped content in javascript. (Or possibly vbscript). |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1160 ['lang-js', /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1161 // Contains unescaped stylesheet content |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1162 ['lang-css', /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1163 ['lang-in.tag', /^(<\/?[a-z][^<>]*>)/i] |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1164 ]), |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1165 ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1166 registerLangHandler( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1167 createSimpleLexer( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1168 [ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1169 [PR_PLAIN, /^[\s]+/, null, ' \t\r\n'], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1170 [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\''] |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1171 ], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1172 [ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1173 [PR_TAG, /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1174 [PR_ATTRIB_NAME, /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1175 ['lang-uq.val', /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1176 [PR_PUNCTUATION, /^[=<>\/]+/], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1177 ['lang-js', /^on\w+\s*=\s*\"([^\"]+)\"/i], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1178 ['lang-js', /^on\w+\s*=\s*\'([^\']+)\'/i], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1179 ['lang-js', /^on\w+\s*=\s*([^\"\'>\s]+)/i], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1180 ['lang-css', /^style\s*=\s*\"([^\"]+)\"/i], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1181 ['lang-css', /^style\s*=\s*\'([^\']+)\'/i], |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1182 ['lang-css', /^style\s*=\s*([^\"\'>\s]+)/i] |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1183 ]), |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1184 ['in.tag']); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1185 registerLangHandler( |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1186 createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1187 registerLangHandler(sourceDecorator({ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1188 'keywords': CPP_KEYWORDS, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1189 'hashComments': true, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1190 'cStyleComments': true |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1191 }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1192 registerLangHandler(sourceDecorator({ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1193 'keywords': 'null true false' |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1194 }), ['json']); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1195 registerLangHandler(sourceDecorator({ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1196 'keywords': CSHARP_KEYWORDS, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1197 'hashComments': true, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1198 'cStyleComments': true, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1199 'verbatimStrings': true |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1200 }), ['cs']); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1201 registerLangHandler(sourceDecorator({ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1202 'keywords': JAVA_KEYWORDS, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1203 'cStyleComments': true |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1204 }), ['java']); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1205 registerLangHandler(sourceDecorator({ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1206 'keywords': SH_KEYWORDS, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1207 'hashComments': true, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1208 'multiLineStrings': true |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1209 }), ['bsh', 'csh', 'sh']); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1210 registerLangHandler(sourceDecorator({ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1211 'keywords': PYTHON_KEYWORDS, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1212 'hashComments': true, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1213 'multiLineStrings': true, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1214 'tripleQuotedStrings': true |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1215 }), ['cv', 'py']); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1216 registerLangHandler(sourceDecorator({ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1217 'keywords': PERL_KEYWORDS, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1218 'hashComments': true, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1219 'multiLineStrings': true, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1220 'regexLiterals': true |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1221 }), ['perl', 'pl', 'pm']); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1222 registerLangHandler(sourceDecorator({ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1223 'keywords': RUBY_KEYWORDS, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1224 'hashComments': true, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1225 'multiLineStrings': true, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1226 'regexLiterals': true |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1227 }), ['rb']); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1228 registerLangHandler(sourceDecorator({ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1229 'keywords': JSCRIPT_KEYWORDS, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1230 'cStyleComments': true, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1231 'regexLiterals': true |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1232 }), ['js']); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1233 registerLangHandler(sourceDecorator({ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1234 'keywords': COFFEE_KEYWORDS, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1235 'hashComments': 3, // ### style block comments |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1236 'cStyleComments': true, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1237 'multilineStrings': true, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1238 'tripleQuotedStrings': true, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1239 'regexLiterals': true |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1240 }), ['coffee']); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1241 registerLangHandler(createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1242 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1243 function applyDecorator(job) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1244 var opt_langExtension = job.langExtension; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1245 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1246 try { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1247 // Extract tags, and convert the source code to plain text. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1248 var sourceAndSpans = extractSourceSpans(job.sourceNode); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1249 /** Plain text. @type {string} */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1250 var source = sourceAndSpans.source; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1251 job.source = source; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1252 job.spans = sourceAndSpans.spans; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1253 job.basePos = 0; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1254 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1255 // Apply the appropriate language handler |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1256 langHandlerForExtension(opt_langExtension, source)(job); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1257 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1258 // Integrate the decorations and tags back into the source code, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1259 // modifying the sourceNode in place. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1260 recombineTagsAndDecorations(job); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1261 } catch (e) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1262 if ('console' in window) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1263 console['log'](e && e['stack'] ? e['stack'] : e); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1264 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1265 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1266 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1267 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1268 /** |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1269 * @param sourceCodeHtml {string} The HTML to pretty print. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1270 * @param opt_langExtension {string} The language name to use. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1271 * Typically, a filename extension like 'cpp' or 'java'. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1272 * @param opt_numberLines {number|boolean} True to number lines, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1273 * or the 1-indexed number of the first line in sourceCodeHtml. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1274 */ |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1275 function prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1276 var container = document.createElement('PRE'); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1277 // This could cause images to load and onload listeners to fire. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1278 // E.g. <img onerror="alert(1337)" src="nosuchimage.png">. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1279 // We assume that the inner HTML is from a trusted source. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1280 container.innerHTML = sourceCodeHtml; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1281 if (opt_numberLines) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1282 numberLines(container, opt_numberLines); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1283 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1284 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1285 var job = { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1286 langExtension: opt_langExtension, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1287 numberLines: opt_numberLines, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1288 sourceNode: container |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1289 }; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1290 applyDecorator(job); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1291 return container.innerHTML; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1292 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1293 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1294 function prettyPrint(opt_whenDone) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1295 function byTagName(tn) { return document.getElementsByTagName(tn); } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1296 // fetch a list of nodes to rewrite |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1297 var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1298 var elements = []; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1299 for (var i = 0; i < codeSegments.length; ++i) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1300 for (var j = 0, n = codeSegments[i].length; j < n; ++j) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1301 elements.push(codeSegments[i][j]); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1302 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1303 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1304 codeSegments = null; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1305 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1306 var clock = Date; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1307 if (!clock['now']) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1308 clock = { 'now': function () { return (new Date).getTime(); } }; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1309 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1310 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1311 // The loop is broken into a series of continuations to make sure that we |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1312 // don't make the browser unresponsive when rewriting a large page. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1313 var k = 0; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1314 var prettyPrintingJob; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1315 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1316 function doWork() { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1317 var endTime = (window['PR_SHOULD_USE_CONTINUATION'] ? |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1318 clock.now() + 250 /* ms */ : |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1319 Infinity); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1320 for (; k < elements.length && clock.now() < endTime; k++) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1321 var cs = elements[k]; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1322 if (cs.className && cs.className.indexOf('prettyprint') >= 0) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1323 // If the classes includes a language extensions, use it. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1324 // Language extensions can be specified like |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1325 // <pre class="prettyprint lang-cpp"> |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1326 // the language extension "cpp" is used to find a language handler as |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1327 // passed to PR.registerLangHandler. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1328 var langExtension = cs.className.match(/\blang-(\w+)\b/); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1329 if (langExtension) { langExtension = langExtension[1]; } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1330 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1331 // make sure this is not nested in an already prettified element |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1332 var nested = false; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1333 for (var p = cs.parentNode; p; p = p.parentNode) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1334 if ((p.tagName === 'pre' || p.tagName === 'code' || |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1335 p.tagName === 'xmp') && |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1336 p.className && p.className.indexOf('prettyprint') >= 0) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1337 nested = true; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1338 break; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1339 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1340 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1341 if (!nested) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1342 // Look for a class like linenums or linenums:<n> where <n> is the |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1343 // 1-indexed number of the first line. |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1344 var lineNums = cs.className.match(/\blinenums\b(?::(\d+))?/); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1345 lineNums = lineNums |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1346 ? lineNums[1] && lineNums[1].length ? +lineNums[1] : true |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1347 : false; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1348 if (lineNums) { numberLines(cs, lineNums); } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1349 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1350 // do the pretty printing |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1351 prettyPrintingJob = { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1352 langExtension: langExtension, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1353 sourceNode: cs, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1354 numberLines: lineNums |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1355 }; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1356 applyDecorator(prettyPrintingJob); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1357 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1358 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1359 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1360 if (k < elements.length) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1361 // finish up in a continuation |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1362 setTimeout(doWork, 250); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1363 } else if (opt_whenDone) { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1364 opt_whenDone(); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1365 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1366 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1367 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1368 doWork(); |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1369 } |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1370 |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1371 window['prettyPrintOne'] = prettyPrintOne; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1372 window['prettyPrint'] = prettyPrint; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1373 window['PR'] = { |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1374 'createSimpleLexer': createSimpleLexer, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1375 'registerLangHandler': registerLangHandler, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1376 'sourceDecorator': sourceDecorator, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1377 'PR_ATTRIB_NAME': PR_ATTRIB_NAME, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1378 'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1379 'PR_COMMENT': PR_COMMENT, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1380 'PR_DECLARATION': PR_DECLARATION, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1381 'PR_KEYWORD': PR_KEYWORD, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1382 'PR_LITERAL': PR_LITERAL, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1383 'PR_NOCODE': PR_NOCODE, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1384 'PR_PLAIN': PR_PLAIN, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1385 'PR_PUNCTUATION': PR_PUNCTUATION, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1386 'PR_SOURCE': PR_SOURCE, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1387 'PR_STRING': PR_STRING, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1388 'PR_TAG': PR_TAG, |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1389 'PR_TYPE': PR_TYPE |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1390 }; |
d4e4ecc1c347
auto-Update generated slides by script
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1391 })(); |