User:TJFrazier/Quotes

From Apache OpenOffice Wiki
< User:TJFrazier
Revision as of 20:34, 9 February 2013 by TJFrazier (talk | contribs) (Adding "Curly Quotes Checker" macro)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

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

Template:PDL

Personal tools