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