1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
3<!--***********************************************************
4 *
5 * Licensed to the Apache Software Foundation (ASF) under one
6 * or more contributor license agreements.  See the NOTICE file
7 * distributed with this work for additional information
8 * regarding copyright ownership.  The ASF licenses this file
9 * to you under the Apache License, Version 2.0 (the
10 * "License"); you may not use this file except in compliance
11 * with the License.  You may obtain a copy of the License at
12 *
13 *   http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing,
16 * software distributed under the License is distributed on an
17 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
18 * KIND, either express or implied.  See the License for the
19 * specific language governing permissions and limitations
20 * under the License.
21 *
22 ***********************************************************-->
23<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Validate" script:language="StarBasic">
24&apos;############################################
25&apos;  VALIDATION ROUTINES
26&apos;############################################
27
28Dim sSwitchType As String
29Dim sCellSwitchType As String
30Dim sCaseType As String
31Dim sCellCaseType As String
32Dim sDefaultType As String
33Dim sCellDefaultType As String
34Dim bDefaultSet As Boolean
35Dim bCellDefaultSet As Boolean
36Dim bCaseSet As Boolean
37Dim bCellCaseSet As Boolean
38Dim aTagsOpen(0) As String
39Dim aCellTagsOpen(0) As String
40Dim bWarn As Boolean
41Dim bWarnEmptyPara As Boolean
42Dim bWarnParaNoID As Boolean
43
44
45Sub ValidateXHP
46	Validate
47End Sub
48
49Sub Validate
50
51	If not IsHelpFile Then
52		msgbox(strErr_NoHelpFile)
53		Exit Sub
54	End If
55
56	oDoc = StarDesktop.CurrentComponent
57	sSwitchType = &quot;&quot;
58	sCaseType = &quot;&quot;
59	sDefaultType = &quot;&quot;
60	bWarn = TRUE
61	bWarnEmptyPara = TRUE
62	bWarnParaNoID = TRUE
63
64	CheckMetaData(oDoc)
65	CheckHeading(oDoc)
66
67	Enum = oDoc.Text.createEnumeration
68	Do While Enum.hasMoreElements
69
70		TextElement = Enum.nextElement
71		If TextElement.supportsService(&quot;com.sun.star.text.Paragraph&quot;) Then		&apos; we are a paragraph
72
73			CheckSwitches(TextElement)
74			CheckParaID(TextElement)
75			CheckParaFormat(TextElement)
76			CheckTags(TextElement)
77			CheckInlineTags(TextElement)
78
79		ElseIf	TextElement.supportsService(&quot;com.sun.star.text.TextTable&quot;) Then
80
81			If sSwitchType &lt;&gt; &quot;&quot; AND (sCaseType = &quot;&quot; AND sDefaultType = &quot;&quot;) Then &apos;&lt;------
82				Terminate(&quot;Switch must be closed or case/default must be opened before a table starts.&quot;,tmpCellElement)
83			End If
84
85			CheckCell(TextElement)
86		End If
87	Loop
88
89	If sCaseType &lt;&gt; &quot;&quot; Then
90		Terminate(&quot;Previous case (&quot;+sCaseType+&quot;) not closed!&quot;,TextElement)
91	End If
92
93	If sDefaultType &lt;&gt; &quot;&quot; Then
94		Terminate(&quot;Previous default not closed!&quot;,TextElement)
95	End If
96
97	If sSwitchType &lt;&gt; &quot;&quot; Then
98		Terminate(&quot;Previous switch (&quot;+sSwitchType+&quot;) not closed!&quot;,TextElement)
99	End If
100
101	If ubound(aTagsOpen()) &gt; 0 Then
102		Terminate(&quot;Element &quot;+aTagsOpen(ubound(aTagsOpen()))+&quot; not closed&quot;,TextElement)
103	End If
104
105	msgbox(&quot;Validation finished.&quot;)
106
107End Sub
108
109&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
110&apos; CHECKCELL
111&apos; checks a table cell contents
112&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
113
114Sub CheckCell(TE As Object)
115	On Local Error Goto ERRHANDLE:
116
117	CellName = &quot;A1&quot;
118	Cell = TE.getCellByName(CellName)
119	tmpCellEnum = Cell.createEnumeration
120	tmpCellElement = tmpCellEnum.nextElement
121
122	Rows = TE.getRows
123	Cols = TE.getColumns
124
125	ReDim aCellTagsOpen(0)
126
127	For RowIndex = 1 to Rows.getCount()
128
129		For ColIndex = 1 to Cols.getCount()
130
131			CellName = Chr(64 + ColIndex) &amp; RowIndex
132			Cell = TE.getCellByName(CellName)
133			CellEnum = Cell.createEnumeration
134
135			Do While CellEnum.hasMoreElements
136
137				CellElement = CellEnum.nextElement		&apos; &lt;-- MODIFY, check closed switches within cells
138
139				If CellElement.supportsService(&quot;com.sun.star.text.Paragraph&quot;) Then
140					CheckSwitchesInCell(CellElement)
141					CheckParaID(CellElement)
142					CheckParaFormat(CellElement)
143					CheckTagsInCell(CellElement)
144					CheckInlineTags(CellElement)
145				EndIf
146
147			Loop
148
149			If sCellCaseType &lt;&gt; &quot;&quot; Then
150				Terminate(&quot;Previous case (&quot;+sCellCaseType+&quot;) not closed!&quot;,CellElement)
151			End If
152
153			If sCellSwitchType &lt;&gt; &quot;&quot; Then
154				Terminate(&quot;Previous switch (&quot;+sCellSwitchType+&quot;) not closed!&quot;,CellElement)
155			End If
156
157			If ubound(aCellTagsOpen()) &gt; 0 Then
158				Terminate(&quot;Element &quot;+aCellTagsOpen(ubound(aCellTagsOpen()))+&quot; not closed&quot;,CellElement)
159			End If
160
161		Next
162	Next
163
164	ERRHANDLE:
165		If Err &lt;&gt; 0 Then
166			msgbox &quot;Error: &quot;+chr(13)+ Error$,48,&quot;D&apos;oh!&quot;
167		End If
168End Sub
169
170&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
171&apos; CHECK PARA ID
172&apos; checks a paragraph for an ID
173&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
174
175Sub CheckParaID(TE As Object)
176
177	If Left(TE.ParaStyleName,4) = &quot;hlp_&quot; AND Not(Left(TE.ParaStyleName,8) = &quot;hlp_aux_&quot;) Then
178
179		sText = TE.GetString
180
181		If sText = &quot;&quot; Then
182			If bWarnEmptyPara Then
183				Warn(&quot;Empty Paragraph&quot;,&quot;Empty paragraphs should be avoided. Do not use empty paragraphs for formatting purpose.&quot;,TE)
184				bWarnEmptyPara = FALSE
185			End If
186		Else
187
188			TP = TE.createEnumeration
189			Ct = 0
190			posID = 0
191
192			While TP.hasmoreElements
193				Ct = Ct+1
194				TPE = TP.nextElement
195				If TPE.TextPortionType=&quot;TextField&quot; Then
196					If TPE.TextField.TextFieldMaster.Name=&quot;ID&quot; Then
197						posID = Ct
198					End If
199				End If
200				&apos; Lets cheat and allow empty strings before the ID -- otherwise we&apos;ll get
201				&apos; a validation error if a paragraph starts at the top of a page after
202				&apos; a page break (for whatever reason)
203				If TPE.String = &quot;&quot; Then
204					Ct = Ct-1
205				End If
206			Wend
207
208			If posID = 0 Then
209				If bWarnParaNoID Then
210	 				Warn(&quot;Paragraph has no id.&quot;,&quot;IDs will be assigned on save. You can also assign an ID using the Assign Paragraph ID menu item&quot;,TPE)
211	 				bWarnParaNoID = FALSE
212					InsertNewParaData
213	 			Else
214	 				oCur = TE.getText.createTextCursorByRange(TE)
215					thiscomponent.getcurrentcontroller.select(oCur)
216					InsertNewParaData
217	 			End If
218			ElseIf posID &gt; 1 Then
219				Terminate(&quot;Paragraph ID not at the start of the paragraph. The paragraph ID must be the first element of a paragraph. Move the ID to the beginning of the paragraph&quot;,TPE)
220			End If
221
222		End If
223
224	End If
225End Sub
226
227&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
228&apos; CHECK PARA FORMAT
229&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
230Sub CheckParaFormat(TE As Object)
231
232	sText = TE.GetString
233	If Left(TE.ParaStyleName,4) &lt;&gt; &quot;hlp_&quot; AND sText &lt;&gt; &quot;&quot; Then    &apos; just disregard empty paras in wrong formats
234		Warn(&quot;Invalid paragraph format. Contents will be lost.&quot;,_
235		     &quot;Use only the paragraph styles starting with &quot;&quot;hlp_&quot;&quot;.&quot;+_
236		     &quot; Paragraphs in other formats will be lost on export&quot;,TE)
237	End If
238
239End Sub
240
241&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
242&apos; CHECK SWITCHES
243&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
244Sub CheckSwitches(TE As Object)
245
246	If TE.ParaStyleName=&quot;hlp_aux_switch&quot; Then					&apos; we are a switch or case or default
247		sText = TE.GetString									&apos; get the switch contents
248
249		If Left(sText,8) = &quot;&lt;SWITCH &quot; Then								&apos; an opening switch tag
250
251			If sSwitchType = &quot;&quot; Then									&apos; no other switch is open
252				sSwitchType = Right(sText,Len(sText)-16)
253				sSwitchType = Left(sSwitchType,InStr(sSwitchType,&quot;&quot;&quot;&quot;)-1)
254
255				If (sSwitchType &lt;&gt; &quot;sys&quot; AND sSwitchType &lt;&gt; &quot;appl&quot; AND sSwitchType &lt;&gt; &quot;distrib&quot;) Then
256					Terminate(&quot;Unknown switch type &quot;&quot;&quot;+sSwitchType+&quot;&quot;&quot;&quot;,TE)
257				End If
258
259			Else
260				Terminate(&quot;Previous switch (&quot;+sSwitchType+&quot;) not closed!&quot;,TE)
261			End If
262
263		End If	&apos; OPENING SWITCH
264
265		If Left(sText,8) = &quot;&lt;/SWITCH&quot; Then								&apos; a closing switch tag
266
267			If sSwitchType = &quot;&quot; Then									&apos; there was no switch open
268				Terminate(&quot;No switch open!&quot;,TE)
269			Else
270				If not(bCaseSet OR bDefaultSet) Then
271					Terminate(&quot;Empty switch&quot;,TE)
272				End If
273
274				If sCaseType &lt;&gt; &quot;&quot; Then									&apos; there is still a case open
275					Terminate(&quot;Previous case (&quot;+sCaseType+&quot;) not closed!&quot;,TE)
276				End If
277				sSwitchType = &quot;&quot;
278				bDefaultSet = FALSE
279				bCaseSet = FALSE
280			End If
281
282		End If  &apos; CLOSING SWITCH
283
284		If Left(sText,6) = &quot;&lt;CASE &quot; Then								&apos; an opening case tag
285
286			If bDefaultSet Then
287				Terminate(&quot;No case after default allowed.&quot;,TE)
288			End If
289
290			If sCaseType = &quot;&quot; Then
291				sCaseType = Right(sText,Len(sText)-14)
292				sCaseType = Left(sCaseType,InStr(sCaseType,&quot;&quot;&quot;&quot;)-1)
293				bCaseSet = TRUE
294				If sSwitchType = &quot;&quot; Then
295					Terminate(&quot;Case without switch&quot;,TE)
296				End If
297			Else
298				Terminate(&quot;Previous case (&quot;+sCaseType+&quot;) not closed!&quot;,TE)
299			End If
300
301		End If  &apos; OPENING CASE
302
303		If Left(sText,6) = &quot;&lt;/CASE&quot; Then								&apos; a closing case tag
304
305			If sCaseType = &quot;&quot; Then
306				Terminate(&quot;No case open!&quot;,TE)
307			Else
308				sCaseType = &quot;&quot;
309			End If
310
311		End If  &apos; CLOSING  CASE
312
313		If Left(sText,8) = &quot;&lt;DEFAULT&quot; Then								&apos; an opening default tag
314
315			If sCaseType = &quot;&quot; Then
316				If (sDefaultType &lt;&gt; &quot;&quot; OR bDefaultSet) Then
317					Terminate(&quot;Multiple default not allowed.&quot;,TE)
318				Else
319					sDefaultType = &quot;DEFAULT&quot;
320
321					If sSwitchType = &quot;&quot; Then
322						Terminate(&quot;Default without switch&quot;,TE)
323					End If
324				End If
325				sDefaultType = &quot;DEFAULT&quot;
326				bDefaultSet = TRUE
327			Else
328				Terminate(&quot;Previous case (&quot;+sCaseType+&quot;) not closed!&quot;,TE)
329			End If
330
331		End If  &apos; OPENING CASE
332
333		If Left(sText,9) = &quot;&lt;/DEFAULT&quot; Then								&apos; a closing default tag
334
335			If sDefaultType &lt;&gt; &quot;DEFAULT&quot; Then
336				Terminate(&quot;No default open!&quot;,TE)
337			Else
338				sDefaultType = &quot;&quot;
339			End If
340
341		End If  &apos; CLOSING  CASE
342	Else  &apos; We are not hlp_aux_switch
343		If (sSwitchType &lt;&gt; &quot;&quot; AND sCaseType = &quot;&quot; AND sDefaultType = &quot;&quot;) Then
344			Terminate(&quot;Nothing allowed between switch and case or default or /case or /default and /switch&quot;, TE)
345		End If
346	End If
347
348End Sub
349
350&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
351&apos; CHECK SWITCHES IN A CELL
352&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
353Sub CheckSwitchesInCell(CE As Object)
354
355	If CE.ParaStyleName=&quot;hlp_aux_switch&quot; Then					&apos; we are a switch or case or default
356		sText = CE.GetString									&apos; get the switch contents
357
358		If Left(sText,8) = &quot;&lt;SWITCH &quot; Then								&apos; an opening switch tag
359
360			If sCellSwitchType = &quot;&quot; Then									&apos; no other switch is open
361				sCellSwitchType = Right(sText,Len(sText)-16)
362				sCellSwitchType = Left(sCellSwitchType,InStr(sCellSwitchType,&quot;&quot;&quot;&quot;)-1)
363
364				If (sCellSwitchType &lt;&gt; &quot;sys&quot; AND sCellSwitchType &lt;&gt; &quot;appl&quot; AND sCellSwitchType &lt;&gt; &quot;distrib&quot;) Then
365					Terminate(&quot;Unknown switch type &quot;&quot;&quot;+sCellSwitchType+&quot;&quot;&quot;&quot;,CE)
366				End If
367
368			Else
369				Terminate(&quot;Previous switch (&quot;+sCellSwitchType+&quot;) not closed!&quot;,CE)
370			End If
371
372		End If	&apos; OPENING SWITCH
373
374		If Left(sText,8) = &quot;&lt;/SWITCH&quot; Then								&apos; a closing switch tag
375
376			If sCellSwitchType = &quot;&quot; Then									&apos; there was no switch open
377				Terminate(&quot;No switch open!&quot;,CE)
378			Else
379				If not(bCellCaseSet OR bCellDefaultSet) Then
380					Terminate(&quot;Empty switch&quot;,CE)
381				End If
382
383				If sCellCaseType &lt;&gt; &quot;&quot; Then									&apos; there is still a case open
384					Terminate(&quot;Previous case (&quot;+sCellCaseType+&quot;) not closed!&quot;,CE)
385				End If
386				sCellSwitchType = &quot;&quot;
387				bCellDefaultSet = FALSE
388				bCellCaseSet = FALSE
389			End If
390
391		End If  &apos; CLOSING SWITCH
392
393		If Left(sText,6) = &quot;&lt;CASE &quot; Then								&apos; an opening case tag
394
395			If bCellDefaultSet Then
396				Terminate(&quot;No case after default allowed.&quot;,CE)
397			End If
398
399			If sCellCaseType = &quot;&quot; Then
400				sCellCaseType = Right(sText,Len(sText)-14)
401				sCellCaseType = Left(sCellCaseType,InStr(sCellCaseType,&quot;&quot;&quot;&quot;)-1)
402				bCellCaseSet = TRUE
403				If sCellSwitchType = &quot;&quot; Then
404					Terminate(&quot;Case without switch&quot;,CE)
405				End If
406			Else
407				Terminate(&quot;Previous case (&quot;+sCellCaseType+&quot;) not closed!&quot;,CE)
408			End If
409
410		End If  &apos; OPENING CASE
411
412		If Left(sText,6) = &quot;&lt;/CASE&quot; Then								&apos; a closing case tag
413
414			If sCellCaseType = &quot;&quot; Then
415				Terminate(&quot;No case open!&quot;,CE)
416			Else
417				sCellCaseType = &quot;&quot;
418			End If
419
420		End If  &apos; CLOSING  CASE
421
422		If Left(sText,8) = &quot;&lt;DEFAULT&quot; Then								&apos; an opening default tag
423
424			If sCellCaseType = &quot;&quot; Then
425				If (sCellDefaultType &lt;&gt; &quot;&quot; OR bCellDefaultSet) Then
426					Terminate(&quot;Multiple default not allowed.&quot;,CE)
427				Else
428					sCellDefaultType = &quot;DEFAULT&quot;
429
430					If sCellSwitchType = &quot;&quot; Then
431						Terminate(&quot;Default without switch&quot;,CE)
432					End If
433				End If
434				sCellDefaultType = &quot;DEFAULT&quot;
435				bCellDefaultSet = TRUE
436			Else
437				Terminate(&quot;Previous case (&quot;+sCellCaseType+&quot;) not closed!&quot;,CE)
438			End If
439
440		End If  &apos; OPENING CASE
441
442		If Left(sText,9) = &quot;&lt;/DEFAULT&quot; Then								&apos; a closing default tag
443
444			If sCellDefaultType &lt;&gt; &quot;DEFAULT&quot; Then
445				Terminate(&quot;No default open!&quot;,CE)
446			Else
447				sCellDefaultType = &quot;&quot;
448			End If
449
450		End If  &apos; CLOSING  CASE
451	Else  &apos; We are not hlp_aux_switch
452		If (sCellSwitchType &lt;&gt; &quot;&quot; AND sCellCaseType = &quot;&quot; AND sCellDefaultType = &quot;&quot;) Then
453			Terminate(&quot;Nothing allowed between switch and case or default or /case or /default and /switch&quot;, CE)
454		End If
455	End If
456
457
458End Sub
459
460
461&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
462&apos; TERMINATE VALIDATION WITH AN ERROR MESSAGE
463&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
464Sub Terminate(sStr As String, TE As Object)
465
466	oCur = TE.getText.createTextCursorByRange(TE)
467	thiscomponent.getcurrentcontroller.select(oCur)
468	msgbox sStr,48,&quot;D&apos;oh!&quot;
469	Stop
470
471End Sub
472
473&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
474&apos; SHOW A WARNING
475&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
476Sub Warn(sWarn As String, sSolv As String, Optional TE As Object)
477
478	If bWarn Then
479		BasicLibraries.LoadLibrary(&quot;HelpAuthoring&quot;)
480		oDialog = LoadDialog(&quot;HelpAuthoring&quot;, &quot;dlgWarn&quot;)
481		oTxtWarn = oDialog.GetControl(&quot;txtWarning&quot;)
482		oTxtWarn.Text = sWarn
483		oTxtSolv = oDialog.GetControl(&quot;txtSolution&quot;)
484		oTxtSolv.Text = sSolv
485
486		If not(IsMissing(TE)) Then
487			oCur = TE.getText.createTextCursorByRange(TE)
488			thiscomponent.getcurrentcontroller.select(oCur)
489		End If
490
491		If oDialog.Execute() = 1 Then
492			oCbWarn = oDialog.GetControl(&quot;cbWarn&quot;)
493			If oCbWarn.State = 1 Then
494				bWarn = FALSE
495			End If
496			Exit Sub
497		Else
498			Stop
499		End If
500	End If
501End Sub
502
503&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
504&apos; CHECK DOCUMENT META DATA
505&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
506Sub CheckMetaData(oDoc As Object)
507
508	sTopicID = oDoc.DocumentInfo.GetUserFieldValue(1)
509
510	If sTopicID &lt;&gt; AlphaNum(sTopicID) OR sTopicID=&quot;&quot; Then
511		sTopicID = &quot;topic_&quot;+CreateID &apos; create a topic id
512	End If
513
514	oDoc.DocumentInfo.SetUserFieldValue(1,sTopicID)
515	sCreated = oDoc.DocumentInfo.GetUserFieldValue(2)
516	sEdited = oDoc.DocumentInfo.GetUserFieldValue(3)
517	sTitle = oDoc.DocumentInfo.Title
518
519	If sTitle=&quot;&quot; OR sTitle=&quot;&lt;Set Topic Title&gt;&quot; Then
520		Enum = document.Text.createEnumeration
521		Do While Enum.hasMoreElements
522			TextElement = Enum.nextElement
523			If TextElement.supportsService(&quot;com.sun.star.text.Paragraph&quot;) Then
524				If Left(TextElement.ParaStyleName,8)=&quot;hlp_head&quot; Then
525					Enum2 = TextElement.createEnumeration
526					While Enum2.hasMoreElements
527						TextPortion = Enum2.nextElement
528						If Not(TextPortion.TextPortionType=&quot;TextField&quot;) Then
529							strg = strg + TextPortion.String
530						End If
531					Wend
532					document.DocumentInfo.Title = strg
533					Exit Do
534				End If
535			End If
536		Loop
537	End If
538
539	sIndex = oDoc.DocumentInfo.GetUserFieldValue(0)
540
541End Sub
542
543&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
544&apos; CHECK IF HEADING EXISTS
545&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
546Sub CheckHeading(oDoc As Object)
547
548End Sub
549
550&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
551&apos; CHECK FOR CORRECT INLINE TAGS
552&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
553Sub CheckInlineTags(TE As Object)
554
555
556
557	If Left(TE.ParaStyleName,4)=&quot;hlp_&quot; AND (Left(TE.ParaStyleName,8)&lt;&gt;&quot;hlp_aux_&quot; OR TE.ParaStyleName=&quot;hlp_aux_bookmark&quot;) Then
558
559		Dim aTokens(0) As Object
560		Dim aInlineTagsOpen(0) As String
561		TP = TE.createEnumeration
562
563		While TP.hasmoreElements
564			sDim = ubound(aTokens())+1
565			ReDim Preserve aTokens(sDim) As Object
566			aTokens(sDim) = TP.nextElement
567		Wend
568
569		For i=1 to ubound(aTokens())
570			Token = aTokens(i)
571
572			If Token.supportsService(&quot;com.sun.star.text.TextField&quot;) Then
573				sTag = Token.TextField.TextFieldMaster.Name
574
575				If Right(sTag,1)=&quot;_&quot; Then   &apos; a tag starts
576
577					sTagName = Left(sTag,Len(sTag)-1)
578
579					&apos; check for forbidden tags in paragraphs
580					sTagFormat = TagFormatIsCorrect(sTagName, TE.ParaStyleName)
581					If sTagFormat &lt;&gt; &quot;&quot; Then
582						Terminate(sTagName+&quot; element has wrong paragraph style (&quot;+TE.ParaStyleName+&quot;).&quot;+chr(13)+&quot;Must be &quot;+sTagFormat,Token)
583					End If
584
585					sDim = ubound(aInlineTagsOpen())+1
586					Redim Preserve aInlineTagsOpen(sDim) as String
587					aInlineTagsOpen(sDim)=sTagName
588
589				ElseIf Left(sTag,1)=&quot;_&quot; Then  &apos; a tag ends, all other cases are empty tags
590
591					sTagName = Right(sTag,Len(sTag)-1)
592
593					&apos; check for forbidden tags in paragraphs
594					sTagFormat = TagFormatIsCorrect(sTagName, TE.ParaStyleName)
595					If sTagFormat &lt;&gt; &quot;&quot; Then
596						Terminate(sTagName+&quot; element has wrong paragraph style (&quot;+TE.ParaStyleName+&quot;).&quot;+chr(13)+&quot;Must be &quot;+sTagFormat,Token)
597					End If
598
599					If ubound(aInlineTagsOpen()) &gt; 0 Then
600						If aInlineTagsOpen(ubound(aInlineTagsOpen())) &lt;&gt; sTagName Then
601							Terminate(&quot;Inline Element &quot;+aInlineTagsOpen(ubound(aInlineTagsOpen()))+&quot; not closed&quot;,Token)
602						End If
603						sDim = ubound(aInlineTagsOpen())-1
604					Else
605						Terminate(&quot;No opening tag for &quot;+sTagName,Token)
606					End If
607					Redim Preserve aInlineTagsOpen(sDim) as String
608
609				Else &apos; empty tag
610					sTagName = sTag
611					sTagFormat = TagFormatIsCorrect(sTagName, TE.ParaStyleName)
612					If sTagFormat &lt;&gt; &quot;&quot; Then
613						Terminate(sTagName+&quot; element has wrong paragraph style (&quot;+TE.ParaStyleName+&quot;).&quot;+chr(13)+&quot;Must be &quot;+sTagFormat,Token)
614					End If
615
616				EndIf
617			ElseIf (i &gt; 1) AND (Trim(Token.String) &lt;&gt; &quot;&quot;) Then
618				If aInlineTagsOpen(ubound(aInlineTagsOpen())) = &quot;SWITCHINLINE&quot; Then
619					Terminate(&quot;No text allowed here.&quot;,Token)
620				End If
621			End If
622		Next
623
624	If ubound(aInlineTagsOpen()) &gt; 0 Then
625		Terminate(&quot;Inline Element &quot;+aInlineTagsOpen(ubound(aInlineTagsOpen()))+&quot; not closed&quot;,Token)
626	End If
627
628	End If
629End Sub
630
631&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
632&apos; CHECK FOR CORRECT TAGS
633&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
634Sub CheckTags(TE As Object)
635	If (Left(TE.ParaStyleName,8) = &quot;hlp_aux_&quot; AND TE.ParaStyleName &lt;&gt; &quot;hlp_aux_bookmark&quot;) Then
636
637	TP = TE.createEnumeration
638
639	While TP.hasmoreElements
640		TPE = TP.nextElement
641
642		If TPE.supportsService(&quot;com.sun.star.text.TextField&quot;) Then
643			sTag = TPE.TextField.TextFieldMaster.Name
644			If Right(sTag,1)=&quot;_&quot; Then   &apos; a tag starts
645
646				sTagName = Left(sTag,Len(sTag)-1)
647				sDim = ubound(aTagsOpen())+1
648				Redim Preserve aTagsOpen(sDim) as String
649				aTagsOpen(sDim)=sTagName
650
651			ElseIf Left(sTag,1)=&quot;_&quot; Then  &apos; a tag ends, all other cases are empty tags
652
653				sTagName = Right(sTag,Len(sTag)-1)
654				If ubound(aTagsOpen()) &gt; 0 Then
655					If aTagsOpen(ubound(aTagsOpen())) &lt;&gt; sTagName Then
656						Terminate(&quot;No close tag for &quot;+aTagsOpen(ubound(aTagsOpen())),TPE)
657					Else
658						sDim = ubound(aTagsOpen())-1
659					End If
660				Else
661					Terminate(&quot;No opening tag for &quot;+sTagName,TPE)
662				End If
663				Redim Preserve aTagsOpen(sDim) as String
664
665			Else &apos; empty tags
666
667			EndIf
668		End If
669	Wend
670	End If
671End Sub
672
673&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
674&apos; CHECK FOR CORRECT TAGS IN A TABLE CELL
675&apos;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
676Sub CheckTagsInCell(CE As Object)
677	If (Left(CE.ParaStyleName,8) = &quot;hlp_aux_&quot; AND CE.ParaStyleName &lt;&gt; &quot;hlp_aux_bookmark&quot;) Then
678
679	CP = CE.createEnumeration
680
681	While CP.hasmoreElements
682		CPE = CP.nextElement
683
684		If CPE.supportsService(&quot;com.sun.star.text.TextField&quot;) Then
685			sTag = CPE.TextField.TextFieldMaster.Name
686			If Right(sTag,1)=&quot;_&quot; Then   &apos; a tag starts
687
688				sTagName = Left(sTag,Len(sTag)-1)
689				sDim = ubound(aCellTagsOpen())+1
690				Redim Preserve aCellTagsOpen(sDim) as String
691				aCellTagsOpen(sDim)=sTagName
692
693			ElseIf Left(sTag,1)=&quot;_&quot; Then  &apos; a tag ends, all other cases are empty tags
694
695				sTagName = Right(sTag,Len(sTag)-1)
696				If ubound(aCellTagsOpen()) &gt; 0 Then
697					If aCellTagsOpen(ubound(aCellTagsOpen())) &lt;&gt; sTagName Then
698						Terminate(&quot;No close tag for &quot;+aCellTagsOpen(ubound(aCellTagsOpen())),CPE)
699					Else
700						sDim = ubound(aCellTagsOpen())-1
701					End If
702				Else
703					Terminate(&quot;No opening tag for &quot;+sTagName,CPE)
704				End If
705				Redim Preserve aCellTagsOpen(sDim) as String
706
707			EndIf
708		End If
709	Wend
710	End If
711End Sub
712
713</script:module>
714