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