Changesets can be listed by changeset number.
The Git repository is here.
- Revision:
- 15
- Log:
Attempt to update Typo to a Typo SVN HEAD release from around the
time the prototype installation was set up on the RISC OS Open Limited
web site. Timestamps place this at 04-Jul so a revision from 05-Jul or
earlier was pulled and copied over the 2.6.0 tarball stable code.
- Author:
- adh
- Date:
- Sat Jul 22 23:27:35 +0100 2006
- Size:
- 14868 Bytes
1 | <html> |
2 | <head> |
3 | <title>Syntax Manual :: Chapter 3: Syntax Highlighting</title> |
4 | <link type="text/css" rel="stylesheet" href="stylesheets/manual.css" /> |
5 | </head> |
6 | |
7 | <body> |
8 | <div id="banner"> |
9 | <table border='0' cellpadding='0' cellspacing='0' width='100%'> |
10 | <tr><td valign='top' align='left'> |
11 | <div class="title"> |
12 | <span class="product">Syntax—</span><br /> |
13 | <span class="tagline">Lexical Analysis for Syntax Highlighting</span> |
14 | </div> |
15 | </td><td valign='middle' align='right'> |
16 | <div class="info"> |
17 | Syntax Version: <strong>1.0.0</strong><br /> |
18 | Manual Last Updated: <strong>2005-06-18 20:25 UTC</strong> |
19 | </div> |
20 | </td></tr> |
21 | </table> |
22 | </div> |
23 | |
24 | <table border='0' width='100%' cellpadding='0' cellspacing='0'> |
25 | <tr><td valign='top'> |
26 | |
27 | <div id="navigation"> |
28 | <h1>Syntax Manual</h1> |
29 | |
30 | <h2>Chapters</h2> |
31 | <ol type="I"> |
32 | |
33 | <li> |
34 | <a href="chapter-1.html"> |
35 | Introduction |
36 | </a> |
37 | |
38 | <ol type="1"> |
39 | |
40 | <li><a href="chapter-1.html#s1">What is Syntax?</a></li> |
41 | |
42 | <li><a href="chapter-1.html#s2">Quick Start</a></li> |
43 | |
44 | </ol> |
45 | </li> |
46 | |
47 | <li> |
48 | <a href="chapter-2.html"> |
49 | Lexical Analysis |
50 | </a> |
51 | |
52 | <ol type="1"> |
53 | |
54 | <li><a href="chapter-2.html#s1">Groups</a></li> |
55 | |
56 | <li><a href="chapter-2.html#s2">Instructions</a></li> |
57 | |
58 | <li><a href="chapter-2.html#s3">Analyzing</a></li> |
59 | |
60 | </ol> |
61 | </li> |
62 | |
63 | <li><strong> |
64 | <a href="chapter-3.html"> |
65 | Syntax Highlighting |
66 | </a> |
67 | </strong> <big>←</big> |
68 | <ol type="1"> |
69 | |
70 | <li><a href="chapter-3.html#s1">Converting Text</a></li> |
71 | |
72 | <li><a href="chapter-3.html#s2">Custom Highlighters</a></li> |
73 | |
74 | </ol> |
75 | </li> |
76 | |
77 | <li> |
78 | <a href="chapter-4.html"> |
79 | Extending Syntax |
80 | </a> |
81 | |
82 | <ol type="1"> |
83 | |
84 | <li><a href="chapter-4.html#s1">Introduction</a></li> |
85 | |
86 | <li><a href="chapter-4.html#s2">Interface</a></li> |
87 | |
88 | <li><a href="chapter-4.html#s3">Scanning <span class="caps">API</span></a></li> |
89 | |
90 | <li><a href="chapter-4.html#s4">Registering Your New Syntax</a></li> |
91 | |
92 | </ol> |
93 | </li> |
94 | |
95 | </ol> |
96 | |
97 | <h2>Other Documentation</h2> |
98 | |
99 | <ul> |
100 | <li><a href="http://net-ssh.rubyforge.org/api/index.html">Net::SSH API</a></li> |
101 | <li><a href="http://rubyforge.org/tracker/?atid=1842&group_id=274&func=browse">Net::SSH FAQ</a></li> |
102 | </ul> |
103 | |
104 | <h2>Tutorials</h2> |
105 | <ol> |
106 | |
107 | </ol> |
108 | |
109 | <p align="center"><strong>More To Come...</strong></p> |
110 | |
111 | <div class="license"> |
112 | <a href="http://creativecommons.org/licenses/by-sa/2.0/"><img alt="Creative Commons License" border="0" src="http://creativecommons.org/images/public/somerights" /></a><br /> |
113 | This manual is licensed under a <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative Commons License</a>. |
114 | </div> |
115 | </div> |
116 | |
117 | </td><td valign='top' width="100%"> |
118 | |
119 | <div id="content"> |
120 | |
121 | <div class="top"><div class="prevnext"> |
122 | |
123 | <a href="chapter-2.html">Previous (2. Lexical Analysis)</a> | |
124 | |
125 | <a href="index.html">Up</a> |
126 | |
127 | | <a href="chapter-4.html">Next (4. Extending Syntax)</a> |
128 | |
129 | </div></div> |
130 | |
131 | <h1>3. Syntax Highlighting</h1> |
132 | |
133 | |
134 | |
135 | <h2> |
136 | <a name="s1"></a> |
137 | 3.1. Converting Text |
138 | </h2> |
139 | |
140 | |
141 | |
142 | <div class="section"> |
143 | <p>Colorizing code has already been touched on briefly in the Introduction chapter (under “Quick Start”). To review, the process is a mere three steps:</p> |
144 | |
145 | |
146 | <ol> |
147 | <li>Require the class for the type of the output you want (currently, only <span class="caps">HTML</span> is supported).</li> |
148 | <li>Obtain an instance of the convertor, for the syntax you wish to convert.</li> |
149 | <li>Call <code>#convert</code> on that convertor, passing in the text you want to convert. The return value is the <span class="caps">HTML</span> representation of the colorized text.</li> |
150 | </ol> |
151 | |
152 | |
153 | <p>For example:</p> |
154 | |
155 | |
156 | <div class='figure'> |
157 | <span class='caption'>Colorizing a Ruby script [ruby]</span> |
158 | <div class='body'><table border='0' cellpadding='0' cellspacing='0'><tr><td class='lineno'>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></td><td width='100%'><link rel='stylesheet' type='text/css' href='stylesheets/ruby.css' /><div class='ruby'><pre><span class="comment"># Step 1: require the HTML convertor</span> |
159 | <span class="ident">require</span> <span class="punct">'</span><span class="string">syntax/convertor/html</span><span class="punct">'</span> |
160 | |
161 | <span class="comment"># Step 2: get an instance of the HTML convertor for the Ruby syntax</span> |
162 | <span class="ident">convertor</span> <span class="punct">=</span> <span class="constant">Syntax</span><span class="punct">::</span><span class="constant">Convertor</span><span class="punct">::</span><span class="constant">HTML</span><span class="punct">.</span><span class="ident">for_syntax</span> <span class="punct">"</span><span class="string">ruby</span><span class="punct">"</span> |
163 | |
164 | <span class="comment"># Step 3: convert the text to HTML</span> |
165 | <span class="ident">puts</span> <span class="ident">convertor</span><span class="punct">.</span><span class="ident">convert</span><span class="punct">(</span> <span class="constant">File</span><span class="punct">.</span><span class="ident">read</span><span class="punct">(</span> <span class="punct">"</span><span class="string">program.rb</span><span class="punct">"</span> <span class="punct">)</span> <span class="punct">)</span></pre></div></td></tr></table></div></div> |
166 | </div> |
167 | |
168 | |
169 | |
170 | <h2> |
171 | <a name="s2"></a> |
172 | 3.2. Custom Highlighters |
173 | </h2> |
174 | |
175 | |
176 | |
177 | <div class="section"> |
178 | <p>To write your own custom highlighter module, you just need to:</p> |
179 | |
180 | |
181 | <ol> |
182 | <li>inherit from <code>Syntax::Convertors::Abstract</code></li> |
183 | <li>implement the <code>convert</code> method</li> |
184 | </ol> |
185 | |
186 | |
187 | <p>You can use the <code>syntax/convertors/html.rb</code> file as an example:</p> |
188 | |
189 | |
190 | <div class='figure'> |
191 | <span class='caption'>syntax/convertors/html.rb [ruby]</span> |
192 | <div class='body'><table border='0' cellpadding='0' cellspacing='0'><tr><td class='lineno'>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br /></td><td width='100%'><link rel='stylesheet' type='text/css' href='stylesheets/ruby.css' /><div class='ruby'><pre><span class="ident">require</span> <span class="punct">'</span><span class="string">syntax/convertors/abstract</span><span class="punct">'</span> |
193 | |
194 | <span class="keyword">module </span><span class="module">Syntax</span> |
195 | <span class="keyword">module </span><span class="module">Convertors</span> |
196 | |
197 | <span class="comment"># A simple class for converting a text into HTML.</span> |
198 | <span class="keyword">class </span><span class="class">HTML</span> <span class="punct"><</span> <span class="constant">Abstract</span> |
199 | |
200 | <span class="comment"># Converts the given text to HTML, using spans to represent token groups</span> |
201 | <span class="comment"># of any type but <tt>:normal</tt> (which is always unhighlighted). If</span> |
202 | <span class="comment"># +pre+ is +true+, the html is automatically wrapped in pre tags.</span> |
203 | <span class="keyword">def </span><span class="method">convert</span><span class="punct">(</span> <span class="ident">text</span><span class="punct">,</span> <span class="ident">pre</span><span class="punct">=</span><span class="constant">true</span> <span class="punct">)</span> |
204 | <span class="ident">html</span> <span class="punct">=</span> <span class="punct">"</span><span class="string"></span><span class="punct">"</span> |
205 | <span class="ident">html</span> <span class="punct"><<</span> <span class="punct">"</span><span class="string"><pre></span><span class="punct">"</span> <span class="keyword">if</span> <span class="ident">pre</span> |
206 | <span class="ident">regions</span> <span class="punct">=</span> <span class="punct">[]</span> |
207 | <span class="attribute">@tokenizer</span><span class="punct">.</span><span class="ident">tokenize</span><span class="punct">(</span> <span class="ident">text</span> <span class="punct">)</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">tok</span><span class="punct">|</span> |
208 | <span class="ident">value</span> <span class="punct">=</span> <span class="ident">html_escape</span><span class="punct">(</span><span class="ident">tok</span><span class="punct">)</span> |
209 | <span class="keyword">case</span> <span class="ident">tok</span><span class="punct">.</span><span class="ident">instruction</span> |
210 | <span class="keyword">when</span> <span class="symbol">:region_close</span> <span class="keyword">then</span> |
211 | <span class="ident">regions</span><span class="punct">.</span><span class="ident">pop</span> |
212 | <span class="ident">html</span> <span class="punct"><<</span> <span class="punct">"</span><span class="string"></span></span><span class="punct">"</span> |
213 | <span class="keyword">when</span> <span class="symbol">:region_open</span> <span class="keyword">then</span> |
214 | <span class="ident">regions</span><span class="punct">.</span><span class="ident">push</span> <span class="ident">tok</span><span class="punct">.</span><span class="ident">group</span> |
215 | <span class="ident">html</span> <span class="punct"><<</span> <span class="punct">"</span><span class="string"><span class=<span class="escape">\"</span><span class="expr">#{tok.group}</span><span class="escape">\"</span>><span class="expr">#{value}</span></span><span class="punct">"</span> |
216 | <span class="keyword">else</span> |
217 | <span class="keyword">if</span> <span class="ident">tok</span><span class="punct">.</span><span class="ident">group</span> <span class="punct">==</span> <span class="punct">(</span> <span class="ident">regions</span><span class="punct">.</span><span class="ident">last</span> <span class="punct">||</span> <span class="symbol">:normal</span> <span class="punct">)</span> |
218 | <span class="ident">html</span> <span class="punct"><<</span> <span class="ident">value</span> |
219 | <span class="keyword">else</span> |
220 | <span class="ident">html</span> <span class="punct"><<</span> <span class="punct">"</span><span class="string"><span class=<span class="escape">\"</span><span class="expr">#{tok.group}</span><span class="escape">\"</span>><span class="expr">#{value}</span></span></span><span class="punct">"</span> |
221 | <span class="keyword">end</span> |
222 | <span class="keyword">end</span> |
223 | <span class="keyword">end</span> |
224 | <span class="ident">html</span> <span class="punct"><<</span> <span class="punct">"</span><span class="string"></span></span><span class="punct">"</span> <span class="keyword">while</span> <span class="ident">regions</span><span class="punct">.</span><span class="ident">pop</span> |
225 | <span class="ident">html</span> <span class="punct"><<</span> <span class="punct">"</span><span class="string"></pre></span><span class="punct">"</span> <span class="keyword">if</span> <span class="ident">pre</span> |
226 | <span class="ident">html</span> |
227 | <span class="keyword">end</span> |
228 | |
229 | <span class="ident">private</span> |
230 | |
231 | <span class="comment"># Replaces some characters with their corresponding HTML entities.</span> |
232 | <span class="keyword">def </span><span class="method">html_escape</span><span class="punct">(</span> <span class="ident">string</span> <span class="punct">)</span> |
233 | <span class="ident">string</span><span class="punct">.</span><span class="ident">gsub</span><span class="punct">(</span> <span class="punct">/</span><span class="regex">&</span><span class="punct">/,</span> <span class="punct">"</span><span class="string">&amp;</span><span class="punct">"</span> <span class="punct">).</span> |
234 | <span class="ident">gsub</span><span class="punct">(</span> <span class="punct">/</span><span class="regex"><</span><span class="punct">/,</span> <span class="punct">"</span><span class="string">&lt;</span><span class="punct">"</span> <span class="punct">).</span> |
235 | <span class="ident">gsub</span><span class="punct">(</span> <span class="punct">/</span><span class="regex">></span><span class="punct">/,</span> <span class="punct">"</span><span class="string">&gt;</span><span class="punct">"</span> <span class="punct">).</span> |
236 | <span class="ident">gsub</span><span class="punct">(</span> <span class="punct">/</span><span class="regex">"</span><span class="punct">/,</span> <span class="punct">"</span><span class="string">&quot;</span><span class="punct">"</span> <span class="punct">)</span> |
237 | <span class="keyword">end</span> |
238 | |
239 | <span class="keyword">end</span> |
240 | |
241 | <span class="keyword">end</span> |
242 | <span class="keyword">end</span></pre></div></td></tr></table></div></div> |
243 | |
244 | |
245 | <p>Within the <code>#convert</code> method, you will automatically have access to the <code>tokenizer</code> instance variable—instantiated for you by the framework. The rest is up to you.</p> |
246 | </div> |
247 | |
248 | |
249 | |
250 | <div class="bottom"><div class="prevnext"> |
251 | |
252 | <a href="chapter-2.html">Previous (2. Lexical Analysis)</a> | |
253 | |
254 | <a href="index.html">Up</a> |
255 | |
256 | | <a href="chapter-4.html">Next (4. Extending Syntax)</a> |
257 | |
258 | </div></div> |
259 | |
260 | |
261 | </div> |
262 | |
263 | </td></tr> |
264 | </table> |
265 | </body> |
266 | </html> |