Skip to content

Commit

Permalink
fix bugs for footnote reference and broken ref checking
Browse files Browse the repository at this point in the history
  • Loading branch information
shishouyuan committed Jun 20, 2021
1 parent f23b484 commit fd11de5
Show file tree
Hide file tree
Showing 9 changed files with 134 additions and 62 deletions.
106 changes: 78 additions & 28 deletions HandyRef.bas
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
'创建时期: 2021/5/11


Const HandyRefVersion = "20210618.1050.VBA"
Const HandyRefVersion = "20210620.1556.VBA"

Const TEXT_HandyRefGithubUrl = "https://github.com/shishouyuan/HandyRefVBA"

Expand Down Expand Up @@ -72,6 +72,9 @@ Const BrokenRefNumPosHolder = "#"

Private selectedRange As Range
Private selectedBM As Bookmark
Private selectedIsNote As Boolean
Private selectedHeading As Boolean


Private ribbonUI As IRibbonUI
Private helper As helper
Expand Down Expand Up @@ -112,13 +115,41 @@ Public Sub HandyRef_CreateReferencePoint()
Dim rg As Range
Set rg = Application.Selection.Range

If rg.End = rg.Start Then
selectedIsNote = False
Set selectedRange = rg
Set selectedBM = Nothing

On Error Resume Next 'will cause error when accessing endnotes property when the range is in footnote section
If rg.Endnotes.Count = 0 Then
On Error GoTo exitSub
If rg.Footnotes.Count = 1 Then
Dim fn As Footnote
Set fn = rg.Footnotes.Item(1)
If rg.InRange(fn.Range) Or rg.InRange(fn.Reference) Or Not fn.Reference.InRange(rg) Then
selectedIsNote = True
Set selectedRange = fn.Reference
End If
End If
End If

On Error Resume Next
If rg.Footnotes.Count = 0 Then
On Error GoTo exitSub
If rg.Endnotes.Count = 1 Then
Dim en As Endnote
Set en = rg.Endnotes.Item(1)
If rg.InRange(en.Range) Or rg.InRange(en.Reference) Or Not en.Reference.InRange(rg) Then
selectedIsNote = True
Set selectedRange = en.Reference
End If
End If
End If

exitSub:
If rg.End = rg.Start And Not selectedIsNote Then
Set selectedRange = Nothing
Set selectedBM = Nothing
MsgBox TEXT_CreateReferencePoint_NothingSelected, vbOKOnly + vbInformation, TEXT_HandyRefAppName
Else
Set selectedRange = rg
Set selectedBM = Nothing
End If

End Sub
Expand Down Expand Up @@ -197,7 +228,11 @@ emptyRange:
End If

If bmValid Then
ActiveDocument.Fields.Add Selection.Range, WdFieldType.wdFieldRef, selectedBM.Name & " \h"
If selectedIsNote Then
ActiveDocument.Fields.Add Selection.Range, WdFieldType.wdFieldNoteRef, selectedBM.Name & " \h"
Else
ActiveDocument.Fields.Add Selection.Range, WdFieldType.wdFieldRef, selectedBM.Name & " \h"
End If
End If

exitSub:
Expand All @@ -212,7 +247,7 @@ End Sub

Public Sub HandyRef_ClearRefBrokenComment_RibbonFun(ByVal control As IRibbonControl)

If Application.Selection.End - Application.Selection.Start = 0 Then
If Application.Selection.End = Application.Selection.Start Then
If MsgBox(TEXT_ClearRefBrokenCommentForWholeDocPrompt, vbOKCancel + vbQuestion, TEXT_HandyRefAppName) = vbOK Then
HandyRef_ClearRefBrokenComment ActiveDocument.Range
Else
Expand Down Expand Up @@ -265,6 +300,8 @@ Public Sub HandyRef_CheckForBrokenRef_RibbonFun(ByVal control As IRibbonControl)

End Sub



Public Sub HandyRef_CheckForBrokenRef(checkingRange As Range)

Dim oldScreenUpdating As Boolean
Expand All @@ -279,44 +316,57 @@ Public Sub HandyRef_CheckForBrokenRef(checkingRange As Range)
HandyRef_ClearRefBrokenComment checkingRange

Static refRegExp As Object
Static refRegExp0 As Object
If refRegExp Is Nothing Then
Set refRegExp = CreateObject("VBScript.RegExp")
With refRegExp
.Global = False
.IgnoreCase = True
.Pattern = "\s*REF\s+([^\s]+)\s*.*"
.Pattern = "^\s*(?:NOTE)?REF.*\s([^\s\\]+).*"
'.Pattern = "^\s*(?:NOTE)?REF.*?(?<!\\\*)\s+([^\s\\]+).*"
End With

Set refRegExp0 = CreateObject("VBScript.RegExp")
With refRegExp0
.Global = True
.IgnoreCase = True
.Pattern = "\\[*@#]\s*[^\s\\]*"
End With

End If

Dim brokenCount As Integer
brokenCount = 0

Dim fd As Field
Dim bmName As String
Dim cmt As Comment

For Each fd In checkingRange.Fields
If fd.Type = wdFieldRef Then
Set r = refRegExp.Execute(fd.Code.Text)
If fd.Type = wdFieldRef Or fd.Type = wdFieldNoteRef Then
Set r = refRegExp.Execute(refRegExp0.Replace(fd.code.Text, ""))
Dim isBroken As Boolean
isBroken = True
If r.Count > 0 Then
bmName = r.Item(0).SubMatches(0)
If Not ActiveDocument.Bookmarks.Exists(bmName) Then

brokenCount = brokenCount + 1

Set cmt = fd.Code.Comments.Add(fd.Code)
With cmt.Range
.InsertAfter TEXT_RefBrokenComment
.InsertParagraphAfter
.InsertAfter RefBrokenCommentTitle
End With

With cmt.Range.Paragraphs.First.Range
.Bold = True
.HighlightColorIndex = wdYellow
End With

If ActiveDocument.Bookmarks.Exists(bmName) Then
isBroken = False
End If
End If
If isBroken Then
brokenCount = brokenCount + 1
Dim cmt As Comment
Set cmt = fd.code.Comments.Add(fd.code)
With cmt.Range
.InsertAfter TEXT_RefBrokenComment
.InsertParagraphAfter
.InsertAfter RefBrokenCommentTitle
End With

With cmt.Range.Paragraphs.First.Range
.Bold = True
.HighlightColorIndex = wdYellow
End With
End If
End If
Next fd

Expand Down Expand Up @@ -366,4 +416,4 @@ Public Sub HandyRef_GetLatestVersion_RibbonFun(ByVal control As IRibbonControl)
errHandle:
ShowUnknowErrorPrompt err

End Sub
End Sub
82 changes: 52 additions & 30 deletions HandyRef.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ var TEXT_ActionName_ClearRefBrokenComment

function HandyRef_OnLoad(ribbonUI) {

HandyRefVersion = "20210618.1050.JS"
HandyRefVersion = "20210620.1556.JS"

TEXT_HandyRefGithubUrl = "https://github.com/shishouyuan/HandyRefVBA"

Expand Down Expand Up @@ -110,6 +110,7 @@ function HandyRef_GetEnabled(control) {

var selectedBM
var selectedRange
var selectedIsNote


function HandyRef_FormatUndoRecordText(s) {
Expand All @@ -126,19 +127,30 @@ function HandyRef_CreateReferencePoint_RibbonFun(control) { // wrap the function

function HandyRef_CreateReferencePoint() {
var rg = Application.Selection.Range
if (selectedRange && Application.IsObjectValid(selectedRange) && rg.IsEqual(selectedRange)) {
return
}
else {
selectedBM = null
if (rg.End == rg.Start) {
selectedRange = null
alert(TEXT_CreateReferencePoint_nullSelected)

selectedIsNote = false
selectedRange = rg
selectedBM = null
if (rg.Endnotes.Count == 0 && rg.Footnotes.Count == 1) {
var fn = rg.Footnotes.Item(1)
if (rg.InRange(fn.Range) || rg.InRange(fn.Reference) || !fn.Reference.InRange(rg)) {
selectedIsNote = true
selectedRange = fn.Reference
}
else {
selectedRange = rg
}
else if (rg.Footnotes.Count == 0 && rg.Endnotes.Count == 1) {
var en = rg.Endnotes.Item(1)
if (rg.InRange(en.Range) || rg.InRange(en.Reference) || !en.Reference.InRange(rg)) {
selectedIsNote = true
selectedRange = en.Reference
}
}

if (rg.End == rg.Start && !selectedIsNote) {
selectedRange = null
alert(TEXT_CreateReferencePoint_nullSelected)
}

}


Expand Down Expand Up @@ -205,7 +217,12 @@ function HandyRef_InsertCrossReferenceField() {
}
}
if (bmValid) {
ActiveDocument.Fields.Add(Selection.Range, wdFieldRef, selectedBM.Name + " \\h")
if (selectedIsNote) {
ActiveDocument.Fields.Add(Selection.Range, wdFieldNoteRef, selectedBM.Name + " \\h")
}
else {
ActiveDocument.Fields.Add(Selection.Range, wdFieldRef, selectedBM.Name + " \\h")
}
}
}
catch (err) {
Expand Down Expand Up @@ -274,32 +291,37 @@ function HandyRef_CheckForBrokenRef(checkingRange) {
Application.UndoRecord.StartCustomRecord(HandyRef_FormatUndoRecordText(TEXT_ActionName_CheckReference))
HandyRef_ClearRefBrokenComment(checkingRange)

var refRegExp = /\s*REF\s+([^\s]+)\s*.*/i
//var refRegExp = /^\s*(?:NOTE)?REF.*?(?<!\\\*)\s+([^\s\\]+).*/i
var refRegExp = /^\s*(NOTE){0,1}REF.*\s([^\s\\]+).*/i
var refRegExp0 = /\\[*@#]\s*[^\s\\]*/g

var brokenCount = 0

for (var i = 1; i <= checkingRange.Fields.Count; i++) {
var fd = checkingRange.Fields.Item(i)

if (fd.Type == wdFieldRef) {
r = refRegExp.exec(fd.Code.Text)

if (fd.Type == wdFieldRef || fd.Type == wdFieldNoteRef) {
r = refRegExp.exec(fd.Code.Text.replace(refRegExp0, ""))
var isBroken = true
if (r.length > 0) {
var bmName = r[1]
if (!ActiveDocument.Bookmarks.Exists(bmName)) {

brokenCount = brokenCount + 1

var cmt = fd.Code.Comments.Add(fd.Code)
var t = cmt.Range
t.InsertAfter(TEXT_RefBrokenComment)
t.InsertParagraphAfter()
t.InsertAfter(RefBrokenCommentTitle)

t = cmt.Range.Paragraphs.First.Range
t.Bold = true
t.HighlightColorIndex = wdYellow
var bmName = r[2]
if (ActiveDocument.Bookmarks.Exists(bmName)) {
isBroken = false
}
}
if (isBroken) {
brokenCount = brokenCount + 1

var cmt = fd.Code.Comments.Add(fd.Code)
var t = cmt.Range
t.InsertAfter(TEXT_RefBrokenComment)
t.InsertParagraphAfter()
t.InsertAfter(RefBrokenCommentTitle)

t = cmt.Range.Paragraphs.First.Range
t.Bold = true
t.HighlightColorIndex = wdYellow
}
}
}

Expand Down
Binary file modified HandyRef/HandyRef-Dev.dotm
Binary file not shown.
Loading

0 comments on commit fd11de5

Please sign in to comment.