xref: /AOO41X/main/helpauthoring/HelpAuthoring/Validate.xba (revision ff0525f24f03981d56b7579b645949f111420994)
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