Skip to content

Commit b165f85

Browse files
committed
Add support for hiliting source code as HTML 5
Selecting the HTML 5 file type in custom save dialogue boxes now renders highlighted source code in correctly formatted HTML 5 documents. Revised the UHTMLBuilder unit so that the original THTMLBuilder class was refactored into an abstract template class containing HTML flavour-agnostic code. Added new TXHTMLBuilder and THTML5Builder concrete classes that can build XHTML and HTML 5 documents, respectively. XHTML output was modified to emit the correct <meta> data tag to describe the document content type. Similarly revised TXHTMLDocumentHiliter as a concrete sub class of a new THTMLDocumentHiliter abstract template class. The functionality of TXHTMLDocumentHiliter is unchanged. Added THTML5DocumentHiliter as another concrete subclass of THTMLDocumentHiliter that outputs HTML 5. Revised code in USnippetHTML that constructed a THTMLBuilder object to construct a TXHTMLBuilder object instead. Changed TFileHiliter.Hilite to highlight HTML 5 documents when the source file type is sfHTML5.
1 parent 28ac886 commit b165f85

File tree

4 files changed

+229
-95
lines changed

4 files changed

+229
-95
lines changed

Src/Hiliter.UFileHiliter.pas

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ function TFileHiliter.Hilite(const SourceCode, DocTitle: string): TEncodedData;
100100
case fFileType of
101101
sfRTF: HilitedDocCls := TRTFDocumentHiliter;
102102
sfXHTML: HilitedDocCls := TXHTMLDocumentHiliter;
103+
sfHTML5: HilitedDocCls := THTML5DocumentHiliter;
103104
else HilitedDocCls := TNulDocumentHiliter;
104105
end;
105106
if fWantHiliting and IsHilitingSupported(fFileType) then

Src/Hiliter.UHiliters.pas

Lines changed: 66 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -132,14 +132,16 @@ TNulDocumentHiliter = class sealed(TDocumentHiliter)
132132
/// <summary>
133133
/// Creates a highlighted source code document in XHTML format.
134134
/// </summary>
135-
TXHTMLDocumentHiliter = class sealed(TDocumentHiliter)
135+
THTMLDocumentHiliter = class abstract(TDocumentHiliter)
136136
strict private
137137
/// <summary>Generates the CSS rules to be used in the document.</summary>
138138
/// <param name="Attrs">IHiliteAttrs [in] Highlighting styles used in
139139
/// document.</param>
140140
/// <returns>string. CSS rules that apply styles specified in Attrs.
141141
/// </returns>
142142
class function GenerateCSSRules(Attrs: IHiliteAttrs): string;
143+
strict protected
144+
class function BuilderClass: THTMLBuilderClass; virtual; abstract;
143145
public
144146
/// <summary>Creates XHTML document containing highlighted source code.
145147
/// </summary>
@@ -154,6 +156,20 @@ TXHTMLDocumentHiliter = class sealed(TDocumentHiliter)
154156
override;
155157
end;
156158

159+
/// <summary>Creates a highlighted source code document in XHTML format.
160+
/// </summary>
161+
TXHTMLDocumentHiliter = class sealed(THTMLDocumentHiliter)
162+
strict protected
163+
class function BuilderClass: THTMLBuilderClass; override;
164+
end;
165+
166+
/// <summary>Creates a highlighted source code document in HTML5 format.
167+
/// </summary>
168+
THTML5DocumentHiliter = class sealed(THTMLDocumentHiliter)
169+
strict protected
170+
class function BuilderClass: THTMLBuilderClass; override;
171+
end;
172+
157173
type
158174
/// <summary>
159175
/// Creates a highlighted source code document in rich text format.
@@ -242,55 +258,56 @@ TRTFHiliteRenderer = class(THiliteRenderer, IHiliteRenderer)
242258
end;
243259

244260
type
245-
/// <summary>
246-
/// Renders highlighted source code in XHTML format. Generated code is
247-
/// recorded in a given HTML code builder object.
261+
/// <summary>Renders highlighted source code in any supported HTML format.
248262
/// </summary>
249-
/// <remarks>
250-
/// Designed for use with TSyntaxHiliter objects.
251-
/// </remarks>
263+
/// <remarks>Designed for use with <c>TSyntaxHiliter</c> objects.</remarks>
252264
THTMLHiliteRenderer = class(THiliteRenderer, IHiliteRenderer)
253265
strict private
254266
var
255-
/// <summary>Object used to record generated XHTML code.</summary>
267+
/// <summary>Object used to build up the generated HTML.</summary>
256268
fBuilder: THTMLBuilder;
257-
/// <summary>Flag indicating if writing first line of output.</summary>
269+
/// <summary>Flag indicating if writing the first line of output.
270+
/// </summary>
258271
fIsFirstLine: Boolean;
259272
public
260-
/// <summary>Object constructor. Sets up object to render documents.
261-
/// </summary>
262-
/// <param name="Builder">THTMLBuilder [in] Object that receives generated
263-
/// XHTML code.</param>
264-
/// <param name="Attrs">IHiliteAttrs [in] Specifies required highlighting
265-
/// style. If nil document is not highlighted.</param>
273+
/// <summary>Object constructor. Sets up the object to render HTML
274+
/// documents.</summary>
275+
/// <param name="Builder"><c>THTMLBuilder</c> [in] Object used to build the
276+
/// required HTML. <c>Builder</c> must be an instance of a concreate
277+
/// descendant class of <c>THTMLBuilder</c>, which is abstract. The type of
278+
/// <c>Builder</c> determines the type of HTML that is generated.</param>
279+
/// <param name="Attrs"><c>IHiliteAttrs</c> [in] Specifies required
280+
/// highlighting style. If <c>nil</c> the document is not highlighted.
281+
/// </param>
266282
constructor Create(const Builder: THTMLBuilder;
267283
const Attrs: IHiliteAttrs = nil);
268-
/// <summary>Initialises XHTML ready to receive highlighted code.</summary>
269-
/// <remarks>Method of IHiliteRenderer.</remarks>
284+
/// <summary>Initialises the HTML ready to receive highlighted code.
285+
/// </summary>
286+
/// <remarks>Method of <c>IHiliteRenderer</c>.</remarks>
270287
procedure Initialise;
271-
/// <summary>Tidies up XHTML after all highlighted code processed.
288+
/// <summary>Tidies up the HTML after all highlighted code is processed.
272289
/// </summary>
273-
/// <remarks>Method of IHiliteRenderer.</remarks>
290+
/// <remarks>Method of <c>IHiliteRenderer</c>.</remarks>
274291
procedure Finalise;
275-
/// <summary>Emits new line if necessary.</summary>
276-
/// <remarks>Method of IHiliteRenderer.</remarks>
292+
/// <summary>Emits a new line if necessary.</summary>
293+
/// <remarks>Method of <c>IHiliteRenderer</c>.</remarks>
277294
procedure BeginLine;
278295
/// <summary>Does nothing.</summary>
279296
/// <remarks>
280-
/// <para>Handling of new lines is all done by BeginLine.</para>
281-
/// <para>Method of IHiliteRenderer.</para>
297+
/// <para>Handling of new lines is all done by <c>BeginLine</c>.</para>
298+
/// <remarks>Method of <c>IHiliteRenderer</c>.</remarks>
282299
/// </remarks>
283300
procedure EndLine;
284-
/// <summary>Emits any span tag required to style following source code
285-
/// element as specified by Elem.</summary>
286-
/// <remarks>Method of IHiliteRenderer.</remarks>
301+
/// <summary>Emits any &lt;span&gt; tag required to style the following
302+
/// source code element, specified by <c>Elem</c>.</summary>
303+
/// <remarks>Method of <c>IHiliteRenderer</c>.</remarks>
287304
procedure BeforeElem(Elem: THiliteElement);
288-
/// <summary>Writes given source code element text.</summary>
289-
/// <remarks>Method of IHiliteRenderer.</remarks>
305+
/// <summary>Writes the given source code element text.</summary>
306+
/// <remarks>Method of <c>IHiliteRenderer</c>.</remarks>
290307
procedure WriteElemText(const Text: string);
291-
/// <summary>Closes any span tag used to style source code element
292-
/// specified by Elem.</summary>
293-
/// <remarks>Method of IHiliteRenderer.</remarks>
308+
/// <summary>Closes any &lt;span&gt; tag used to style the source code
309+
/// element specified by <c>Elem</c>.</summary>
310+
/// <remarks>Method of <c>IHiliteRenderer</c>.</remarks>
294311
procedure AfterElem(Elem: THiliteElement);
295312
end;
296313

@@ -372,9 +389,9 @@ class function TNulDocumentHiliter.Hilite(const RawCode: string;
372389
Result := TEncodedData.Create(RawCode, etUnicode);
373390
end;
374391

375-
{ TXHTMLDocumentHiliter }
392+
{ THTMLDocumentHiliter }
376393

377-
class function TXHTMLDocumentHiliter.GenerateCSSRules(Attrs: IHiliteAttrs):
394+
class function THTMLDocumentHiliter.GenerateCSSRules(Attrs: IHiliteAttrs):
378395
string;
379396
var
380397
CSSBuilder: TCSSBuilder; // builds CSS code
@@ -396,7 +413,7 @@ class function TXHTMLDocumentHiliter.GenerateCSSRules(Attrs: IHiliteAttrs):
396413
end;
397414
end;
398415

399-
class function TXHTMLDocumentHiliter.Hilite(const RawCode: string;
416+
class function THTMLDocumentHiliter.Hilite(const RawCode: string;
400417
Attrs: IHiliteAttrs; const Title: string): TEncodedData;
401418
resourcestring
402419
// Default document title
@@ -405,7 +422,7 @@ class function TXHTMLDocumentHiliter.Hilite(const RawCode: string;
405422
Renderer: IHiliteRenderer; // XHTML renderer object
406423
Builder: THTMLBuilder; // object used to construct XHTML document
407424
begin
408-
Builder := THTMLBuilder.Create;
425+
Builder := BuilderClass.Create;
409426
try
410427
if Title <> '' then
411428
Builder.Title := Title
@@ -420,6 +437,20 @@ class function TXHTMLDocumentHiliter.Hilite(const RawCode: string;
420437
end;
421438
end;
422439

440+
{ TXHTMLDocumentHiliter }
441+
442+
class function TXHTMLDocumentHiliter.BuilderClass: THTMLBuilderClass;
443+
begin
444+
Result := TXHTMLBuilder;
445+
end;
446+
447+
{ THTML5DocumentHiliter }
448+
449+
class function THTML5DocumentHiliter.BuilderClass: THTMLBuilderClass;
450+
begin
451+
Result := THTML5Builder;
452+
end;
453+
423454
{ TRTFDocumentHiliter }
424455

425456
class function TRTFDocumentHiliter.Hilite(const RawCode: string;

0 commit comments

Comments
 (0)