User:TJFrazier/Quotes
Check Curly Double Quotes
Features
- The macro checks sequences of double curly quotes. It allows multiple quoted areas per paragraph, and quotations continued in the next paragraph (no close-quote, but the next paragraph must start with an open-quote). Triply nested quotes will flag as errors, but the user can bypass these. (If this is a major nuisance for someone, let me know. Revisions are possible.)
- The macro can stop on any error, with the error character selected, for easy fixing; however, after the fix, the macro must be restarted. Therefore, I strongly recommend that the user should assign a keyboard shortcut, at least temporarily and at first. You may get a lot of errors initially, which means a lot of restarts.
Source
<source lang="oobas"> Sub QuoteChecker Dim bMoreText as Boolean Dim bQMS as Boolean 'Quote Must Start next para Dim iAnswer as Integer 'MsgBox reply Dim iClose as Long 'Found close-quote here Dim iOpen as Long Dim iWork as Long Dim jClose as Long 'Previous close-quote position Dim nErrs as Integer 'Counts Dim nPara as Integer Dim oDoc as Object Dim oTC as Object 'Text cursor Dim oViewCursor as Object Dim sPara as String 'Paragraph text Dim vEnum as Variant Dim vPara as Variant Const kLeft = &H201C 'Curly quotes Const kRight = &H201D
oDoc = ThisComponent vEnum = oDoc.Text.createEnumeration While vEnum.hasMoreElements
vPara = vEnum.nextElement nPara = nPara + 1 oTC = vPara.Text.createTextCursorByRange(vPara.Anchor)
sPara = oTC.getString() iOpen = InStr( sPara, """" ) While iOpen <> 0 'Found un-replaced straight quote, stop 'These are easier to fix with GUI Find&Replace. nErrs = nErrs + 1 call QuoteVC( oDoc, oTC, iOpen ) 'set visual cursor to problem iAnswer = MsgBox( "Stop on straight quote?" _ ,MB_YESNO + MB_ICONQUESTION, "Unreplaced Straight Quote" ) If iAnswer = IDYES Then Exit Sub If iOpen = Len(sPara) Then 'at end of para iOpen = 0 'force exit Else iOpen = InStr( iOpen+1, sPara, """" ) End If 'end of para Wend 'Straight quote(s) in paragraph iOpen = 0 iClose = 0 Do jClose = iClose iOpen = InStr( iOpen + 1, sPara, chr(kLeft) ) iClose = InStr( iClose + 1, sPara, chr(kRight) ) If bQMS and (iOpen <> 1) Then call QuoteVC( oDoc, oTC, 0 ) nErrs = nErrs + 1 iAnswer = MsgBox( _ "Previous paragraph has an extra open quote." & chr(13) _ & "This paragraph does not start with an open quote." & chr(13) _ & "Stop here?" _ , MB_YESNO + MB_ICONQUESTION, "Unbalanced Quotes" ) If iAnswer = IDYES Then Exit Sub End If 'bQMS + iOpen bQMS = False
If (0 < iOpen) and (iOpen < jClose) Then call QuoteVC( oDoc, oTC, iOpen ) nErrs = nErrs + 1 iAnswer = MsgBox( _ "Two open quotes before close quote." & chr(13) _ & "Stop here?" _ , MB_YESNO + MB_ICONQUESTION, "Two Open Quotes Before Close" ) If iAnswer = IDYES Then Exit Sub End If '0 < iOpen < jClose
' I find it easier to think of four separate cases. YMMV.
If (iOpen = 0) and (iClose = 0) Then Exit Do 'Done with paragraph ElseIf (iOpen > 0) and (iClose = 0) Then If InStr( iOpen + 1, SPara, chr(kLeft) ) = 0 Then 'one extra open is ok bQMS = True 'Quote must start next para Else 'more than one is /not/ ok call QuoteVC( oDoc, oTC, iOpen ) nErrs = nErrs + 1 iAnswer = MsgBox( "Multiple extra open quotes. Stop here?" _ , MB_YESNO + MB_ICONQUESTION, "Multiple Unmatched Open Quotes" ) If iAnswer = IDYES Then Exit Sub End If 'more open quotes Exit Do 'Done with this para, good or bad ElseIf (iOpen = 0) and (iClose > 0) Then call QuoteVC( oDoc, oTC, iClose ) nErrs = nErrs + 1 iAnswer = MsgBox( "Stop on unmatched close quote?" _ , MB_YESNO + MB_ICONQUESTION, "Unmatched Close Quote" ) If iAnswer = IDYES Then Exit Sub Exit Do Else 'Found both open and close quotes. If iOpen > iClose Then 'close before open? No. call QuoteVC( oDoc, oTC, iClose ) nErrs = nErrs + 1 iAnswer = MsgBox( "Stop on unmatched close quote?" _ , MB_YESNO + MB_ICONQUESTION, "Close Quote Before Open" ) If iAnswer = IDYES Then Exit Sub Exit Do End If 'close before open End If 'iOpen & iClose Loop While True 'Thru one paragraph
Wend 'For all paragraphs MsgBox "Paragraphs processed - " & str(nPara) & chr(13) _
& "Total Errors - " & str(nErrs) _ , MB_OK + MB_ICONINFORMATION, "QuoteChecker Results"
End Sub 'QuoteChecker
Sub QuoteVC(oDoc as Object, oTC as Object, iOffset as Long) 'Set visual cursor to targeted character(s). Dim oVis as Object oVis = oDoc.getCurrentController().getViewCursor() oVis.goToRange( oTC, False ) oVis.collapseToStart If iOffset > 1 Then oVis.goRight( iOffset - 1, False ) oVis.goRight( 1, True ) End Sub 'QuoteVC