ruby-uv 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README.rdoc +79 -0
- data/Rakefile +1 -0
- data/bin/theme2latexrender +122 -0
- data/bin/theme2xhtmlrender +158 -0
- data/bin/uv +140 -0
- data/lib/uv/engine.rb +4 -0
- data/lib/uv/render_processor.rb +140 -0
- data/lib/uv/utility.rb +67 -0
- data/lib/uv/version.rb +3 -0
- data/lib/uv.rb +98 -0
- data/render/latex/active4d.render +132 -0
- data/render/latex/all_hallows_eve.render +96 -0
- data/render/latex/amy.render +171 -0
- data/render/latex/blackboard.render +111 -0
- data/render/latex/brilliance_black.render +552 -0
- data/render/latex/brilliance_dull.render +561 -0
- data/render/latex/cobalt.render +162 -0
- data/render/latex/dawn.render +126 -0
- data/render/latex/eiffel.render +132 -0
- data/render/latex/espresso_libre.render +123 -0
- data/render/latex/idle.render +93 -0
- data/render/latex/iplastic.render +99 -0
- data/render/latex/lazy.render +96 -0
- data/render/latex/mac_classic.render +135 -0
- data/render/latex/magicwb_amiga.render +117 -0
- data/render/latex/pastels_on_dark.render +204 -0
- data/render/latex/slush_poppies.render +123 -0
- data/render/latex/spacecadet.render +81 -0
- data/render/latex/sunburst.render +186 -0
- data/render/latex/twilight.render +153 -0
- data/render/latex/zenburnesque.render +126 -0
- data/render/old/txt2tags.render +131 -0
- data/render/xhtml/active4d.render +140 -0
- data/render/xhtml/all_hallows_eve.render +104 -0
- data/render/xhtml/amy.render +179 -0
- data/render/xhtml/blackboard.render +119 -0
- data/render/xhtml/brilliance_black.render +560 -0
- data/render/xhtml/brilliance_dull.render +569 -0
- data/render/xhtml/cobalt.render +170 -0
- data/render/xhtml/dawn.render +134 -0
- data/render/xhtml/eiffel.render +140 -0
- data/render/xhtml/espresso_libre.render +131 -0
- data/render/xhtml/idle.render +101 -0
- data/render/xhtml/iplastic.render +107 -0
- data/render/xhtml/lazy.render +104 -0
- data/render/xhtml/mac_classic.render +143 -0
- data/render/xhtml/magicwb_amiga.render +125 -0
- data/render/xhtml/pastels_on_dark.render +212 -0
- data/render/xhtml/railscasts.render +93 -0
- data/render/xhtml/slush_poppies.render +131 -0
- data/render/xhtml/spacecadet.render +83 -0
- data/render/xhtml/sunburst.render +194 -0
- data/render/xhtml/twilight.render +161 -0
- data/render/xhtml/zenburnesque.render +134 -0
- data/ruby-uv.gemspec +24 -0
- data/syntax/actionscript.syntax +97 -0
- data/syntax/active4d.syntax +276 -0
- data/syntax/active4d_html.syntax +311 -0
- data/syntax/active4d_ini.syntax +50 -0
- data/syntax/active4d_library.syntax +21 -0
- data/syntax/ada.syntax +33 -0
- data/syntax/antlr.syntax +151 -0
- data/syntax/apache.syntax +191 -0
- data/syntax/applescript.syntax +384 -0
- data/syntax/asp.syntax +70 -0
- data/syntax/asp_vb.net.syntax +129 -0
- data/syntax/bibtex.syntax +151 -0
- data/syntax/blog_html.syntax +41 -0
- data/syntax/blog_markdown.syntax +42 -0
- data/syntax/blog_text.syntax +27 -0
- data/syntax/blog_textile.syntax +27 -0
- data/syntax/build.syntax +53 -0
- data/syntax/bulletin_board.syntax +287 -0
- data/syntax/cake.syntax +55 -0
- data/syntax/camlp4.syntax +36 -0
- data/syntax/cm.syntax +32 -0
- data/syntax/coldfusion.syntax +119 -0
- data/syntax/context_free.syntax +176 -0
- data/syntax/cs.syntax +59 -0
- data/syntax/css.syntax +195 -0
- data/syntax/css_experimental.syntax +1925 -0
- data/syntax/csv.syntax +68 -0
- data/syntax/d.syntax +142 -0
- data/syntax/diff.syntax +81 -0
- data/syntax/dokuwiki.syntax +204 -0
- data/syntax/dot.syntax +47 -0
- data/syntax/doxygen.syntax +43 -0
- data/syntax/dylan.syntax +62 -0
- data/syntax/eiffel.syntax +78 -0
- data/syntax/erlang.syntax +922 -0
- data/syntax/f-script.syntax +80 -0
- data/syntax/fortran.syntax +141 -0
- data/syntax/fxscript.syntax +142 -0
- data/syntax/greasemonkey.syntax +34 -0
- data/syntax/gri.syntax +83 -0
- data/syntax/groovy.syntax +191 -0
- data/syntax/gtd.syntax +22 -0
- data/syntax/gtdalt.syntax +143 -0
- data/syntax/haml.syntax +88 -0
- data/syntax/haskell.syntax +88 -0
- data/syntax/html-asp.syntax +27 -0
- data/syntax/html.syntax +362 -0
- data/syntax/html_django.syntax +36 -0
- data/syntax/html_for_asp.net.syntax +424 -0
- data/syntax/html_mason.syntax +119 -0
- data/syntax/html_rails.syntax +40 -0
- data/syntax/html_tcl.syntax +26 -0
- data/syntax/icalendar.syntax +32 -0
- data/syntax/inform.syntax +48 -0
- data/syntax/ini.syntax +55 -0
- data/syntax/installer_distribution_script.syntax +77 -0
- data/syntax/io.syntax +81 -0
- data/syntax/java.syntax +211 -0
- data/syntax/javaproperties.syntax +20 -0
- data/syntax/javascript.syntax +256 -0
- data/syntax/javascript_+_prototype.syntax +72 -0
- data/syntax/javascript_+_prototype_bracketed.syntax +140 -0
- data/syntax/jquery_javascript.syntax +114 -0
- data/syntax/json.syntax +136 -0
- data/syntax/languagedefinition.syntax +708 -0
- data/syntax/latex.syntax +566 -0
- data/syntax/latex_beamer.syntax +41 -0
- data/syntax/latex_log.syntax +50 -0
- data/syntax/latex_memoir.syntax +64 -0
- data/syntax/lexflex.syntax +219 -0
- data/syntax/lighttpd.syntax +54 -0
- data/syntax/lilypond.syntax +492 -0
- data/syntax/lisp.syntax +61 -0
- data/syntax/literate_haskell.syntax +24 -0
- data/syntax/logo.syntax +29 -0
- data/syntax/logtalk.syntax +152 -0
- data/syntax/lua.syntax +86 -0
- data/syntax/m.syntax +142 -0
- data/syntax/macports_portfile.syntax +163 -0
- data/syntax/makefile.syntax +36 -0
- data/syntax/man.syntax +17 -0
- data/syntax/mediawiki.syntax +567 -0
- data/syntax/mips.syntax +66 -0
- data/syntax/mod_perl.syntax +50 -0
- data/syntax/modula-3.syntax +47 -0
- data/syntax/moinmoin.syntax +189 -0
- data/syntax/mootools.syntax +572 -0
- data/syntax/movable_type.syntax +162 -0
- data/syntax/multimarkdown.syntax +39 -0
- data/syntax/objective-c++.syntax +18 -0
- data/syntax/objective-c.syntax +233 -0
- data/syntax/ocaml.syntax +764 -0
- data/syntax/ocamllex.syntax +167 -0
- data/syntax/ocamlyacc.syntax +184 -0
- data/syntax/opengl.syntax +14 -0
- data/syntax/pascal.syntax +77 -0
- data/syntax/perl.syntax +1115 -0
- data/syntax/plain_text.syntax +32 -0
- data/syntax/postscript.syntax +114 -0
- data/syntax/processing.syntax +106 -0
- data/syntax/prolog.syntax +40 -0
- data/syntax/property_list.syntax +635 -0
- data/syntax/python.syntax +868 -0
- data/syntax/python_django.syntax +21 -0
- data/syntax/qmake_project.syntax +114 -0
- data/syntax/qt_c++.syntax +26 -0
- data/syntax/quake3_config.syntax +32 -0
- data/syntax/r.syntax +81 -0
- data/syntax/r_console.syntax +16 -0
- data/syntax/ragel.syntax +201 -0
- data/syntax/rd_r_documentation.syntax +91 -0
- data/syntax/regexp.syntax +50 -0
- data/syntax/release_notes.syntax +46 -0
- data/syntax/remind.syntax +253 -0
- data/syntax/restructuredtext.syntax +250 -0
- data/syntax/rez.syntax +80 -0
- data/syntax/ruby.syntax +1035 -0
- data/syntax/ruby_experimental.syntax +145 -0
- data/syntax/ruby_on_rails.syntax +88 -0
- data/syntax/s5.syntax +69 -0
- data/syntax/scheme.syntax +347 -0
- data/syntax/scilab.syntax +41 -0
- data/syntax/setext.syntax +147 -0
- data/syntax/shell-unix-generic.syntax +384 -0
- data/syntax/slate.syntax +149 -0
- data/syntax/sql.syntax +237 -0
- data/syntax/sql_rails.syntax +18 -0
- data/syntax/ssh-config.syntax +33 -0
- data/syntax/standard_ml.syntax +121 -0
- data/syntax/strings_file.syntax +39 -0
- data/syntax/subversion_commit_message.syntax +36 -0
- data/syntax/sweave.syntax +84 -0
- data/syntax/swig.syntax +57 -0
- data/syntax/tcl.syntax +152 -0
- data/syntax/template_toolkit.syntax +121 -0
- data/syntax/tex.syntax +86 -0
- data/syntax/tex_math.syntax +49 -0
- data/syntax/textile.syntax +215 -0
- data/syntax/tsv.syntax +50 -0
- data/syntax/twiki.syntax +241 -0
- data/syntax/txt2tags.syntax +79 -0
- data/syntax/vectorscript.syntax +57 -0
- data/syntax/xhtml_1.0.syntax +4027 -0
- data/syntax/xml.syntax +180 -0
- data/syntax/xml_strict.syntax +92 -0
- data/syntax/xsl.syntax +60 -0
- data/syntax/yaml.syntax +160 -0
- data/syntax/yui_javascript.syntax +176 -0
- data/test/test_uv.rb +17 -0
- data/vendor/assets/stylesheets/active4d.css +117 -0
- data/vendor/assets/stylesheets/all_hallows_eve.css +75 -0
- data/vendor/assets/stylesheets/all_uv_themes.css +4 -0
- data/vendor/assets/stylesheets/amy.css +150 -0
- data/vendor/assets/stylesheets/blackboard.css +91 -0
- data/vendor/assets/stylesheets/brilliance_black.css +608 -0
- data/vendor/assets/stylesheets/brilliance_dull.css +602 -0
- data/vendor/assets/stylesheets/cobalt.css +152 -0
- data/vendor/assets/stylesheets/dawn.css +124 -0
- data/vendor/assets/stylesheets/eiffel.css +124 -0
- data/vendor/assets/stylesheets/espresso_libre.css +112 -0
- data/vendor/assets/stylesheets/idle.css +65 -0
- data/vendor/assets/stylesheets/iplastic.css +83 -0
- data/vendor/assets/stylesheets/lazy.css +76 -0
- data/vendor/assets/stylesheets/mac_classic.css +126 -0
- data/vendor/assets/stylesheets/magicwb_amiga.css +107 -0
- data/vendor/assets/stylesheets/pastels_on_dark.css +191 -0
- data/vendor/assets/stylesheets/railscasts.css +74 -0
- data/vendor/assets/stylesheets/slush_poppies.css +88 -0
- data/vendor/assets/stylesheets/spacecadet.css +54 -0
- data/vendor/assets/stylesheets/sunburst.css +183 -0
- data/vendor/assets/stylesheets/twilight.css +140 -0
- data/vendor/assets/stylesheets/zenburnesque.css +94 -0
- metadata +302 -0
@@ -0,0 +1,492 @@
|
|
1
|
+
---
|
2
|
+
name: Lilypond
|
3
|
+
fileTypes:
|
4
|
+
- ly
|
5
|
+
- ily
|
6
|
+
scopeName: source.lilypond
|
7
|
+
repository:
|
8
|
+
g_markup:
|
9
|
+
name: meta.element.markup.lilypond
|
10
|
+
begin: "(?x)\n\
|
11
|
+
\t\t\t\t((\\\\) markup) \\s+ # backslash + \"markup\" + spaces\n\
|
12
|
+
\t\t\t\t(?={)\n\
|
13
|
+
\t\t\t"
|
14
|
+
beginCaptures:
|
15
|
+
"1":
|
16
|
+
name: support.function.element.markup.lilypond
|
17
|
+
"2":
|
18
|
+
name: punctuation.definition.function.markup
|
19
|
+
end: (?<=})
|
20
|
+
patterns:
|
21
|
+
- include: "#g_m_group"
|
22
|
+
comments:
|
23
|
+
patterns:
|
24
|
+
- name: comment.block.lilypond
|
25
|
+
captures:
|
26
|
+
"0":
|
27
|
+
name: punctuation.definition.comment.lilypond
|
28
|
+
begin: "%{"
|
29
|
+
end: "%}"
|
30
|
+
- name: comment.line.lilypond
|
31
|
+
begin: "%"
|
32
|
+
beginCaptures:
|
33
|
+
"0":
|
34
|
+
name: punctuation.definition.comment.lilypond
|
35
|
+
end: $\n?
|
36
|
+
g_times:
|
37
|
+
begin: ((\\)times)\s*(?:([1-9][0-9]*/[1-9][0-9])\s*)(?={)
|
38
|
+
beginCaptures:
|
39
|
+
"1":
|
40
|
+
name: support.function.section.lilypond
|
41
|
+
"2":
|
42
|
+
name: punctuation.definition.function.lilypond
|
43
|
+
"3":
|
44
|
+
name: constant.numeric.fraction.lilypond
|
45
|
+
end: (?<=})
|
46
|
+
patterns:
|
47
|
+
- include: "#group"
|
48
|
+
f_keywords:
|
49
|
+
name: keyword.control.lilypond
|
50
|
+
captures:
|
51
|
+
"1":
|
52
|
+
name: punctuation.definition.function.lilypond
|
53
|
+
match: "(?x)\n\
|
54
|
+
\t\t\t\t(?: (\\\\)\n\
|
55
|
+
\t\t\t\t (?: set | new | override | revert)\n\
|
56
|
+
\t\t\t\t)\n\
|
57
|
+
\t\t\t"
|
58
|
+
f_clef:
|
59
|
+
name: meta.element.clef.lilypond
|
60
|
+
captures:
|
61
|
+
"6":
|
62
|
+
name: meta.fixme.unknown-clef-name.lilypond
|
63
|
+
"7":
|
64
|
+
name: constant.other.modifier.clef.lilypond
|
65
|
+
"8":
|
66
|
+
name: punctuation.definition.string.lilypond
|
67
|
+
"1":
|
68
|
+
name: support.function.element.lilypond
|
69
|
+
"2":
|
70
|
+
name: punctuation.definition.function.lilypond
|
71
|
+
"3":
|
72
|
+
name: punctuation.definition.string.lilypond
|
73
|
+
"4":
|
74
|
+
name: constant.language.clef-name.lilypond
|
75
|
+
"5":
|
76
|
+
name: constant.other.modifier.clef.lilypond
|
77
|
+
match: "(?x)\n\
|
78
|
+
\t\t\t\t((\\\\) clef) \\s+ # backslash + \"clef\" + spaces (groups 1-2)\n\
|
79
|
+
\t\t\t\t(?:\n\
|
80
|
+
\t\t\t\t (\"?)\t# beginning quotes (group 3)\n\
|
81
|
+
\t\t\t\t ( (?: # group 4\n\
|
82
|
+
\t\t\t\t\t treble | violin | G | french | # G clefs\n\
|
83
|
+
\t\t\t\t alto | C | tenor | (?:mezzo)?soprano | baritone | # C clefs\n\
|
84
|
+
\t\t\t\t (?:sub)?bass | F | varbaritone | # F clefs\n\
|
85
|
+
\t\t\t\t percussion | tab | # percussion / tablature clefs\n \n\
|
86
|
+
\t\t\t (?:neo)?mensural-c[1-4] | mensural-[fg] | \t\t# Ancient clefs\n\
|
87
|
+
\t\t\t\t petrucci-(?: [fg] | c[1-5] ) |\n\
|
88
|
+
\t\t\t\t (?: vaticana | medicaea | hufnagel ) - (?: do[1-3] | fa[12] ) |\n\
|
89
|
+
\t\t\t\t hufnagel-do-fa\n\
|
90
|
+
\t\t\t\t )\n\
|
91
|
+
\t\t\t\t ([_^](?:8|15)?)? # optionally shift 1-2 octaves \xE2\x86\x91/\xE2\x86\x93 (group 5)\n\
|
92
|
+
\t\t\t\t ) |\n\
|
93
|
+
\t\t\t\t ( (?:\\w+) ([_^](?:8|15))? ) # unknown clef name (groups 6-7)\n\
|
94
|
+
\t\t\t\t (\\3) # closing quotes (group 8)\n\
|
95
|
+
\t\t\t\t)?\n\
|
96
|
+
\t\t\t"
|
97
|
+
comment: "\n\
|
98
|
+
\t\t\t\tThis looks something like: \\clef mezzosoprano_8\n\
|
99
|
+
\t\t\t\tOr maybe: \\clef neomensural-c3^15\n\
|
100
|
+
\t\t\t"
|
101
|
+
g_relative:
|
102
|
+
begin: ((\\)relative)\s*(?:([a-h][',]*)\s*)?(?={)
|
103
|
+
beginCaptures:
|
104
|
+
"1":
|
105
|
+
name: support.function.section.lilypond
|
106
|
+
"2":
|
107
|
+
name: punctuation.definition.function.lilypond
|
108
|
+
"3":
|
109
|
+
name: storage.type.pitch.lilypond
|
110
|
+
end: (?<=})
|
111
|
+
patterns:
|
112
|
+
- include: "#group"
|
113
|
+
scheme:
|
114
|
+
begin: "#"
|
115
|
+
contentName: source.scheme.embedded.lilypond
|
116
|
+
beginCaptures:
|
117
|
+
"0":
|
118
|
+
name: punctuation.section.embedded.scheme.lilypond
|
119
|
+
end: (?=[\s%])|(?<=\n)
|
120
|
+
patterns:
|
121
|
+
- include: source.scheme
|
122
|
+
comment: "\n\
|
123
|
+
\t\t\t\tLilypond source can embed scheme code to do things more\n\
|
124
|
+
\t\t\t\tflexibly than allowed by the basic language.\n\n\
|
125
|
+
\t\t\t\tWe need to make sure to match after a \\n, as included\n\
|
126
|
+
\t\t\t\tby some s-expressions in the scheme grammar.\n\
|
127
|
+
\t\t\t"
|
128
|
+
notes:
|
129
|
+
patterns:
|
130
|
+
- name: meta.element.note.lilypond
|
131
|
+
begin: "(?x)\\b\n\
|
132
|
+
\t\t\t\t\t (\t\t\t\t\t\t # (group 1)\n\
|
133
|
+
\t\t\t\t\t\t ( [a-h] # Pitch (group 2)\n\
|
134
|
+
\t\t\t\t\t\t ( (?:i[sh]){1,2} | # - sharp (group 3)\n\
|
135
|
+
\t\t\t\t\t\t (?:e[sh]|s){1,2} # - flat\n\
|
136
|
+
\t\t\t\t\t\t )?\n\
|
137
|
+
\t\t\t\t\t ([!?])? # Cautionary accidental (group 4)\n\
|
138
|
+
\t\t\t\t\t ('+|,+)? # Octave (group 5)\n\
|
139
|
+
\t\t\t\t\t\t )\n\
|
140
|
+
\t\t\t\t\t\t ( ( ((\\\\)breve)| # Duration (groups 6-9)\n\
|
141
|
+
\t\t\t\t\t\t 64|32|16|8|4|2|1\n\
|
142
|
+
\t\t\t\t\t\t )\n\
|
143
|
+
\t\t\t\t\t\t (\\.)? # Augmentation dot (group 10)\n\
|
144
|
+
\t\t\t\t\t\t\t((\\*)(\\d+(?:/\\d+)?))? # Scaling duration (groups 11-13)\n\
|
145
|
+
\t\t\t\t\t\t )?\n\
|
146
|
+
\t\t\t\t\t\t)(?![a-z])\t# do not follow a note with a letter\n\
|
147
|
+
\t\t\t\t\t"
|
148
|
+
beginCaptures:
|
149
|
+
"6":
|
150
|
+
name: storage.type.duration.lilypond
|
151
|
+
"12":
|
152
|
+
name: keyword.operator.duration-scale.lilypond
|
153
|
+
"13":
|
154
|
+
name: constant.numeric.fraction.lilypond
|
155
|
+
"9":
|
156
|
+
name: punctuation.definition.function.lilypond
|
157
|
+
"2":
|
158
|
+
name: storage.type.pitch.lilypond
|
159
|
+
"4":
|
160
|
+
name: meta.note-modifier.cautionary-accidental.lilypond
|
161
|
+
"5":
|
162
|
+
name: meta.note-modifier.octave.lilypond
|
163
|
+
end: "(?x)\n\
|
164
|
+
\t\t\t\t\t\t(?= [ }~a-z] ) # End when we encounter a space or }\n\
|
165
|
+
\t\t\t\t\t"
|
166
|
+
patterns:
|
167
|
+
- include: "#n_articulations"
|
168
|
+
comment: "\n\
|
169
|
+
\t\t\t\t\t\tThis rule handles notes, including the pitch, the\n\
|
170
|
+
\t\t\t\t\t\tduration, and any articulations drawn along with\n\
|
171
|
+
\t\t\t\t\t\tthe note.\n\
|
172
|
+
\t\t\t\t\t\t\n\
|
173
|
+
\t\t\t\t\t\tThis rule gets a whole lot uglier if we want to\n\
|
174
|
+
\t\t\t\t\t\tsupport multilingual note names. If so, the rule\n\
|
175
|
+
\t\t\t\t\t\tgoes something like:\n\
|
176
|
+
\t\t\t\t\t\t\n\
|
177
|
+
\t\t\t\t\t\t(?x)\n\
|
178
|
+
\t\t\t\t\t\t\t\\b( # Basic Pitches\n\
|
179
|
+
\t\t\t\t\t\t\t [a-h] # Dutch/English/etc. \n\
|
180
|
+
\t\t\t\t\t\t\t (?: (iss?|s|sharp|x)(iss?|s|sharp|x|ih) | # sharp / flat\n\
|
181
|
+
\t\t\t\t\t\t\t\t (ess?|s|flat|f)(ess?|s|flat|f|eh)\n\
|
182
|
+
\t\t\t\t\t\t\t )? |\n\
|
183
|
+
\t\t\t\t\t\t\t (?: do|re|mi|fa|sol|la|si) # Italian/Spanish\n\
|
184
|
+
\t\t\t\t\t\t\t (?: ss?|dd?bb?) # sharp/flat\n\
|
185
|
+
\t\t\t\t\t\t\t)\n\
|
186
|
+
\t\t\t\t\t\t...\n\
|
187
|
+
\t\t\t\t\t"
|
188
|
+
- name: meta.element.pause.rest.lilypond
|
189
|
+
begin: "(?x)\\b\n\
|
190
|
+
\t\t\t\t\t\t(r) # (group 1)\n\
|
191
|
+
\t\t\t\t\t\t( ( (\\\\)breve| # Duration (groups 2-4)\n\
|
192
|
+
\t\t\t\t\t\t 64|32|16|8|4|2|1\n\
|
193
|
+
\t\t\t\t\t\t )\n\
|
194
|
+
\t\t\t\t\t\t (\\.)? # Augmentation dot (group 5)\n\
|
195
|
+
\t\t\t\t\t\t ((\\*)(\\d+(?:/\\d+)?))? # Scaling duration (groups 6-8)\n\
|
196
|
+
\t\t\t\t\t\t\n\
|
197
|
+
\t\t\t\t\t\t)?\n\
|
198
|
+
\t\t\t\t\t\t(?![a-z])\t# do not follow a note with a letter\n\
|
199
|
+
\t\t\t\t\t"
|
200
|
+
beginCaptures:
|
201
|
+
"6":
|
202
|
+
name: keyword.operator.duration-scale.lilypond
|
203
|
+
"8":
|
204
|
+
name: constant.numeric.fraction.lilypond
|
205
|
+
"1":
|
206
|
+
name: storage.type.pause.rest.lilypond
|
207
|
+
"2":
|
208
|
+
name: storage.type.duration.lilypond
|
209
|
+
"4":
|
210
|
+
name: punctuation.definition.function.lilypond
|
211
|
+
end: (?=[ }~a-z])
|
212
|
+
patterns:
|
213
|
+
- include: "#n_articulations"
|
214
|
+
- name: meta.element.pause.skip.lilypond
|
215
|
+
begin: "(?x)\\b\n\
|
216
|
+
\t\t\t\t\t\t(s) # (group 1)\n\
|
217
|
+
\t\t\t\t\t\t( ( (\\\\)breve| # Duration (groups 2-4)\n\
|
218
|
+
\t\t\t\t\t\t 64|32|16|8|4|2|1\n\
|
219
|
+
\t\t\t\t\t\t )\n\
|
220
|
+
\t\t\t\t\t\t (\\.)? # Augmentation dot (group 5)\n\
|
221
|
+
\t\t\t\t\t\t ((\\*)(\\d+(?:/\\d+)?))? # Scaling duration (groups 6-8)\n\
|
222
|
+
\t\t\t\t\t\t\n\
|
223
|
+
\t\t\t\t\t\t)?\n\
|
224
|
+
\t\t\t\t\t\t(?![a-z])\t# do not follow a note with a letter\n\
|
225
|
+
\t\t\t\t\t"
|
226
|
+
beginCaptures:
|
227
|
+
"6":
|
228
|
+
name: keyword.operator.duration-scale.lilypond
|
229
|
+
"8":
|
230
|
+
name: constant.numeric.fraction.lilypond
|
231
|
+
"1":
|
232
|
+
name: storage.type.pause.skip.lilypond
|
233
|
+
"2":
|
234
|
+
name: storage.type.duration.lilypond
|
235
|
+
"4":
|
236
|
+
name: punctuation.definition.function.lilypond
|
237
|
+
end: (?=[ }~a-z])
|
238
|
+
patterns:
|
239
|
+
- include: "#n_articulations"
|
240
|
+
- name: meta.element.pause.skip.lilypond
|
241
|
+
captures:
|
242
|
+
"1":
|
243
|
+
name: storage.type.pause.skip.lilypond
|
244
|
+
"2":
|
245
|
+
name: punctuation.definition.function.lilypond
|
246
|
+
"3":
|
247
|
+
name: storage.type.duration.lilypond
|
248
|
+
match: ((\\)skip)\s+(64|32|16|8|4|2|1)
|
249
|
+
- name: meta.element.chord.lilypond
|
250
|
+
endCaptures:
|
251
|
+
"1":
|
252
|
+
name: punctuation.definition.chord.lilypond
|
253
|
+
"2":
|
254
|
+
name: storage.type.duration.lilypond
|
255
|
+
"4":
|
256
|
+
name: punctuation.definition.function.lilypond
|
257
|
+
begin: <
|
258
|
+
beginCaptures:
|
259
|
+
"0":
|
260
|
+
name: punctuation.definition.chord.lilypond
|
261
|
+
end: "(?x)\n\
|
262
|
+
\t\t\t\t\t\t(>)\n\
|
263
|
+
\t\t\t\t\t\t( ( ((\\\\)breve)| # Duration (groups 2-4)\n\
|
264
|
+
\t\t\t\t\t\t 64|32|16|8|4|2|1\n\
|
265
|
+
\t\t\t\t\t\t )\n\
|
266
|
+
\t\t\t\t\t\t (\\.)? # Augmentation dot (group 5)\n\
|
267
|
+
\t\t\t\t\t\t)?\n\
|
268
|
+
\t\t\t\t\t"
|
269
|
+
patterns:
|
270
|
+
- captures:
|
271
|
+
"1":
|
272
|
+
name: storage.type.pitch.lilypond
|
273
|
+
"3":
|
274
|
+
name: meta.note-modifier.cautionary-accidental.lilypond
|
275
|
+
"4":
|
276
|
+
name: meta.note-modifier.octave.lilypond
|
277
|
+
match: "(?x)\\b\n\
|
278
|
+
\t\t\t\t\t\t\t\t ( [a-h] # Pitch (group 1)\n\
|
279
|
+
\t\t\t\t\t\t\t\t ( (?:i[sh]){1,2} | # - sharp (group 2)\n\
|
280
|
+
\t\t\t\t\t\t\t\t (?:e[sh]|s){1,2} # - flat\n\
|
281
|
+
\t\t\t\t\t\t\t\t )?\n\
|
282
|
+
\t\t\t\t\t\t\t ([!?])? # Cautionary accidental (group 3)\n\
|
283
|
+
\t\t\t\t\t\t\t ('+|,+)? # Octave (group 4)\n\
|
284
|
+
\t\t\t\t\t\t\t\t )\n\
|
285
|
+
\t\t\t\t\t\t\t"
|
286
|
+
comment: "\n\
|
287
|
+
\t\t\t\t\t\tLilypond chords look like: < a b c >\n\
|
288
|
+
\t\t\t\t\t"
|
289
|
+
- name: meta.element.chord.lilypond
|
290
|
+
begin: (?<=>)(?<!->)(?!\s)
|
291
|
+
end: (?=[ }~a-z])(?<![^-]>)
|
292
|
+
patterns:
|
293
|
+
- include: "#n_articulations"
|
294
|
+
comment: "\n\
|
295
|
+
\t\t\t\t\t\tThis rule attaches stuff to the end of a chord\n\
|
296
|
+
\t\t\t\t\t\t\n\
|
297
|
+
\t\t\t\t\t\tTherefore it begins after the > which ends a chord,\n\
|
298
|
+
\t\t\t\t\t\tand does not end after a > which ends a chord.\n\
|
299
|
+
\t\t\t\t\t\t(to avoid infinite loops)\n\
|
300
|
+
\t\t\t\t\t"
|
301
|
+
- name: storage.type.tie.lilypond
|
302
|
+
match: "~"
|
303
|
+
- name: storage.type.breath-mark.lilypond
|
304
|
+
captures:
|
305
|
+
"1":
|
306
|
+
name: punctuation.definition.function.lilypond
|
307
|
+
match: (\\)breathe
|
308
|
+
comment: "\n\
|
309
|
+
\t\t\t\tThis section includes the rules for notes, rests, and chords\n\
|
310
|
+
\t\t\t"
|
311
|
+
n_articulations:
|
312
|
+
patterns:
|
313
|
+
- name: storage.modifier.articulation.accent.lilypond
|
314
|
+
match: "(?x)\n\
|
315
|
+
\t\t\t\t\t\t([_^-])\n\
|
316
|
+
\t\t\t\t\t\t(?:[.>^+_-])\n\
|
317
|
+
\t\t\t\t\t"
|
318
|
+
- name: storage.modifier.articulation.named.lilypond
|
319
|
+
captures:
|
320
|
+
"1":
|
321
|
+
name: punctuation.definition.function.lilypond
|
322
|
+
match: "(?x)\n\
|
323
|
+
\t\t\t\t\t\t(\\\\)\n\
|
324
|
+
\t\t\t\t\t\t(?: accent | markato | staccatissimo |\t\t # basic accents\n\
|
325
|
+
\t\t\t\t\t\t\tespressivo | staccato | tenuto | portato | \n\
|
326
|
+
\t\t\t\t\t\t\t(?:up|down)bow | flageolet | thumb |\n\
|
327
|
+
\t\t\t\t\t\t\t[lr](?:heel|toe) | open | stopped |\n\
|
328
|
+
\t\t\t\t\t\t\t(?:reverse)?turn | trill |\n\
|
329
|
+
\t\t\t\t\t\t\tprall(?: prall | mordent | down | up)? | # pralls\n\
|
330
|
+
\t\t\t\t\t\t\t(?: up | down | line ) prall | # and\n\
|
331
|
+
\t\t\t\t\t\t\t(?: up | down )? mordent | # mordents\n\
|
332
|
+
\t\t\t\t\t\t\tsignumcongruentiae |\n\
|
333
|
+
\t\t\t\t\t\t\t(?: (?:very)? long | short)?fermata(Markup)? | # fermatas\n\
|
334
|
+
\t\t\t\t\t\t\tsegno | (?:var)?coda \n\
|
335
|
+
\t\t\t\t\t\t)\n\
|
336
|
+
\t\t\t\t\t"
|
337
|
+
- name: storage.modifier.articulation.dynamics.lilypond
|
338
|
+
match: "(?x)\n\
|
339
|
+
\t\t\t\t\t\t(\\\\) # backslash\n\
|
340
|
+
\t\t\t\t\t\tp{1,5} | m[pf] | f{1,4} | fp | # forte, piano, etc.\n\
|
341
|
+
\t\t\t\t\t\tsff? | spp? | [sr]fz | \n\
|
342
|
+
\t\t\t\t\t\t< | > | ! | espressivo # (de)crescendo\n\
|
343
|
+
\t\t\t\t\t"
|
344
|
+
- name: storage.modifier.beam.lilypond
|
345
|
+
match: \[|\]
|
346
|
+
- name: storage.modifier.slur.lilypond
|
347
|
+
match: \(|\)
|
348
|
+
functions:
|
349
|
+
patterns:
|
350
|
+
- include: "#f_clef"
|
351
|
+
- include: "#f_time-signature"
|
352
|
+
- include: "#f_key-signature"
|
353
|
+
- include: "#f_keywords"
|
354
|
+
- include: "#f_generic"
|
355
|
+
strings:
|
356
|
+
name: string.quoted.double.lilypond
|
357
|
+
captures:
|
358
|
+
"0":
|
359
|
+
name: punctuation.definition.string.lilypond
|
360
|
+
begin: "\""
|
361
|
+
end: "\""
|
362
|
+
patterns:
|
363
|
+
- name: constant.character.escape.lilypond
|
364
|
+
match: \\.
|
365
|
+
f_key-signature:
|
366
|
+
name: meta.element.key-signature.lilypond
|
367
|
+
comment: FIXME
|
368
|
+
music-expr:
|
369
|
+
patterns:
|
370
|
+
- include: "#comments"
|
371
|
+
- include: "#groupings"
|
372
|
+
- include: "#strings"
|
373
|
+
- include: "#functions"
|
374
|
+
- include: "#scheme"
|
375
|
+
- include: "#notes"
|
376
|
+
g_system:
|
377
|
+
name: meta.system.lilypond
|
378
|
+
endCaptures:
|
379
|
+
"0":
|
380
|
+
name: punctuation.section.system.end.lilypond
|
381
|
+
begin: "<<"
|
382
|
+
beginCaptures:
|
383
|
+
"0":
|
384
|
+
name: punctuation.section.system.begin.lilypond
|
385
|
+
end: ">>"
|
386
|
+
patterns:
|
387
|
+
- include: $self
|
388
|
+
f_generic:
|
389
|
+
name: support.function.general.lilypond
|
390
|
+
captures:
|
391
|
+
"1":
|
392
|
+
name: punctuation.definition.function.lilypond
|
393
|
+
match: (\\)[a-zA-Z-]+\b
|
394
|
+
groupings:
|
395
|
+
patterns:
|
396
|
+
- include: "#g_system"
|
397
|
+
- include: "#g_relative"
|
398
|
+
- include: "#g_times"
|
399
|
+
- include: "#group"
|
400
|
+
group:
|
401
|
+
name: meta.music-expression.lilypond
|
402
|
+
endCaptures:
|
403
|
+
"0":
|
404
|
+
name: punctuation.section.group.end.lilypond
|
405
|
+
begin: "{"
|
406
|
+
beginCaptures:
|
407
|
+
"0":
|
408
|
+
name: punctuation.section.group.begin.lilypond
|
409
|
+
end: "}"
|
410
|
+
patterns:
|
411
|
+
- include: "#music-expr"
|
412
|
+
g_header:
|
413
|
+
name: meta.header.lilypond
|
414
|
+
endCaptures:
|
415
|
+
"0":
|
416
|
+
name: punctuation.section.group.end.lilypond
|
417
|
+
begin: ((\\)header)\s*({)
|
418
|
+
beginCaptures:
|
419
|
+
"1":
|
420
|
+
name: support.function.section.header.lilypond
|
421
|
+
"2":
|
422
|
+
name: punctuation.definition.function.lilypond
|
423
|
+
"3":
|
424
|
+
name: punctuation.section.group.begin.lilypond
|
425
|
+
end: "}"
|
426
|
+
patterns:
|
427
|
+
- include: "#comments"
|
428
|
+
- include: "#strings"
|
429
|
+
- include: "#scheme"
|
430
|
+
- include: "#g_markup"
|
431
|
+
- name: punctuation.separator.key-value.lilypond
|
432
|
+
match: "="
|
433
|
+
- name: support.constant.header.lilypond
|
434
|
+
match: "(?x)\n\
|
435
|
+
\t\t\t\t\t\tdedication | title | subtitle | subsubtitle | poet |\n\
|
436
|
+
\t\t\t\t\t\tcomposer | meter | opus | arranger | instrument |\n\
|
437
|
+
\t\t\t\t\t\tpiece | breakbefore | copyright | tagline | enteredby\n\
|
438
|
+
\t\t\t\t\t"
|
439
|
+
- name: support.constant.header.mutopia.lilypond
|
440
|
+
match: "(?x)\n\
|
441
|
+
\t\t\t\t\t\tmutopiatitle | mutopiacomposer | mutopiapoet |\n\
|
442
|
+
\t\t\t\t\t\tmutopiaopus | mutopiainstrument | date | source |\n\
|
443
|
+
\t\t\t\t\t\tstyle | maintainer | maintainerEmail |\n\
|
444
|
+
\t\t\t\t\t\tmaintainerWeb | lastupdated\n\
|
445
|
+
\t\t\t\t\t"
|
446
|
+
g_m_group:
|
447
|
+
name: meta.group.lilypond
|
448
|
+
endCaptures:
|
449
|
+
"0":
|
450
|
+
name: punctuation.section.group.end.lilypond
|
451
|
+
begin: "{"
|
452
|
+
beginCaptures:
|
453
|
+
"0":
|
454
|
+
name: punctuation.section.group.begin.lilypond
|
455
|
+
end: "}"
|
456
|
+
patterns:
|
457
|
+
- include: "#f_generic"
|
458
|
+
- include: "#strings"
|
459
|
+
- include: "#comments"
|
460
|
+
- include: "#scheme"
|
461
|
+
- include: "#g_m_group"
|
462
|
+
f_time-signature:
|
463
|
+
name: meta.element.time-signature.lilypond
|
464
|
+
captures:
|
465
|
+
"1":
|
466
|
+
name: support.function.element.lilypond
|
467
|
+
"2":
|
468
|
+
name: punctuation.definition.function.lilypond
|
469
|
+
"3":
|
470
|
+
name: constant.numeric.time-signature.lilypond
|
471
|
+
match: "(?x)\n\
|
472
|
+
\t\t\t\t((\\\\) time) \\s+ # backslash + \"time\" + spaces (groups 1-2)\n\
|
473
|
+
\t\t\t\t([1-9][0-9]*/[1-9][0-9]*)?\n\
|
474
|
+
\t\t\t"
|
475
|
+
uuid: F25B30BE-0526-4D92-806C-F0D678DDF669
|
476
|
+
foldingStartMarker: (\{|<<)\s*$
|
477
|
+
patterns:
|
478
|
+
- include: "#comments"
|
479
|
+
- include: "#g_header"
|
480
|
+
- include: "#groupings"
|
481
|
+
- include: "#strings"
|
482
|
+
- include: "#scheme"
|
483
|
+
- include: "#functions"
|
484
|
+
foldingStopMarker: (\}|>>)
|
485
|
+
keyEquivalent: ^~L
|
486
|
+
comment: "\n\
|
487
|
+
\t\tThis bundle is, as can easily be seen, far from complete,\n\
|
488
|
+
\t\tbut it should still be as useful as the Lilypond.app pyobjc\n\
|
489
|
+
\t\tapplication, which has no syntax coloring, no way to do\n\
|
490
|
+
\t\tsnippets, and pretty much no interesting functionality at\n\
|
491
|
+
\t\tall, other than a \"Run\" menu option. :)\n\
|
492
|
+
\t"
|
data/syntax/lisp.syntax
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
---
|
2
|
+
name: Lisp
|
3
|
+
fileTypes:
|
4
|
+
- lisp
|
5
|
+
- cl
|
6
|
+
- l
|
7
|
+
- mud
|
8
|
+
- el
|
9
|
+
scopeName: source.lisp
|
10
|
+
uuid: 00D451C9-6B1D-11D9-8DFA-000D93589AF6
|
11
|
+
foldingStartMarker: \(
|
12
|
+
patterns:
|
13
|
+
- name: comment.line.semicolon.lisp
|
14
|
+
captures:
|
15
|
+
"1":
|
16
|
+
name: punctuation.definition.comment.lisp
|
17
|
+
match: (;).*$\n?
|
18
|
+
- name: meta.function.lisp
|
19
|
+
captures:
|
20
|
+
"2":
|
21
|
+
name: storage.type.function-type.lisp
|
22
|
+
"4":
|
23
|
+
name: entity.name.function.lisp
|
24
|
+
match: (\b(?i:(defun|defmethod|defmacro))\b)(\s+)((\w|\-|\!|\?)*)
|
25
|
+
- name: constant.character.lisp
|
26
|
+
captures:
|
27
|
+
"1":
|
28
|
+
name: punctuation.definition.constant.lisp
|
29
|
+
match: (#)(\w|[\\+-=<>'"&#])+
|
30
|
+
- name: variable.other.global.lisp
|
31
|
+
captures:
|
32
|
+
"1":
|
33
|
+
name: punctuation.definition.variable.lisp
|
34
|
+
"3":
|
35
|
+
name: punctuation.definition.variable.lisp
|
36
|
+
match: (\*)(\S*)(\*)
|
37
|
+
- name: keyword.control.lisp
|
38
|
+
match: \b(?i:case|do|let|loop|if|else|when)\b
|
39
|
+
- name: keyword.operator.lisp
|
40
|
+
match: \b(?i:eq|neq|and|or)\b
|
41
|
+
- name: constant.language.lisp
|
42
|
+
match: \b(?i:null|nil)\b
|
43
|
+
- name: support.function.lisp
|
44
|
+
match: \b(?i:cons|car|cdr|cond|lambda|format|setq|setf|quote|eval|append|list|listp|memberp|t|load|progn)\b
|
45
|
+
- name: constant.numeric.lisp
|
46
|
+
match: \b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\b
|
47
|
+
- name: string.quoted.double.lisp
|
48
|
+
endCaptures:
|
49
|
+
"0":
|
50
|
+
name: punctuation.definition.string.end.lisp
|
51
|
+
begin: "\""
|
52
|
+
beginCaptures:
|
53
|
+
"0":
|
54
|
+
name: punctuation.definition.string.begin.lisp
|
55
|
+
end: "\""
|
56
|
+
patterns:
|
57
|
+
- name: constant.character.escape.lisp
|
58
|
+
match: \\.
|
59
|
+
foldingStopMarker: \)
|
60
|
+
keyEquivalent: ^~L
|
61
|
+
comment: ""
|
@@ -0,0 +1,24 @@
|
|
1
|
+
---
|
2
|
+
name: Literate Haskell
|
3
|
+
fileTypes:
|
4
|
+
- lhs
|
5
|
+
scopeName: text.tex.latex.haskell
|
6
|
+
uuid: 439807F5-7129-487D-B5DC-95D5272B43DD
|
7
|
+
patterns:
|
8
|
+
- name: meta.function.embedded.haskell.latex
|
9
|
+
captures:
|
10
|
+
"1":
|
11
|
+
name: support.function.be.latex
|
12
|
+
"2":
|
13
|
+
name: punctuation.definition.function.latex
|
14
|
+
"3":
|
15
|
+
name: punctuation.definition.arguments.begin.latex
|
16
|
+
"4":
|
17
|
+
name: punctuation.definition.arguments.end.latex
|
18
|
+
begin: ^((\\)begin)({)code(})(\s*\n)?
|
19
|
+
contentName: source.haskell.embedded.latex
|
20
|
+
end: ^((\\)end)({)code(})
|
21
|
+
patterns:
|
22
|
+
- include: source.haskell
|
23
|
+
- include: text.tex.latex
|
24
|
+
keyEquivalent: ^~H
|
data/syntax/logo.syntax
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
---
|
2
|
+
name: Logo
|
3
|
+
fileTypes: []
|
4
|
+
|
5
|
+
scopeName: source.logo
|
6
|
+
uuid: 7613EC24-B0F9-4D01-8706-1D54098BFFD8
|
7
|
+
foldingStartMarker: ^to \w+
|
8
|
+
patterns:
|
9
|
+
- name: entity.name.function.logo
|
10
|
+
match: ^to [\w.]+
|
11
|
+
- name: keyword.control.logo
|
12
|
+
match: continue|do\.until|do\.while|end|for(each)?|if(else|falsetrue|)|repeat|stop|until
|
13
|
+
- name: keyword.other.logo
|
14
|
+
match: \b(\.defmacro|\.eq|\.macro|\.maybeoutput|\.setbf|\.setfirst|\.setitem|\.setsegmentsize|allopen|allowgetset|and|apply|arc|arctan|arity|array|arrayp|arraytolist|ascii|ashift|back|background|backslashedp|beforep|bitand|bitnot|bitor|bitxor|buried|buriedp|bury|buryall|buryname|butfirst|butfirsts|butlast|bye|cascade|case|caseignoredp|catch|char|clean|clearscreen|cleartext|close|closeall|combine|cond|contents|copydef|cos|count|crossmap|cursor|define|definedp|dequeue|difference|dribble|edall|edit|editfile|edn|edns|edpl|edpls|edps|emptyp|eofp|epspict|equalp|erall|erase|erasefile|ern|erns|erpl|erpls|erps|erract|error|exp|fence|filep|fill|filter|find|first|firsts|forever|form|forward|fput|fullprintp|fullscreen|fulltext|gc|gensym|global|goto|gprop|greaterp|heading|help|hideturtle|home|ignore|int|invoke|iseq|item|keyp|label|last|left|lessp|list|listp|listtoarray|ln|load|loadnoisily|loadpict|local|localmake|log10|lowercase|lput|lshift|macroexpand|macrop|make|map|map.se|mdarray|mditem|mdsetitem|member|memberp|minus|modulo|name|namelist|namep|names|nodes|nodribble|norefresh|not|numberp|openappend|openread|openupdate|openwrite|or|output|palette|parse|pause|pen|pencolor|pendown|pendownp|penerase|penmode|penpaint|penreverse|pensize|penup|pick|plist|plistp|plists|pllist|po|poall|pon|pons|pop|popl|popls|pops|pos|pot|pots|power|pprop|prefix|primitivep|print|printdepthlimit|printwidthlimit|procedurep|procedures|product|push|queue|quoted|quotient|radarctan|radcos|radsin|random|rawascii|readchar|readchars|reader|readlist|readpos|readrawline|readword|redefp|reduce|refresh|remainder|remdup|remove|remprop|repcount|rerandom|reverse|right|round|rseq|run|runparse|runresult|save|savel|savepict|screenmode|scrunch|sentence|setbackground|setcursor|seteditor|setheading|sethelploc|setitem|setlibloc|setmargins|setpalette|setpen|setpencolor|setpensize|setpos|setprefix|setread|setreadpos|setscrunch|settemploc|settextcolor|setwrite|setwritepos|setx|setxy|sety|shell|show|shownp|showturtle|sin|splitscreen|sqrt|standout|startup|step|stepped|steppedp|substringp|sum|tag|test|text|textscreen|thing|throw|towards|trace|traced|tracedp|transfer|turtlemode|type|unbury|unburyall|unburyname|unburyonedit|unstep|untrace|uppercase|usealternatenam|wait|while|window|word|wordp|wrap|writepos|writer|xcor|ycor)\b
|
15
|
+
- name: variable.parameter.logo
|
16
|
+
captures:
|
17
|
+
"1":
|
18
|
+
name: punctuation.definition.variable.logo
|
19
|
+
match: (\:)(?:\|[^|]*\||[-\w.]*)+
|
20
|
+
- name: string.other.word.logo
|
21
|
+
match: "\"(?:\\|[^|]*\\||[-\\w.]*)+"
|
22
|
+
- name: comment.line.semicolon.logo
|
23
|
+
captures:
|
24
|
+
"1":
|
25
|
+
name: punctuation.definition.comment.logo
|
26
|
+
match: (;).*$\n?
|
27
|
+
foldingStopMarker: ^end$
|
28
|
+
keyEquivalent: ^~L
|
29
|
+
comment: Roughed out by Paul Bissex <http://e-scribe.com/news/>
|