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'############################################ 25*b1cdbd2cSJim Jagielski' VALIDATION ROUTINES 26*b1cdbd2cSJim Jagielski' 27*b1cdbd2cSJim Jagielski' May, 19 2004 - fpe 28*b1cdbd2cSJim Jagielski'############################################ 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 = "" 60*b1cdbd2cSJim Jagielski sCaseType = "" 61*b1cdbd2cSJim Jagielski sDefaultType = "" 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("com.sun.star.text.Paragraph") Then ' 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("com.sun.star.text.TextTable") Then 82*b1cdbd2cSJim Jagielski 83*b1cdbd2cSJim Jagielski If sSwitchType <> "" AND (sCaseType = "" AND sDefaultType = "") Then '<------ 84*b1cdbd2cSJim Jagielski Terminate("Switch must be closed or case/default must be opened before a table starts.",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 <> "" Then 92*b1cdbd2cSJim Jagielski Terminate("Previous case ("+sCaseType+") not closed!",TextElement) 93*b1cdbd2cSJim Jagielski End If 94*b1cdbd2cSJim Jagielski 95*b1cdbd2cSJim Jagielski If sDefaultType <> "" Then 96*b1cdbd2cSJim Jagielski Terminate("Previous default not closed!",TextElement) 97*b1cdbd2cSJim Jagielski End If 98*b1cdbd2cSJim Jagielski 99*b1cdbd2cSJim Jagielski If sSwitchType <> "" Then 100*b1cdbd2cSJim Jagielski Terminate("Previous switch ("+sSwitchType+") not closed!",TextElement) 101*b1cdbd2cSJim Jagielski End If 102*b1cdbd2cSJim Jagielski 103*b1cdbd2cSJim Jagielski If ubound(aTagsOpen()) > 0 Then 104*b1cdbd2cSJim Jagielski Terminate("Element "+aTagsOpen(ubound(aTagsOpen()))+" not closed",TextElement) 105*b1cdbd2cSJim Jagielski End If 106*b1cdbd2cSJim Jagielski 107*b1cdbd2cSJim Jagielski msgbox("Validation finished.") 108*b1cdbd2cSJim Jagielski 109*b1cdbd2cSJim JagielskiEnd Sub 110*b1cdbd2cSJim Jagielski 111*b1cdbd2cSJim Jagielski'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 112*b1cdbd2cSJim Jagielski' CHECKCELL 113*b1cdbd2cSJim Jagielski' checks a table cell contents 114*b1cdbd2cSJim Jagielski'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 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 = "A1" 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) & 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 ' <-- MODIFY, check closed switches within cells 140*b1cdbd2cSJim Jagielski 141*b1cdbd2cSJim Jagielski If CellElement.supportsService("com.sun.star.text.Paragraph") 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 <> "" Then 152*b1cdbd2cSJim Jagielski Terminate("Previous case ("+sCellCaseType+") not closed!",CellElement) 153*b1cdbd2cSJim Jagielski End If 154*b1cdbd2cSJim Jagielski 155*b1cdbd2cSJim Jagielski If sCellSwitchType <> "" Then 156*b1cdbd2cSJim Jagielski Terminate("Previous switch ("+sCellSwitchType+") not closed!",CellElement) 157*b1cdbd2cSJim Jagielski End If 158*b1cdbd2cSJim Jagielski 159*b1cdbd2cSJim Jagielski If ubound(aCellTagsOpen()) > 0 Then 160*b1cdbd2cSJim Jagielski Terminate("Element "+aCellTagsOpen(ubound(aCellTagsOpen()))+" not closed",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 <> 0 Then 168*b1cdbd2cSJim Jagielski msgbox "Error: "+chr(13)+ Error$,48,"D'oh!" 169*b1cdbd2cSJim Jagielski End If 170*b1cdbd2cSJim JagielskiEnd Sub 171*b1cdbd2cSJim Jagielski 172*b1cdbd2cSJim Jagielski'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 173*b1cdbd2cSJim Jagielski' CHECK PARA ID 174*b1cdbd2cSJim Jagielski' checks a paragraph for an ID 175*b1cdbd2cSJim Jagielski'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 176*b1cdbd2cSJim Jagielski 177*b1cdbd2cSJim JagielskiSub CheckParaID(TE As Object) 178*b1cdbd2cSJim Jagielski 179*b1cdbd2cSJim Jagielski If Left(TE.ParaStyleName,4) = "hlp_" AND Not(Left(TE.ParaStyleName,8) = "hlp_aux_") Then 180*b1cdbd2cSJim Jagielski 181*b1cdbd2cSJim Jagielski sText = TE.GetString 182*b1cdbd2cSJim Jagielski 183*b1cdbd2cSJim Jagielski If sText = "" Then 184*b1cdbd2cSJim Jagielski If bWarnEmptyPara Then 185*b1cdbd2cSJim Jagielski Warn("Empty Paragraph","Empty paragraphs should be avoided. Do not use empty paragraphs for formatting purpose.",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="TextField" Then 198*b1cdbd2cSJim Jagielski If TPE.TextField.TextFieldMaster.Name="ID" Then 199*b1cdbd2cSJim Jagielski posID = Ct 200*b1cdbd2cSJim Jagielski End If 201*b1cdbd2cSJim Jagielski End If 202*b1cdbd2cSJim Jagielski ' Lets cheat and allow empty strings before the ID -- otherwise we'll get 203*b1cdbd2cSJim Jagielski ' a validation error if a paragraph starts at the top of a page after 204*b1cdbd2cSJim Jagielski ' a page break (for whatever reason) 205*b1cdbd2cSJim Jagielski If TPE.String = "" 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("Paragraph has no id.","IDs will be assigned on safe. You can also assign an ID using the Assign Paragraph ID menu item",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 > 1 Then 221*b1cdbd2cSJim Jagielski Terminate("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",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'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 230*b1cdbd2cSJim Jagielski' CHECK PARA FORMAT 231*b1cdbd2cSJim Jagielski'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 232*b1cdbd2cSJim JagielskiSub CheckParaFormat(TE As Object) 233*b1cdbd2cSJim Jagielski 234*b1cdbd2cSJim Jagielski sText = TE.GetString 235*b1cdbd2cSJim Jagielski If Left(TE.ParaStyleName,4) <> "hlp_" AND sText <> "" Then ' just disregard empty paras in wrong formats 236*b1cdbd2cSJim Jagielski Warn("Invalid paragraph format. Contents will be lost.",_ 237*b1cdbd2cSJim Jagielski "Use only the paragraph styles starting with ""hlp_""."+_ 238*b1cdbd2cSJim Jagielski " Paragraphs in other formats will be lost on export",TE) 239*b1cdbd2cSJim Jagielski End If 240*b1cdbd2cSJim Jagielski 241*b1cdbd2cSJim JagielskiEnd Sub 242*b1cdbd2cSJim Jagielski 243*b1cdbd2cSJim Jagielski'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 244*b1cdbd2cSJim Jagielski' CHECK SWITCHES 245*b1cdbd2cSJim Jagielski'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 246*b1cdbd2cSJim JagielskiSub CheckSwitches(TE As Object) 247*b1cdbd2cSJim Jagielski 248*b1cdbd2cSJim Jagielski If TE.ParaStyleName="hlp_aux_switch" Then ' we are a switch or case or default 249*b1cdbd2cSJim Jagielski sText = TE.GetString ' get the switch contents 250*b1cdbd2cSJim Jagielski 251*b1cdbd2cSJim Jagielski If Left(sText,8) = "<SWITCH " Then ' an opening switch tag 252*b1cdbd2cSJim Jagielski 253*b1cdbd2cSJim Jagielski If sSwitchType = "" Then ' no other switch is open 254*b1cdbd2cSJim Jagielski sSwitchType = Right(sText,Len(sText)-16) 255*b1cdbd2cSJim Jagielski sSwitchType = Left(sSwitchType,InStr(sSwitchType,"""")-1) 256*b1cdbd2cSJim Jagielski 257*b1cdbd2cSJim Jagielski If (sSwitchType <> "sys" AND sSwitchType <> "appl" AND sSwitchType <> "distrib") Then 258*b1cdbd2cSJim Jagielski Terminate("Unknown switch type """+sSwitchType+"""",TE) 259*b1cdbd2cSJim Jagielski End If 260*b1cdbd2cSJim Jagielski 261*b1cdbd2cSJim Jagielski Else 262*b1cdbd2cSJim Jagielski Terminate("Previous switch ("+sSwitchType+") not closed!",TE) 263*b1cdbd2cSJim Jagielski End If 264*b1cdbd2cSJim Jagielski 265*b1cdbd2cSJim Jagielski End If ' OPENING SWITCH 266*b1cdbd2cSJim Jagielski 267*b1cdbd2cSJim Jagielski If Left(sText,8) = "</SWITCH" Then ' a closing switch tag 268*b1cdbd2cSJim Jagielski 269*b1cdbd2cSJim Jagielski If sSwitchType = "" Then ' there was no switch open 270*b1cdbd2cSJim Jagielski Terminate("No switch open!",TE) 271*b1cdbd2cSJim Jagielski Else 272*b1cdbd2cSJim Jagielski If not(bCaseSet OR bDefaultSet) Then 273*b1cdbd2cSJim Jagielski Terminate("Empty switch",TE) 274*b1cdbd2cSJim Jagielski End If 275*b1cdbd2cSJim Jagielski 276*b1cdbd2cSJim Jagielski If sCaseType <> "" Then ' there is still a case open 277*b1cdbd2cSJim Jagielski Terminate("Previous case ("+sCaseType+") not closed!",TE) 278*b1cdbd2cSJim Jagielski End If 279*b1cdbd2cSJim Jagielski sSwitchType = "" 280*b1cdbd2cSJim Jagielski bDefaultSet = FALSE 281*b1cdbd2cSJim Jagielski bCaseSet = FALSE 282*b1cdbd2cSJim Jagielski End If 283*b1cdbd2cSJim Jagielski 284*b1cdbd2cSJim Jagielski End If ' CLOSING SWITCH 285*b1cdbd2cSJim Jagielski 286*b1cdbd2cSJim Jagielski If Left(sText,6) = "<CASE " Then ' an opening case tag 287*b1cdbd2cSJim Jagielski 288*b1cdbd2cSJim Jagielski If bDefaultSet Then 289*b1cdbd2cSJim Jagielski Terminate("No case after default allowed.",TE) 290*b1cdbd2cSJim Jagielski End If 291*b1cdbd2cSJim Jagielski 292*b1cdbd2cSJim Jagielski If sCaseType = "" Then 293*b1cdbd2cSJim Jagielski sCaseType = Right(sText,Len(sText)-14) 294*b1cdbd2cSJim Jagielski sCaseType = Left(sCaseType,InStr(sCaseType,"""")-1) 295*b1cdbd2cSJim Jagielski bCaseSet = TRUE 296*b1cdbd2cSJim Jagielski If sSwitchType = "" Then 297*b1cdbd2cSJim Jagielski Terminate("Case without switch",TE) 298*b1cdbd2cSJim Jagielski End If 299*b1cdbd2cSJim Jagielski Else 300*b1cdbd2cSJim Jagielski Terminate("Previous case ("+sCaseType+") not closed!",TE) 301*b1cdbd2cSJim Jagielski End If 302*b1cdbd2cSJim Jagielski 303*b1cdbd2cSJim Jagielski End If ' OPENING CASE 304*b1cdbd2cSJim Jagielski 305*b1cdbd2cSJim Jagielski If Left(sText,6) = "</CASE" Then ' a closing case tag 306*b1cdbd2cSJim Jagielski 307*b1cdbd2cSJim Jagielski If sCaseType = "" Then 308*b1cdbd2cSJim Jagielski Terminate("No case open!",TE) 309*b1cdbd2cSJim Jagielski Else 310*b1cdbd2cSJim Jagielski sCaseType = "" 311*b1cdbd2cSJim Jagielski End If 312*b1cdbd2cSJim Jagielski 313*b1cdbd2cSJim Jagielski End If ' CLOSING CASE 314*b1cdbd2cSJim Jagielski 315*b1cdbd2cSJim Jagielski If Left(sText,8) = "<DEFAULT" Then ' an opening default tag 316*b1cdbd2cSJim Jagielski 317*b1cdbd2cSJim Jagielski If sCaseType = "" Then 318*b1cdbd2cSJim Jagielski If (sDefaultType <> "" OR bDefaultSet) Then 319*b1cdbd2cSJim Jagielski Terminate("Multiple default not allowed.",TE) 320*b1cdbd2cSJim Jagielski Else 321*b1cdbd2cSJim Jagielski sDefaultType = "DEFAULT" 322*b1cdbd2cSJim Jagielski 323*b1cdbd2cSJim Jagielski If sSwitchType = "" Then 324*b1cdbd2cSJim Jagielski Terminate("Default without switch",TE) 325*b1cdbd2cSJim Jagielski End If 326*b1cdbd2cSJim Jagielski End If 327*b1cdbd2cSJim Jagielski sDefaultType = "DEFAULT" 328*b1cdbd2cSJim Jagielski bDefaultSet = TRUE 329*b1cdbd2cSJim Jagielski Else 330*b1cdbd2cSJim Jagielski Terminate("Previous case ("+sCaseType+") not closed!",TE) 331*b1cdbd2cSJim Jagielski End If 332*b1cdbd2cSJim Jagielski 333*b1cdbd2cSJim Jagielski End If ' OPENING CASE 334*b1cdbd2cSJim Jagielski 335*b1cdbd2cSJim Jagielski If Left(sText,9) = "</DEFAULT" Then ' a closing default tag 336*b1cdbd2cSJim Jagielski 337*b1cdbd2cSJim Jagielski If sDefaultType <> "DEFAULT" Then 338*b1cdbd2cSJim Jagielski Terminate("No default open!",TE) 339*b1cdbd2cSJim Jagielski Else 340*b1cdbd2cSJim Jagielski sDefaultType = "" 341*b1cdbd2cSJim Jagielski End If 342*b1cdbd2cSJim Jagielski 343*b1cdbd2cSJim Jagielski End If ' CLOSING CASE 344*b1cdbd2cSJim Jagielski Else ' We are not hlp_aux_switch 345*b1cdbd2cSJim Jagielski If (sSwitchType <> "" AND sCaseType = "" AND sDefaultType = "") Then 346*b1cdbd2cSJim Jagielski Terminate("Nothing allowed between switch and case or default or /case or /default and /switch", TE) 347*b1cdbd2cSJim Jagielski End If 348*b1cdbd2cSJim Jagielski End If 349*b1cdbd2cSJim Jagielski 350*b1cdbd2cSJim JagielskiEnd Sub 351*b1cdbd2cSJim Jagielski 352*b1cdbd2cSJim Jagielski'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 353*b1cdbd2cSJim Jagielski' CHECK SWITCHES IN A CELL 354*b1cdbd2cSJim Jagielski'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 355*b1cdbd2cSJim JagielskiSub CheckSwitchesInCell(CE As Object) 356*b1cdbd2cSJim Jagielski 357*b1cdbd2cSJim Jagielski If CE.ParaStyleName="hlp_aux_switch" Then ' we are a switch or case or default 358*b1cdbd2cSJim Jagielski sText = CE.GetString ' get the switch contents 359*b1cdbd2cSJim Jagielski 360*b1cdbd2cSJim Jagielski If Left(sText,8) = "<SWITCH " Then ' an opening switch tag 361*b1cdbd2cSJim Jagielski 362*b1cdbd2cSJim Jagielski If sCellSwitchType = "" Then ' no other switch is open 363*b1cdbd2cSJim Jagielski sCellSwitchType = Right(sText,Len(sText)-16) 364*b1cdbd2cSJim Jagielski sCellSwitchType = Left(sCellSwitchType,InStr(sCellSwitchType,"""")-1) 365*b1cdbd2cSJim Jagielski 366*b1cdbd2cSJim Jagielski If (sCellSwitchType <> "sys" AND sCellSwitchType <> "appl" AND sCellSwitchType <> "distrib") Then 367*b1cdbd2cSJim Jagielski Terminate("Unknown switch type """+sCellSwitchType+"""",CE) 368*b1cdbd2cSJim Jagielski End If 369*b1cdbd2cSJim Jagielski 370*b1cdbd2cSJim Jagielski Else 371*b1cdbd2cSJim Jagielski Terminate("Previous switch ("+sCellSwitchType+") not closed!",CE) 372*b1cdbd2cSJim Jagielski End If 373*b1cdbd2cSJim Jagielski 374*b1cdbd2cSJim Jagielski End If ' OPENING SWITCH 375*b1cdbd2cSJim Jagielski 376*b1cdbd2cSJim Jagielski If Left(sText,8) = "</SWITCH" Then ' a closing switch tag 377*b1cdbd2cSJim Jagielski 378*b1cdbd2cSJim Jagielski If sCellSwitchType = "" Then ' there was no switch open 379*b1cdbd2cSJim Jagielski Terminate("No switch open!",CE) 380*b1cdbd2cSJim Jagielski Else 381*b1cdbd2cSJim Jagielski If not(bCellCaseSet OR bCellDefaultSet) Then 382*b1cdbd2cSJim Jagielski Terminate("Empty switch",CE) 383*b1cdbd2cSJim Jagielski End If 384*b1cdbd2cSJim Jagielski 385*b1cdbd2cSJim Jagielski If sCellCaseType <> "" Then ' there is still a case open 386*b1cdbd2cSJim Jagielski Terminate("Previous case ("+sCellCaseType+") not closed!",CE) 387*b1cdbd2cSJim Jagielski End If 388*b1cdbd2cSJim Jagielski sCellSwitchType = "" 389*b1cdbd2cSJim Jagielski bCellDefaultSet = FALSE 390*b1cdbd2cSJim Jagielski bCellCaseSet = FALSE 391*b1cdbd2cSJim Jagielski End If 392*b1cdbd2cSJim Jagielski 393*b1cdbd2cSJim Jagielski End If ' CLOSING SWITCH 394*b1cdbd2cSJim Jagielski 395*b1cdbd2cSJim Jagielski If Left(sText,6) = "<CASE " Then ' an opening case tag 396*b1cdbd2cSJim Jagielski 397*b1cdbd2cSJim Jagielski If bCellDefaultSet Then 398*b1cdbd2cSJim Jagielski Terminate("No case after default allowed.",CE) 399*b1cdbd2cSJim Jagielski End If 400*b1cdbd2cSJim Jagielski 401*b1cdbd2cSJim Jagielski If sCellCaseType = "" Then 402*b1cdbd2cSJim Jagielski sCellCaseType = Right(sText,Len(sText)-14) 403*b1cdbd2cSJim Jagielski sCellCaseType = Left(sCellCaseType,InStr(sCellCaseType,"""")-1) 404*b1cdbd2cSJim Jagielski bCellCaseSet = TRUE 405*b1cdbd2cSJim Jagielski If sCellSwitchType = "" Then 406*b1cdbd2cSJim Jagielski Terminate("Case without switch",CE) 407*b1cdbd2cSJim Jagielski End If 408*b1cdbd2cSJim Jagielski Else 409*b1cdbd2cSJim Jagielski Terminate("Previous case ("+sCellCaseType+") not closed!",CE) 410*b1cdbd2cSJim Jagielski End If 411*b1cdbd2cSJim Jagielski 412*b1cdbd2cSJim Jagielski End If ' OPENING CASE 413*b1cdbd2cSJim Jagielski 414*b1cdbd2cSJim Jagielski If Left(sText,6) = "</CASE" Then ' a closing case tag 415*b1cdbd2cSJim Jagielski 416*b1cdbd2cSJim Jagielski If sCellCaseType = "" Then 417*b1cdbd2cSJim Jagielski Terminate("No case open!",CE) 418*b1cdbd2cSJim Jagielski Else 419*b1cdbd2cSJim Jagielski sCellCaseType = "" 420*b1cdbd2cSJim Jagielski End If 421*b1cdbd2cSJim Jagielski 422*b1cdbd2cSJim Jagielski End If ' CLOSING CASE 423*b1cdbd2cSJim Jagielski 424*b1cdbd2cSJim Jagielski If Left(sText,8) = "<DEFAULT" Then ' an opening default tag 425*b1cdbd2cSJim Jagielski 426*b1cdbd2cSJim Jagielski If sCellCaseType = "" Then 427*b1cdbd2cSJim Jagielski If (sCellDefaultType <> "" OR bCellDefaultSet) Then 428*b1cdbd2cSJim Jagielski Terminate("Multiple default not allowed.",CE) 429*b1cdbd2cSJim Jagielski Else 430*b1cdbd2cSJim Jagielski sCellDefaultType = "DEFAULT" 431*b1cdbd2cSJim Jagielski 432*b1cdbd2cSJim Jagielski If sCellSwitchType = "" Then 433*b1cdbd2cSJim Jagielski Terminate("Default without switch",CE) 434*b1cdbd2cSJim Jagielski End If 435*b1cdbd2cSJim Jagielski End If 436*b1cdbd2cSJim Jagielski sCellDefaultType = "DEFAULT" 437*b1cdbd2cSJim Jagielski bCellDefaultSet = TRUE 438*b1cdbd2cSJim Jagielski Else 439*b1cdbd2cSJim Jagielski Terminate("Previous case ("+sCellCaseType+") not closed!",CE) 440*b1cdbd2cSJim Jagielski End If 441*b1cdbd2cSJim Jagielski 442*b1cdbd2cSJim Jagielski End If ' OPENING CASE 443*b1cdbd2cSJim Jagielski 444*b1cdbd2cSJim Jagielski If Left(sText,9) = "</DEFAULT" Then ' a closing default tag 445*b1cdbd2cSJim Jagielski 446*b1cdbd2cSJim Jagielski If sCellDefaultType <> "DEFAULT" Then 447*b1cdbd2cSJim Jagielski Terminate("No default open!",CE) 448*b1cdbd2cSJim Jagielski Else 449*b1cdbd2cSJim Jagielski sCellDefaultType = "" 450*b1cdbd2cSJim Jagielski End If 451*b1cdbd2cSJim Jagielski 452*b1cdbd2cSJim Jagielski End If ' CLOSING CASE 453*b1cdbd2cSJim Jagielski Else ' We are not hlp_aux_switch 454*b1cdbd2cSJim Jagielski If (sCellSwitchType <> "" AND sCellCaseType = "" AND sCellDefaultType = "") Then 455*b1cdbd2cSJim Jagielski Terminate("Nothing allowed between switch and case or default or /case or /default and /switch", 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'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 464*b1cdbd2cSJim Jagielski' TERMINATE VALIDATION WITH AN ERROR MESSAGE 465*b1cdbd2cSJim Jagielski'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 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,"D'oh!" 471*b1cdbd2cSJim Jagielski Stop 472*b1cdbd2cSJim Jagielski 473*b1cdbd2cSJim JagielskiEnd Sub 474*b1cdbd2cSJim Jagielski 475*b1cdbd2cSJim Jagielski'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 476*b1cdbd2cSJim Jagielski' SHOW A WARNING 477*b1cdbd2cSJim Jagielski'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 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("HelpAuthoring") 482*b1cdbd2cSJim Jagielski oDialog = LoadDialog("HelpAuthoring", "dlgWarn") 483*b1cdbd2cSJim Jagielski oTxtWarn = oDialog.GetControl("txtWarning") 484*b1cdbd2cSJim Jagielski oTxtWarn.Text = sWarn 485*b1cdbd2cSJim Jagielski oTxtSolv = oDialog.GetControl("txtSolution") 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("cbWarn") 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'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 506*b1cdbd2cSJim Jagielski' CHECK DOCUMENT META DATA 507*b1cdbd2cSJim Jagielski'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 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 <> AlphaNum(sTopicID) OR sTopicID="" Then 513*b1cdbd2cSJim Jagielski sTopicID = "topic_"+CreateID ' 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="" OR sTitle="<Set Topic Title>" 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("com.sun.star.text.Paragraph") Then 526*b1cdbd2cSJim Jagielski If Left(TextElement.ParaStyleName,8)="hlp_head" 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="TextField") 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'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 546*b1cdbd2cSJim Jagielski' CHECK IF HEADING EXISTS 547*b1cdbd2cSJim Jagielski'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 548*b1cdbd2cSJim JagielskiSub CheckHeading(oDoc As Object) 549*b1cdbd2cSJim Jagielski 550*b1cdbd2cSJim JagielskiEnd Sub 551*b1cdbd2cSJim Jagielski 552*b1cdbd2cSJim Jagielski'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 553*b1cdbd2cSJim Jagielski' CHECK FOR CORRECT INLINE TAGS 554*b1cdbd2cSJim Jagielski'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 555*b1cdbd2cSJim JagielskiSub CheckInlineTags(TE As Object) 556*b1cdbd2cSJim Jagielski 557*b1cdbd2cSJim Jagielski 558*b1cdbd2cSJim Jagielski 559*b1cdbd2cSJim Jagielski If Left(TE.ParaStyleName,4)="hlp_" AND (Left(TE.ParaStyleName,8)<>"hlp_aux_" OR TE.ParaStyleName="hlp_aux_bookmark") 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("com.sun.star.text.TextField") Then 575*b1cdbd2cSJim Jagielski sTag = Token.TextField.TextFieldMaster.Name 576*b1cdbd2cSJim Jagielski 577*b1cdbd2cSJim Jagielski If Right(sTag,1)="_" Then ' a tag starts 578*b1cdbd2cSJim Jagielski 579*b1cdbd2cSJim Jagielski sTagName = Left(sTag,Len(sTag)-1) 580*b1cdbd2cSJim Jagielski 581*b1cdbd2cSJim Jagielski ' check for forbidden tags in paragraphs 582*b1cdbd2cSJim Jagielski sTagFormat = TagFormatIsCorrect(sTagName, TE.ParaStyleName) 583*b1cdbd2cSJim Jagielski If sTagFormat <> "" Then 584*b1cdbd2cSJim Jagielski Terminate(sTagName+" element has wrong paragraph style ("+TE.ParaStyleName+")."+chr(13)+"Must be "+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)="_" Then ' 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 ' check for forbidden tags in paragraphs 596*b1cdbd2cSJim Jagielski sTagFormat = TagFormatIsCorrect(sTagName, TE.ParaStyleName) 597*b1cdbd2cSJim Jagielski If sTagFormat <> "" Then 598*b1cdbd2cSJim Jagielski Terminate(sTagName+" element has wrong paragraph style ("+TE.ParaStyleName+")."+chr(13)+"Must be "+sTagFormat,Token) 599*b1cdbd2cSJim Jagielski End If 600*b1cdbd2cSJim Jagielski 601*b1cdbd2cSJim Jagielski If ubound(aInlineTagsOpen()) > 0 Then 602*b1cdbd2cSJim Jagielski If aInlineTagsOpen(ubound(aInlineTagsOpen())) <> sTagName Then 603*b1cdbd2cSJim Jagielski Terminate("Inline Element "+aInlineTagsOpen(ubound(aInlineTagsOpen()))+" not closed",Token) 604*b1cdbd2cSJim Jagielski End If 605*b1cdbd2cSJim Jagielski sDim = ubound(aInlineTagsOpen())-1 606*b1cdbd2cSJim Jagielski Else 607*b1cdbd2cSJim Jagielski Terminate("No opening tag for "+sTagName,Token) 608*b1cdbd2cSJim Jagielski End If 609*b1cdbd2cSJim Jagielski Redim Preserve aInlineTagsOpen(sDim) as String 610*b1cdbd2cSJim Jagielski 611*b1cdbd2cSJim Jagielski Else ' empty tag 612*b1cdbd2cSJim Jagielski sTagName = sTag 613*b1cdbd2cSJim Jagielski sTagFormat = TagFormatIsCorrect(sTagName, TE.ParaStyleName) 614*b1cdbd2cSJim Jagielski If sTagFormat <> "" Then 615*b1cdbd2cSJim Jagielski Terminate(sTagName+" element has wrong paragraph style ("+TE.ParaStyleName+")."+chr(13)+"Must be "+sTagFormat,Token) 616*b1cdbd2cSJim Jagielski End If 617*b1cdbd2cSJim Jagielski 618*b1cdbd2cSJim Jagielski EndIf 619*b1cdbd2cSJim Jagielski ElseIf (i > 1) AND (Trim(Token.String) <> "") Then 620*b1cdbd2cSJim Jagielski If aInlineTagsOpen(ubound(aInlineTagsOpen())) = "SWITCHINLINE" Then 621*b1cdbd2cSJim Jagielski Terminate("No text allowed here.",Token) 622*b1cdbd2cSJim Jagielski End If 623*b1cdbd2cSJim Jagielski End If 624*b1cdbd2cSJim Jagielski Next 625*b1cdbd2cSJim Jagielski 626*b1cdbd2cSJim Jagielski If ubound(aInlineTagsOpen()) > 0 Then 627*b1cdbd2cSJim Jagielski Terminate("Inline Element "+aInlineTagsOpen(ubound(aInlineTagsOpen()))+" not closed",Token) 628*b1cdbd2cSJim Jagielski End If 629*b1cdbd2cSJim Jagielski 630*b1cdbd2cSJim Jagielski End If 631*b1cdbd2cSJim JagielskiEnd Sub 632*b1cdbd2cSJim Jagielski 633*b1cdbd2cSJim Jagielski'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 634*b1cdbd2cSJim Jagielski' CHECK FOR CORRECT TAGS 635*b1cdbd2cSJim Jagielski'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 636*b1cdbd2cSJim JagielskiSub CheckTags(TE As Object) 637*b1cdbd2cSJim Jagielski If (Left(TE.ParaStyleName,8) = "hlp_aux_" AND TE.ParaStyleName <> "hlp_aux_bookmark") 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("com.sun.star.text.TextField") Then 645*b1cdbd2cSJim Jagielski sTag = TPE.TextField.TextFieldMaster.Name 646*b1cdbd2cSJim Jagielski If Right(sTag,1)="_" Then ' 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)="_" Then ' 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()) > 0 Then 657*b1cdbd2cSJim Jagielski If aTagsOpen(ubound(aTagsOpen())) <> sTagName Then 658*b1cdbd2cSJim Jagielski Terminate("No close tag for "+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("No opening tag for "+sTagName,TPE) 664*b1cdbd2cSJim Jagielski End If 665*b1cdbd2cSJim Jagielski Redim Preserve aTagsOpen(sDim) as String 666*b1cdbd2cSJim Jagielski 667*b1cdbd2cSJim Jagielski Else ' 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'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 676*b1cdbd2cSJim Jagielski' CHECK FOR CORRECT TAGS IN A TABLE CELL 677*b1cdbd2cSJim Jagielski'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 678*b1cdbd2cSJim JagielskiSub CheckTagsInCell(CE As Object) 679*b1cdbd2cSJim Jagielski If (Left(CE.ParaStyleName,8) = "hlp_aux_" AND CE.ParaStyleName <> "hlp_aux_bookmark") 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("com.sun.star.text.TextField") Then 687*b1cdbd2cSJim Jagielski sTag = CPE.TextField.TextFieldMaster.Name 688*b1cdbd2cSJim Jagielski If Right(sTag,1)="_" Then ' 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)="_" Then ' 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()) > 0 Then 699*b1cdbd2cSJim Jagielski If aCellTagsOpen(ubound(aCellTagsOpen())) <> sTagName Then 700*b1cdbd2cSJim Jagielski Terminate("No close tag for "+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("No opening tag for "+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