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