diff --git a/HandyRef.bas b/HandyRef.bas
index 190f48d..b6635e9 100644
--- a/HandyRef.bas
+++ b/HandyRef.bas
@@ -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"
@@ -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
@@ -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
@@ -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:
@@ -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
@@ -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
@@ -279,13 +316,23 @@ 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.*?(? 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
@@ -366,4 +416,4 @@ Public Sub HandyRef_GetLatestVersion_RibbonFun(ByVal control As IRibbonControl)
errHandle:
ShowUnknowErrorPrompt err
-End Sub
+End Sub
\ No newline at end of file
diff --git a/HandyRef.js b/HandyRef.js
index 21d8062..237d612 100644
--- a/HandyRef.js
+++ b/HandyRef.js
@@ -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"
@@ -110,6 +110,7 @@ function HandyRef_GetEnabled(control) {
var selectedBM
var selectedRange
+var selectedIsNote
function HandyRef_FormatUndoRecordText(s) {
@@ -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)
+ }
+
}
@@ -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) {
@@ -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.*?(? 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
+ }
}
}
diff --git a/HandyRef/HandyRef-Dev.dotm b/HandyRef/HandyRef-Dev.dotm
index 4bf04e0..17c0f00 100644
Binary files a/HandyRef/HandyRef-Dev.dotm and b/HandyRef/HandyRef-Dev.dotm differ
diff --git a/HandyRef/word/~en-us/JDEData.bin b/HandyRef/word/~en-us/JDEData.bin
index f17b51e..c6b19b8 100644
--- a/HandyRef/word/~en-us/JDEData.bin
+++ b/HandyRef/word/~en-us/JDEData.bin
@@ -4,8 +4,8 @@
1
-
- //https://github.com/shishouyuan/HandyRefVBA
//A handy way to insert Cross Reference in MS Word and WPS
//Author: Shouyuan Shi @ South China University of Technology
//E-mail: shishouyuan@outlook.com
//Creating Date: 2021/5/11
//用于在Word里方便地添加交叉引用
//作者: 史守圆 @ 华南理工大学
//E-mail: shishouyuan@outlook.com
//创建时期: 2021/5/11
var HandyRefVersion
var TEXT_HandyRefGithubUrl
var BookmarkPrefix
var RefBrokenCommentTitle
var HandyRef_Lang
var BrokenRefNumPosHolder
var TEXT_HandyRefAppName
var TEXT_HandyRefAuthor
var TEXT_HandyRefDescription
var TEXT_CreateReferencePoint_nullSelected
var TEXT_InsertCrossReferenceField_NoRefPoint
var TEXT_InsertCrossReferenceField_CannotCrossFile
var TEXT_VersionPrompt
var TEXT_NonCommecialPrompt
var TEXT_RefBrokenComment
var TEXT_BrokenRefFoundPrompt
var TEXT_NoBrokenRefFoundPrompt
var TEXT_RefBrokenCommentClearedPrompt
var TEXT_RefCheckingForWholeDocPrompt
var TEXT_ClearRefBrokenCommentForWholeDocPrompt
var TEXT_UnknownErrOccurredPrompt
var TEXT_ActionName_CreateSource
var TEXT_ActionName_InsertReference
var TEXT_ActionName_CheckReference
var TEXT_ActionName_ClearRefBrokenComment
function HandyRef_OnLoad(ribbonUI) {
HandyRefVersion = "20210616.2006.JS"
TEXT_HandyRefGithubUrl = "https://github.com/shishouyuan/HandyRefVBA"
BookmarkPrefix = "_HandyRef"
RefBrokenCommentTitle = "$HANDYREF_REFERENCE_BROKEN_COMMENT$"
HandyRef_Lang = "en-us"
BrokenRefNumPosHolder = "#"
if (HandyRef_Lang == "zh-cn") {
TEXT_HandyRefAppName = "HandyRef-快引"
TEXT_HandyRefAuthor = "史守圆 @ 华南理工大学"
TEXT_HandyRefDescription = "为 Word 提供一个快速添加交叉引用的方式。"
TEXT_CreateReferencePoint_nullSelected = "请先选中要引用的内容!"
TEXT_InsertCrossReferenceField_NoRefPoint = "当前没有设置引用点!"
TEXT_InsertCrossReferenceField_CannotCrossFile = "不支持跨文件引用!"
TEXT_VersionPrompt = "版本:"
TEXT_NonCommecialPrompt = "仅限非商业用途"
TEXT_RefBrokenComment = "引用源丢失!"
TEXT_BrokenRefFoundPrompt = "发现了 " + BrokenRefNumPosHolder + " 个损坏的引用,已为其添加批注。"
TEXT_NoBrokenRefFoundPrompt = "没有发现损坏的引用。"
TEXT_RefBrokenCommentClearedPrompt = "引用损坏批注已清除。"
TEXT_RefCheckingForWholeDocPrompt = "当前没有选中的内容,将检查整个文档。" + '\r\n' + "这可能需要一些时间。"
TEXT_ClearRefBrokenCommentForWholeDocPrompt = "当前没有选中的内容,将清除整个文档中的引用损坏批注。"
TEXT_UnknownErrOccurredPrompt = "遇到错误:"
TEXT_ActionName_CreateSource = "创建引用源"
TEXT_ActionName_InsertReference = "交叉引用"
TEXT_ActionName_CheckReference = "检查引用"
TEXT_ActionName_ClearRefBrokenComment = "清除批注"
} else {
TEXT_HandyRefAppName = "HandyRef"
TEXT_HandyRefAuthor = "Shouyuan Shi @ South China University of Technology"
TEXT_HandyRefDescription = "Provide a handy way to insert Cross Reference in MS Word."
TEXT_CreateReferencePoint_nullSelected = "Nothing selected!"
TEXT_InsertCrossReferenceField_NoRefPoint = "No Reference Point Selected!"
TEXT_InsertCrossReferenceField_CannotCrossFile = "Cross file reference is ! supported!"
TEXT_VersionPrompt = "Version: "
TEXT_NonCommecialPrompt = "Only for NON-COMMERCIAL use."
TEXT_RefBrokenComment = "Reference Broken!"
TEXT_BrokenRefFoundPrompt = BrokenRefNumPosHolder + " broken reference found. Comments are attached."
TEXT_NoBrokenRefFoundPrompt = "No broken reference found."
TEXT_RefBrokenCommentClearedPrompt = "Reference broken comments cleared."
TEXT_RefCheckingForWholeDocPrompt = "Nothing is selected. The whole document will be checked." + '\r\n' + "This may take a while."
TEXT_ClearRefBrokenCommentForWholeDocPrompt = "Nothing is selected. Reference broken comments in the whole document will be cleared."
TEXT_UnknownErrOccurredPrompt = "Error occurred:"
TEXT_ActionName_CreateSource = "Create Source"
TEXT_ActionName_InsertReference = "Insert Reference"
TEXT_ActionName_CheckReference = "Check Reference"
TEXT_ActionName_ClearRefBrokenComment = "Clear Comments"
}
}
function HandyRef_GetEnabled(control) {
return true
//return ActiveDocument!=null
}
var selectedBM
var selectedRange
function HandyRef_FormatUndoRecordText(s) {
return s + "-" + TEXT_HandyRefAppName
}
function HandyRef_ShowUnknowErrorPrompt(e) {
alert(TEXT_UnknownErrOccurredPrompt + '\r\n' + e.Description)
}
function HandyRef_CreateReferencePoint_RibbonFun(control) { // wrap the function to match the signature called by ribbion
HandyRef_CreateReferencePoint()
}
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)
}
else {
selectedRange = rg
}
}
}
function HandyRef_InsertCrossReferenceField_RibbonFun(control) {
HandyRef_InsertCrossReferenceField()
}
function HandyRef_InsertCrossReferenceField() {
try {
Application.UndoRecord.StartCustomRecord(HandyRef_FormatUndoRecordText(TEXT_ActionName_InsertReference))
var bmValid = false
if (selectedBM) {
if (Application.IsObjectValid(selectedBM)) {
if (selectedBM.Parent == ActiveDocument) {
bmValid = true
}
else {
alert(TEXT_InsertCrossReferenceField_CannotCrossFile)
return
}
}
else {// it's possible the bookmark is deleted by the user, but the range remaind.
selectedBM = null
}
}
if (!bmValid) {
if (!selectedRange || !Application.IsObjectValid(selectedRange) || selectedRange.Start == selectedRange.End) {
selectedRange = null
alert(TEXT_InsertCrossReferenceField_NoRefPoint)
return
}
else if (selectedRange.Document != ActiveDocument) {
alert(TEXT_InsertCrossReferenceField_CannotCrossFile)
return
}
else {
var oldbm// As Bookmark
var bmShowHiddenOld = selectedRange.Bookmarks.ShowHidden
//search for existing bookmark reference the same range
var bmRegExp = new RegExp(BookmarkPrefix + "\\d+")
selectedRange.Bookmarks.ShowHidden = true
for (var i = 1; i <= selectedRange.Bookmarks.Count; i++) {
var bmi = selectedRange.Bookmarks.Item(i)
if (bmi.Range.IsEqual(selectedRange) && bmRegExp.test(bmi.Name)) {
oldbm = bmi
break
}
}
selectedRange.Bookmarks.ShowHidden = bmShowHiddenOld
if (oldbm) {
selectedBM = oldbm
}
else {
//create new bookmark using timestamp as its name
selectedBM = selectedRange.Bookmarks.Add(BookmarkPrefix + new Date().getTime(), selectedRange)
}
bmValid = true
}
}
if (bmValid) {
ActiveDocument.Fields.Add(Selection.Range, wdFieldRef, selectedBM.Name + " \\h")
}
}
catch (err) {
HandyRef_ShowUnknowErrorPrompt(err.message)
}
finally {
Application.UndoRecord.EndCustomRecord()
}
}
function HandyRef_ClearRefBrokenComment_RibbonFun(control) {
if (Application.Selection.End - Application.Selection.Start == 0) {
alert(TEXT_ClearRefBrokenCommentForWholeDocPrompt)
HandyRef_ClearRefBrokenComment(ActiveDocument.Range())
}
else {
HandyRef_ClearRefBrokenComment(Application.Selection.Range)
}
alert(TEXT_RefBrokenCommentClearedPrompt)
}
function HandyRef_ClearRefBrokenComment(targetRange) {
try {
Application.UndoRecord.StartCustomRecord(HandyRef_FormatUndoRecordText(TEXT_ActionName_ClearRefBrokenComment))
var toDelete = []
for (var i = 1; i <= targetRange.Comments.Count; i++) {
var cmt = targetRange.Comments.Item(i)
var s = cmt.Range.Paragraphs.Last.Range.Text.trim()
if (s.indexOf(RefBrokenCommentTitle) == s.length - RefBrokenCommentTitle.length) {
toDelete.push(cmt)
}
}
for (var i in toDelete) {
toDelete[i].DeleteRecursively()
}
}
catch (err) {
HandyRef_ShowUnknowErrorPrompt(err.message)
}
finally {
Application.UndoRecord.EndCustomRecord()
}
}
function HandyRef_CheckForBrokenRef_RibbonFun(control) {
if (Application.Selection.End - Application.Selection.Start == 0) {
alert(TEXT_RefCheckingForWholeDocPrompt)
HandyRef_CheckForBrokenRef(ActiveDocument.Range())
}
else {
HandyRef_CheckForBrokenRef(Application.Selection.Range)
}
}
function HandyRef_CheckForBrokenRef(checkingRange) {
try {
Application.UndoRecord.StartCustomRecord(HandyRef_FormatUndoRecordText(TEXT_ActionName_CheckReference))
HandyRef_ClearRefBrokenComment(checkingRange)
var refRegExp = /\s*REF\s+([^\s]+)\s*.*/i
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 (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
}
}
}
}
if (brokenCount == 0) {
alert(TEXT_NoBrokenRefFoundPrompt)
}
else {
alert(TEXT_BrokenRefFoundPrompt.replace(BrokenRefNumPosHolder, brokenCount))
try {
ActiveWindow.View.SplitSpecial = wdPaneNone
}
catch (err) { }
ActiveWindow.View.SplitSpecial = wdPaneRevisions
}
}
catch (err) {
HandyRef_ShowUnknowErrorPrompt(err.message)
}
finally {
Application.UndoRecord.EndCustomRecord()
}
}
function HandyRef_About_RibbonFun(control) {
HandyRef_About()
}
function HandyRef_About() {
alert(TEXT_HandyRefAppName + '\r\n' + TEXT_HandyRefDescription + '\r\n' + TEXT_NonCommecialPrompt + '\r\n\r\n' + TEXT_VersionPrompt + HandyRefVersion + '\r\n' + TEXT_HandyRefAuthor + '\r\n' + TEXT_HandyRefGithubUrl)//)
}
function HandyRef_GetLatestVersion_RibbonFun(control) {
try {
Shell("explorer.exe " + TEXT_HandyRefGithubUrl, jsNormalFocus)
}
catch (err) {
HandyRef_ShowUnknowErrorPrompt(err)
}
}
+
+ //https://github.com/shishouyuan/HandyRefVBA
//A handy way to insert Cross Reference in MS Word and WPS
//Author: Shouyuan Shi @ South China University of Technology
//E-mail: shishouyuan@outlook.com
//Creating Date: 2021/5/11
//用于在Word里方便地添加交叉引用
//作者: 史守圆 @ 华南理工大学
//E-mail: shishouyuan@outlook.com
//创建时期: 2021/5/11
var HandyRefVersion
var TEXT_HandyRefGithubUrl
var BookmarkPrefix
var RefBrokenCommentTitle
var HandyRef_Lang
var BrokenRefNumPosHolder
var TEXT_HandyRefAppName
var TEXT_HandyRefAuthor
var TEXT_HandyRefDescription
var TEXT_CreateReferencePoint_nullSelected
var TEXT_InsertCrossReferenceField_NoRefPoint
var TEXT_InsertCrossReferenceField_CannotCrossFile
var TEXT_VersionPrompt
var TEXT_NonCommecialPrompt
var TEXT_RefBrokenComment
var TEXT_BrokenRefFoundPrompt
var TEXT_NoBrokenRefFoundPrompt
var TEXT_RefBrokenCommentClearedPrompt
var TEXT_RefCheckingForWholeDocPrompt
var TEXT_ClearRefBrokenCommentForWholeDocPrompt
var TEXT_UnknownErrOccurredPrompt
var TEXT_ActionName_CreateSource
var TEXT_ActionName_InsertReference
var TEXT_ActionName_CheckReference
var TEXT_ActionName_ClearRefBrokenComment
function HandyRef_OnLoad(ribbonUI) {
HandyRefVersion = "20210620.1556.JS"
TEXT_HandyRefGithubUrl = "https://github.com/shishouyuan/HandyRefVBA"
BookmarkPrefix = "_HandyRef"
RefBrokenCommentTitle = "$HANDYREF_REFERENCE_BROKEN_COMMENT$"
HandyRef_Lang = "en-us"
BrokenRefNumPosHolder = "#"
if (HandyRef_Lang == "zh-cn") {
TEXT_HandyRefAppName = "HandyRef-快引"
TEXT_HandyRefAuthor = "史守圆 @ 华南理工大学"
TEXT_HandyRefDescription = "为 Word 提供一个快速添加交叉引用的方式。"
TEXT_CreateReferencePoint_nullSelected = "请先选中要引用的内容!"
TEXT_InsertCrossReferenceField_NoRefPoint = "当前没有设置引用点!"
TEXT_InsertCrossReferenceField_CannotCrossFile = "不支持跨文件引用!"
TEXT_VersionPrompt = "版本:"
TEXT_NonCommecialPrompt = "仅限非商业用途"
TEXT_RefBrokenComment = "引用源丢失!"
TEXT_BrokenRefFoundPrompt = "发现了 " + BrokenRefNumPosHolder + " 个损坏的引用,已为其添加批注。"
TEXT_NoBrokenRefFoundPrompt = "没有发现损坏的引用。"
TEXT_RefBrokenCommentClearedPrompt = "引用损坏批注已清除。"
TEXT_RefCheckingForWholeDocPrompt = "当前没有选中的内容,将检查整个文档。" + '\r\n' + "这可能需要一些时间。"
TEXT_ClearRefBrokenCommentForWholeDocPrompt = "当前没有选中的内容,将清除整个文档中的引用损坏批注。"
TEXT_UnknownErrOccurredPrompt = "遇到错误:"
TEXT_ActionName_CreateSource = "创建引用源"
TEXT_ActionName_InsertReference = "交叉引用"
TEXT_ActionName_CheckReference = "检查引用"
TEXT_ActionName_ClearRefBrokenComment = "清除批注"
} else {
TEXT_HandyRefAppName = "HandyRef"
TEXT_HandyRefAuthor = "Shouyuan Shi @ South China University of Technology"
TEXT_HandyRefDescription = "Provide a handy way to insert Cross Reference in MS Word."
TEXT_CreateReferencePoint_nullSelected = "Nothing selected!"
TEXT_InsertCrossReferenceField_NoRefPoint = "No Reference Point Selected!"
TEXT_InsertCrossReferenceField_CannotCrossFile = "Cross file reference is ! supported!"
TEXT_VersionPrompt = "Version: "
TEXT_NonCommecialPrompt = "Only for NON-COMMERCIAL use."
TEXT_RefBrokenComment = "Reference Broken!"
TEXT_BrokenRefFoundPrompt = BrokenRefNumPosHolder + " broken reference found. Comments are attached."
TEXT_NoBrokenRefFoundPrompt = "No broken reference found."
TEXT_RefBrokenCommentClearedPrompt = "Reference broken comments cleared."
TEXT_RefCheckingForWholeDocPrompt = "Nothing is selected. The whole document will be checked." + '\r\n' + "This may take a while."
TEXT_ClearRefBrokenCommentForWholeDocPrompt = "Nothing is selected. Reference broken comments in the whole document will be cleared."
TEXT_UnknownErrOccurredPrompt = "Error occurred:"
TEXT_ActionName_CreateSource = "Create Source"
TEXT_ActionName_InsertReference = "Insert Reference"
TEXT_ActionName_CheckReference = "Check Reference"
TEXT_ActionName_ClearRefBrokenComment = "Clear Comments"
}
}
function HandyRef_GetEnabled(control) {
return true
//return ActiveDocument!=null
}
var selectedBM
var selectedRange
var selectedIsNote
function HandyRef_FormatUndoRecordText(s) {
return s + "-" + TEXT_HandyRefAppName
}
function HandyRef_ShowUnknowErrorPrompt(e) {
alert(TEXT_UnknownErrOccurredPrompt + '\r\n' + e.Description)
}
function HandyRef_CreateReferencePoint_RibbonFun(control) { // wrap the function to match the signature called by ribbion
HandyRef_CreateReferencePoint()
}
function HandyRef_CreateReferencePoint() {
var rg = Application.Selection.Range
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 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)
}
}
function HandyRef_InsertCrossReferenceField_RibbonFun(control) {
HandyRef_InsertCrossReferenceField()
}
function HandyRef_InsertCrossReferenceField() {
try {
Application.UndoRecord.StartCustomRecord(HandyRef_FormatUndoRecordText(TEXT_ActionName_InsertReference))
var bmValid = false
if (selectedBM) {
if (Application.IsObjectValid(selectedBM)) {
if (selectedBM.Parent == ActiveDocument) {
bmValid = true
}
else {
alert(TEXT_InsertCrossReferenceField_CannotCrossFile)
return
}
}
else {// it's possible the bookmark is deleted by the user, but the range remaind.
selectedBM = null
}
}
if (!bmValid) {
if (!selectedRange || !Application.IsObjectValid(selectedRange) || selectedRange.Start == selectedRange.End) {
selectedRange = null
alert(TEXT_InsertCrossReferenceField_NoRefPoint)
return
}
else if (selectedRange.Document != ActiveDocument) {
alert(TEXT_InsertCrossReferenceField_CannotCrossFile)
return
}
else {
var oldbm// As Bookmark
var bmShowHiddenOld = selectedRange.Bookmarks.ShowHidden
//search for existing bookmark reference the same range
var bmRegExp = new RegExp(BookmarkPrefix + "\\d+")
selectedRange.Bookmarks.ShowHidden = true
for (var i = 1; i <= selectedRange.Bookmarks.Count; i++) {
var bmi = selectedRange.Bookmarks.Item(i)
if (bmi.Range.IsEqual(selectedRange) && bmRegExp.test(bmi.Name)) {
oldbm = bmi
break
}
}
selectedRange.Bookmarks.ShowHidden = bmShowHiddenOld
if (oldbm) {
selectedBM = oldbm
}
else {
//create new bookmark using timestamp as its name
selectedBM = selectedRange.Bookmarks.Add(BookmarkPrefix + new Date().getTime(), selectedRange)
}
bmValid = true
}
}
if (bmValid) {
if (selectedIsNote) {
ActiveDocument.Fields.Add(Selection.Range, wdFieldNoteRef, selectedBM.Name + " \\h")
}
else {
ActiveDocument.Fields.Add(Selection.Range, wdFieldRef, selectedBM.Name + " \\h")
}
}
}
catch (err) {
HandyRef_ShowUnknowErrorPrompt(err.message)
}
finally {
Application.UndoRecord.EndCustomRecord()
}
}
function HandyRef_ClearRefBrokenComment_RibbonFun(control) {
if (Application.Selection.End - Application.Selection.Start == 0) {
alert(TEXT_ClearRefBrokenCommentForWholeDocPrompt)
HandyRef_ClearRefBrokenComment(ActiveDocument.Range())
}
else {
HandyRef_ClearRefBrokenComment(Application.Selection.Range)
}
alert(TEXT_RefBrokenCommentClearedPrompt)
}
function HandyRef_ClearRefBrokenComment(targetRange) {
try {
Application.UndoRecord.StartCustomRecord(HandyRef_FormatUndoRecordText(TEXT_ActionName_ClearRefBrokenComment))
var toDelete = []
for (var i = 1; i <= targetRange.Comments.Count; i++) {
var cmt = targetRange.Comments.Item(i)
var s = cmt.Range.Paragraphs.Last.Range.Text.trim()
if (s.indexOf(RefBrokenCommentTitle) == s.length - RefBrokenCommentTitle.length) {
toDelete.push(cmt)
}
}
for (var i in toDelete) {
toDelete[i].DeleteRecursively()
}
}
catch (err) {
HandyRef_ShowUnknowErrorPrompt(err.message)
}
finally {
Application.UndoRecord.EndCustomRecord()
}
}
function HandyRef_CheckForBrokenRef_RibbonFun(control) {
if (Application.Selection.End - Application.Selection.Start == 0) {
alert(TEXT_RefCheckingForWholeDocPrompt)
HandyRef_CheckForBrokenRef(ActiveDocument.Range())
}
else {
HandyRef_CheckForBrokenRef(Application.Selection.Range)
}
}
function HandyRef_CheckForBrokenRef(checkingRange) {
var oldScreenUpdating = Application.ScreenUpdating
try {
Application.ScreenUpdating = false
Application.UndoRecord.StartCustomRecord(HandyRef_FormatUndoRecordText(TEXT_ActionName_CheckReference))
HandyRef_ClearRefBrokenComment(checkingRange)
//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 || fd.Type == wdFieldNoteRef) {
r = refRegExp.exec(fd.Code.Text.replace(refRegExp0, ""))
var isBroken = true
if (r.length > 0) {
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
}
}
}
if (brokenCount == 0) {
alert(TEXT_NoBrokenRefFoundPrompt)
}
else {
alert(TEXT_BrokenRefFoundPrompt.replace(BrokenRefNumPosHolder, brokenCount))
try {
ActiveWindow.View.SplitSpecial = wdPaneNone
}
catch (err) { }
ActiveWindow.View.SplitSpecial = wdPaneRevisions
}
}
catch (err) {
HandyRef_ShowUnknowErrorPrompt(err.message)
}
finally {
Application.ScreenUpdating = oldScreenUpdating
Application.UndoRecord.EndCustomRecord()
}
}
function HandyRef_About_RibbonFun(control) {
HandyRef_About()
}
function HandyRef_About() {
alert(TEXT_HandyRefAppName + '\r\n' + TEXT_HandyRefDescription + '\r\n' + TEXT_NonCommecialPrompt + '\r\n\r\n' + TEXT_VersionPrompt + HandyRefVersion + '\r\n' + TEXT_HandyRefAuthor + '\r\n' + TEXT_HandyRefGithubUrl)//)
}
function HandyRef_GetLatestVersion_RibbonFun(control) {
try {
Shell("explorer.exe " + TEXT_HandyRefGithubUrl, jsNormalFocus)
}
catch (err) {
HandyRef_ShowUnknowErrorPrompt(err)
}
}
diff --git a/HandyRef/word/~en-us/vbaProject.bin b/HandyRef/word/~en-us/vbaProject.bin
index 08657d9..d558db6 100644
Binary files a/HandyRef/word/~en-us/vbaProject.bin and b/HandyRef/word/~en-us/vbaProject.bin differ
diff --git a/HandyRef/word/~zh-cn/JDEData.bin b/HandyRef/word/~zh-cn/JDEData.bin
index 3f34093..6c0541f 100644
--- a/HandyRef/word/~zh-cn/JDEData.bin
+++ b/HandyRef/word/~zh-cn/JDEData.bin
@@ -4,8 +4,8 @@
1
-
- //https://github.com/shishouyuan/HandyRefVBA
//A handy way to insert Cross Reference in MS Word and WPS
//Author: Shouyuan Shi @ South China University of Technology
//E-mail: shishouyuan@outlook.com
//Creating Date: 2021/5/11
//用于在Word里方便地添加交叉引用
//作者: 史守圆 @ 华南理工大学
//E-mail: shishouyuan@outlook.com
//创建时期: 2021/5/11
var HandyRefVersion
var TEXT_HandyRefGithubUrl
var BookmarkPrefix
var RefBrokenCommentTitle
var HandyRef_Lang
var BrokenRefNumPosHolder
var TEXT_HandyRefAppName
var TEXT_HandyRefAuthor
var TEXT_HandyRefDescription
var TEXT_CreateReferencePoint_nullSelected
var TEXT_InsertCrossReferenceField_NoRefPoint
var TEXT_InsertCrossReferenceField_CannotCrossFile
var TEXT_VersionPrompt
var TEXT_NonCommecialPrompt
var TEXT_RefBrokenComment
var TEXT_BrokenRefFoundPrompt
var TEXT_NoBrokenRefFoundPrompt
var TEXT_RefBrokenCommentClearedPrompt
var TEXT_RefCheckingForWholeDocPrompt
var TEXT_ClearRefBrokenCommentForWholeDocPrompt
var TEXT_UnknownErrOccurredPrompt
var TEXT_ActionName_CreateSource
var TEXT_ActionName_InsertReference
var TEXT_ActionName_CheckReference
var TEXT_ActionName_ClearRefBrokenComment
function HandyRef_OnLoad(ribbonUI) {
HandyRefVersion = "20210616.2006.JS"
TEXT_HandyRefGithubUrl = "https://github.com/shishouyuan/HandyRefVBA"
BookmarkPrefix = "_HandyRef"
RefBrokenCommentTitle = "$HANDYREF_REFERENCE_BROKEN_COMMENT$"
HandyRef_Lang = "zh-cn"
BrokenRefNumPosHolder = "#"
if (HandyRef_Lang == "zh-cn") {
TEXT_HandyRefAppName = "HandyRef-快引"
TEXT_HandyRefAuthor = "史守圆 @ 华南理工大学"
TEXT_HandyRefDescription = "为 Word 提供一个快速添加交叉引用的方式。"
TEXT_CreateReferencePoint_nullSelected = "请先选中要引用的内容!"
TEXT_InsertCrossReferenceField_NoRefPoint = "当前没有设置引用点!"
TEXT_InsertCrossReferenceField_CannotCrossFile = "不支持跨文件引用!"
TEXT_VersionPrompt = "版本:"
TEXT_NonCommecialPrompt = "仅限非商业用途"
TEXT_RefBrokenComment = "引用源丢失!"
TEXT_BrokenRefFoundPrompt = "发现了 " + BrokenRefNumPosHolder + " 个损坏的引用,已为其添加批注。"
TEXT_NoBrokenRefFoundPrompt = "没有发现损坏的引用。"
TEXT_RefBrokenCommentClearedPrompt = "引用损坏批注已清除。"
TEXT_RefCheckingForWholeDocPrompt = "当前没有选中的内容,将检查整个文档。" + '\r\n' + "这可能需要一些时间。"
TEXT_ClearRefBrokenCommentForWholeDocPrompt = "当前没有选中的内容,将清除整个文档中的引用损坏批注。"
TEXT_UnknownErrOccurredPrompt = "遇到错误:"
TEXT_ActionName_CreateSource = "创建引用源"
TEXT_ActionName_InsertReference = "交叉引用"
TEXT_ActionName_CheckReference = "检查引用"
TEXT_ActionName_ClearRefBrokenComment = "清除批注"
} else {
TEXT_HandyRefAppName = "HandyRef"
TEXT_HandyRefAuthor = "Shouyuan Shi @ South China University of Technology"
TEXT_HandyRefDescription = "Provide a handy way to insert Cross Reference in MS Word."
TEXT_CreateReferencePoint_nullSelected = "Nothing selected!"
TEXT_InsertCrossReferenceField_NoRefPoint = "No Reference Point Selected!"
TEXT_InsertCrossReferenceField_CannotCrossFile = "Cross file reference is ! supported!"
TEXT_VersionPrompt = "Version: "
TEXT_NonCommecialPrompt = "Only for NON-COMMERCIAL use."
TEXT_RefBrokenComment = "Reference Broken!"
TEXT_BrokenRefFoundPrompt = BrokenRefNumPosHolder + " broken reference found. Comments are attached."
TEXT_NoBrokenRefFoundPrompt = "No broken reference found."
TEXT_RefBrokenCommentClearedPrompt = "Reference broken comments cleared."
TEXT_RefCheckingForWholeDocPrompt = "Nothing is selected. The whole document will be checked." + '\r\n' + "This may take a while."
TEXT_ClearRefBrokenCommentForWholeDocPrompt = "Nothing is selected. Reference broken comments in the whole document will be cleared."
TEXT_UnknownErrOccurredPrompt = "Error occurred:"
TEXT_ActionName_CreateSource = "Create Source"
TEXT_ActionName_InsertReference = "Insert Reference"
TEXT_ActionName_CheckReference = "Check Reference"
TEXT_ActionName_ClearRefBrokenComment = "Clear Comments"
}
}
function HandyRef_GetEnabled(control) {
return true
//return ActiveDocument!=null
}
var selectedBM
var selectedRange
function HandyRef_FormatUndoRecordText(s) {
return s + "-" + TEXT_HandyRefAppName
}
function HandyRef_ShowUnknowErrorPrompt(e) {
alert(TEXT_UnknownErrOccurredPrompt + '\r\n' + e.Description)
}
function HandyRef_CreateReferencePoint_RibbonFun(control) { // wrap the function to match the signature called by ribbion
HandyRef_CreateReferencePoint()
}
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)
}
else {
selectedRange = rg
}
}
}
function HandyRef_InsertCrossReferenceField_RibbonFun(control) {
HandyRef_InsertCrossReferenceField()
}
function HandyRef_InsertCrossReferenceField() {
try {
Application.UndoRecord.StartCustomRecord(HandyRef_FormatUndoRecordText(TEXT_ActionName_InsertReference))
var bmValid = false
if (selectedBM) {
if (Application.IsObjectValid(selectedBM)) {
if (selectedBM.Parent == ActiveDocument) {
bmValid = true
}
else {
alert(TEXT_InsertCrossReferenceField_CannotCrossFile)
return
}
}
else {// it's possible the bookmark is deleted by the user, but the range remaind.
selectedBM = null
}
}
if (!bmValid) {
if (!selectedRange || !Application.IsObjectValid(selectedRange) || selectedRange.Start == selectedRange.End) {
selectedRange = null
alert(TEXT_InsertCrossReferenceField_NoRefPoint)
return
}
else if (selectedRange.Document != ActiveDocument) {
alert(TEXT_InsertCrossReferenceField_CannotCrossFile)
return
}
else {
var oldbm// As Bookmark
var bmShowHiddenOld = selectedRange.Bookmarks.ShowHidden
//search for existing bookmark reference the same range
var bmRegExp = new RegExp(BookmarkPrefix + "\\d+")
selectedRange.Bookmarks.ShowHidden = true
for (var i = 1; i <= selectedRange.Bookmarks.Count; i++) {
var bmi = selectedRange.Bookmarks.Item(i)
if (bmi.Range.IsEqual(selectedRange) && bmRegExp.test(bmi.Name)) {
oldbm = bmi
break
}
}
selectedRange.Bookmarks.ShowHidden = bmShowHiddenOld
if (oldbm) {
selectedBM = oldbm
}
else {
//create new bookmark using timestamp as its name
selectedBM = selectedRange.Bookmarks.Add(BookmarkPrefix + new Date().getTime(), selectedRange)
}
bmValid = true
}
}
if (bmValid) {
ActiveDocument.Fields.Add(Selection.Range, wdFieldRef, selectedBM.Name + " \\h")
}
}
catch (err) {
HandyRef_ShowUnknowErrorPrompt(err.message)
}
finally {
Application.UndoRecord.EndCustomRecord()
}
}
function HandyRef_ClearRefBrokenComment_RibbonFun(control) {
if (Application.Selection.End - Application.Selection.Start == 0) {
alert(TEXT_ClearRefBrokenCommentForWholeDocPrompt)
HandyRef_ClearRefBrokenComment(ActiveDocument.Range())
}
else {
HandyRef_ClearRefBrokenComment(Application.Selection.Range)
}
alert(TEXT_RefBrokenCommentClearedPrompt)
}
function HandyRef_ClearRefBrokenComment(targetRange) {
try {
Application.UndoRecord.StartCustomRecord(HandyRef_FormatUndoRecordText(TEXT_ActionName_ClearRefBrokenComment))
var toDelete = []
for (var i = 1; i <= targetRange.Comments.Count; i++) {
var cmt = targetRange.Comments.Item(i)
var s = cmt.Range.Paragraphs.Last.Range.Text.trim()
if (s.indexOf(RefBrokenCommentTitle) == s.length - RefBrokenCommentTitle.length) {
toDelete.push(cmt)
}
}
for (var i in toDelete) {
toDelete[i].DeleteRecursively()
}
}
catch (err) {
HandyRef_ShowUnknowErrorPrompt(err.message)
}
finally {
Application.UndoRecord.EndCustomRecord()
}
}
function HandyRef_CheckForBrokenRef_RibbonFun(control) {
if (Application.Selection.End - Application.Selection.Start == 0) {
alert(TEXT_RefCheckingForWholeDocPrompt)
HandyRef_CheckForBrokenRef(ActiveDocument.Range())
}
else {
HandyRef_CheckForBrokenRef(Application.Selection.Range)
}
}
function HandyRef_CheckForBrokenRef(checkingRange) {
try {
Application.UndoRecord.StartCustomRecord(HandyRef_FormatUndoRecordText(TEXT_ActionName_CheckReference))
HandyRef_ClearRefBrokenComment(checkingRange)
var refRegExp = /\s*REF\s+([^\s]+)\s*.*/i
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 (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
}
}
}
}
if (brokenCount == 0) {
alert(TEXT_NoBrokenRefFoundPrompt)
}
else {
alert(TEXT_BrokenRefFoundPrompt.replace(BrokenRefNumPosHolder, brokenCount))
try {
ActiveWindow.View.SplitSpecial = wdPaneNone
}
catch (err) { }
ActiveWindow.View.SplitSpecial = wdPaneRevisions
}
}
catch (err) {
HandyRef_ShowUnknowErrorPrompt(err.message)
}
finally {
Application.UndoRecord.EndCustomRecord()
}
}
function HandyRef_About_RibbonFun(control) {
HandyRef_About()
}
function HandyRef_About() {
alert(TEXT_HandyRefAppName + '\r\n' + TEXT_HandyRefDescription + '\r\n' + TEXT_NonCommecialPrompt + '\r\n\r\n' + TEXT_VersionPrompt + HandyRefVersion + '\r\n' + TEXT_HandyRefAuthor + '\r\n' + TEXT_HandyRefGithubUrl)//)
}
function HandyRef_GetLatestVersion_RibbonFun(control) {
try {
Shell("explorer.exe " + TEXT_HandyRefGithubUrl, jsNormalFocus)
}
catch (err) {
HandyRef_ShowUnknowErrorPrompt(err)
}
}
+
+ //https://github.com/shishouyuan/HandyRefVBA
//A handy way to insert Cross Reference in MS Word and WPS
//Author: Shouyuan Shi @ South China University of Technology
//E-mail: shishouyuan@outlook.com
//Creating Date: 2021/5/11
//用于在Word里方便地添加交叉引用
//作者: 史守圆 @ 华南理工大学
//E-mail: shishouyuan@outlook.com
//创建时期: 2021/5/11
var HandyRefVersion
var TEXT_HandyRefGithubUrl
var BookmarkPrefix
var RefBrokenCommentTitle
var HandyRef_Lang
var BrokenRefNumPosHolder
var TEXT_HandyRefAppName
var TEXT_HandyRefAuthor
var TEXT_HandyRefDescription
var TEXT_CreateReferencePoint_nullSelected
var TEXT_InsertCrossReferenceField_NoRefPoint
var TEXT_InsertCrossReferenceField_CannotCrossFile
var TEXT_VersionPrompt
var TEXT_NonCommecialPrompt
var TEXT_RefBrokenComment
var TEXT_BrokenRefFoundPrompt
var TEXT_NoBrokenRefFoundPrompt
var TEXT_RefBrokenCommentClearedPrompt
var TEXT_RefCheckingForWholeDocPrompt
var TEXT_ClearRefBrokenCommentForWholeDocPrompt
var TEXT_UnknownErrOccurredPrompt
var TEXT_ActionName_CreateSource
var TEXT_ActionName_InsertReference
var TEXT_ActionName_CheckReference
var TEXT_ActionName_ClearRefBrokenComment
function HandyRef_OnLoad(ribbonUI) {
HandyRefVersion = "20210620.1556.JS"
TEXT_HandyRefGithubUrl = "https://github.com/shishouyuan/HandyRefVBA"
BookmarkPrefix = "_HandyRef"
RefBrokenCommentTitle = "$HANDYREF_REFERENCE_BROKEN_COMMENT$"
HandyRef_Lang = "zh-cn"
BrokenRefNumPosHolder = "#"
if (HandyRef_Lang == "zh-cn") {
TEXT_HandyRefAppName = "HandyRef-快引"
TEXT_HandyRefAuthor = "史守圆 @ 华南理工大学"
TEXT_HandyRefDescription = "为 Word 提供一个快速添加交叉引用的方式。"
TEXT_CreateReferencePoint_nullSelected = "请先选中要引用的内容!"
TEXT_InsertCrossReferenceField_NoRefPoint = "当前没有设置引用点!"
TEXT_InsertCrossReferenceField_CannotCrossFile = "不支持跨文件引用!"
TEXT_VersionPrompt = "版本:"
TEXT_NonCommecialPrompt = "仅限非商业用途"
TEXT_RefBrokenComment = "引用源丢失!"
TEXT_BrokenRefFoundPrompt = "发现了 " + BrokenRefNumPosHolder + " 个损坏的引用,已为其添加批注。"
TEXT_NoBrokenRefFoundPrompt = "没有发现损坏的引用。"
TEXT_RefBrokenCommentClearedPrompt = "引用损坏批注已清除。"
TEXT_RefCheckingForWholeDocPrompt = "当前没有选中的内容,将检查整个文档。" + '\r\n' + "这可能需要一些时间。"
TEXT_ClearRefBrokenCommentForWholeDocPrompt = "当前没有选中的内容,将清除整个文档中的引用损坏批注。"
TEXT_UnknownErrOccurredPrompt = "遇到错误:"
TEXT_ActionName_CreateSource = "创建引用源"
TEXT_ActionName_InsertReference = "交叉引用"
TEXT_ActionName_CheckReference = "检查引用"
TEXT_ActionName_ClearRefBrokenComment = "清除批注"
} else {
TEXT_HandyRefAppName = "HandyRef"
TEXT_HandyRefAuthor = "Shouyuan Shi @ South China University of Technology"
TEXT_HandyRefDescription = "Provide a handy way to insert Cross Reference in MS Word."
TEXT_CreateReferencePoint_nullSelected = "Nothing selected!"
TEXT_InsertCrossReferenceField_NoRefPoint = "No Reference Point Selected!"
TEXT_InsertCrossReferenceField_CannotCrossFile = "Cross file reference is ! supported!"
TEXT_VersionPrompt = "Version: "
TEXT_NonCommecialPrompt = "Only for NON-COMMERCIAL use."
TEXT_RefBrokenComment = "Reference Broken!"
TEXT_BrokenRefFoundPrompt = BrokenRefNumPosHolder + " broken reference found. Comments are attached."
TEXT_NoBrokenRefFoundPrompt = "No broken reference found."
TEXT_RefBrokenCommentClearedPrompt = "Reference broken comments cleared."
TEXT_RefCheckingForWholeDocPrompt = "Nothing is selected. The whole document will be checked." + '\r\n' + "This may take a while."
TEXT_ClearRefBrokenCommentForWholeDocPrompt = "Nothing is selected. Reference broken comments in the whole document will be cleared."
TEXT_UnknownErrOccurredPrompt = "Error occurred:"
TEXT_ActionName_CreateSource = "Create Source"
TEXT_ActionName_InsertReference = "Insert Reference"
TEXT_ActionName_CheckReference = "Check Reference"
TEXT_ActionName_ClearRefBrokenComment = "Clear Comments"
}
}
function HandyRef_GetEnabled(control) {
return true
//return ActiveDocument!=null
}
var selectedBM
var selectedRange
var selectedIsNote
function HandyRef_FormatUndoRecordText(s) {
return s + "-" + TEXT_HandyRefAppName
}
function HandyRef_ShowUnknowErrorPrompt(e) {
alert(TEXT_UnknownErrOccurredPrompt + '\r\n' + e.Description)
}
function HandyRef_CreateReferencePoint_RibbonFun(control) { // wrap the function to match the signature called by ribbion
HandyRef_CreateReferencePoint()
}
function HandyRef_CreateReferencePoint() {
var rg = Application.Selection.Range
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 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)
}
}
function HandyRef_InsertCrossReferenceField_RibbonFun(control) {
HandyRef_InsertCrossReferenceField()
}
function HandyRef_InsertCrossReferenceField() {
try {
Application.UndoRecord.StartCustomRecord(HandyRef_FormatUndoRecordText(TEXT_ActionName_InsertReference))
var bmValid = false
if (selectedBM) {
if (Application.IsObjectValid(selectedBM)) {
if (selectedBM.Parent == ActiveDocument) {
bmValid = true
}
else {
alert(TEXT_InsertCrossReferenceField_CannotCrossFile)
return
}
}
else {// it's possible the bookmark is deleted by the user, but the range remaind.
selectedBM = null
}
}
if (!bmValid) {
if (!selectedRange || !Application.IsObjectValid(selectedRange) || selectedRange.Start == selectedRange.End) {
selectedRange = null
alert(TEXT_InsertCrossReferenceField_NoRefPoint)
return
}
else if (selectedRange.Document != ActiveDocument) {
alert(TEXT_InsertCrossReferenceField_CannotCrossFile)
return
}
else {
var oldbm// As Bookmark
var bmShowHiddenOld = selectedRange.Bookmarks.ShowHidden
//search for existing bookmark reference the same range
var bmRegExp = new RegExp(BookmarkPrefix + "\\d+")
selectedRange.Bookmarks.ShowHidden = true
for (var i = 1; i <= selectedRange.Bookmarks.Count; i++) {
var bmi = selectedRange.Bookmarks.Item(i)
if (bmi.Range.IsEqual(selectedRange) && bmRegExp.test(bmi.Name)) {
oldbm = bmi
break
}
}
selectedRange.Bookmarks.ShowHidden = bmShowHiddenOld
if (oldbm) {
selectedBM = oldbm
}
else {
//create new bookmark using timestamp as its name
selectedBM = selectedRange.Bookmarks.Add(BookmarkPrefix + new Date().getTime(), selectedRange)
}
bmValid = true
}
}
if (bmValid) {
if (selectedIsNote) {
ActiveDocument.Fields.Add(Selection.Range, wdFieldNoteRef, selectedBM.Name + " \\h")
}
else {
ActiveDocument.Fields.Add(Selection.Range, wdFieldRef, selectedBM.Name + " \\h")
}
}
}
catch (err) {
HandyRef_ShowUnknowErrorPrompt(err.message)
}
finally {
Application.UndoRecord.EndCustomRecord()
}
}
function HandyRef_ClearRefBrokenComment_RibbonFun(control) {
if (Application.Selection.End - Application.Selection.Start == 0) {
alert(TEXT_ClearRefBrokenCommentForWholeDocPrompt)
HandyRef_ClearRefBrokenComment(ActiveDocument.Range())
}
else {
HandyRef_ClearRefBrokenComment(Application.Selection.Range)
}
alert(TEXT_RefBrokenCommentClearedPrompt)
}
function HandyRef_ClearRefBrokenComment(targetRange) {
try {
Application.UndoRecord.StartCustomRecord(HandyRef_FormatUndoRecordText(TEXT_ActionName_ClearRefBrokenComment))
var toDelete = []
for (var i = 1; i <= targetRange.Comments.Count; i++) {
var cmt = targetRange.Comments.Item(i)
var s = cmt.Range.Paragraphs.Last.Range.Text.trim()
if (s.indexOf(RefBrokenCommentTitle) == s.length - RefBrokenCommentTitle.length) {
toDelete.push(cmt)
}
}
for (var i in toDelete) {
toDelete[i].DeleteRecursively()
}
}
catch (err) {
HandyRef_ShowUnknowErrorPrompt(err.message)
}
finally {
Application.UndoRecord.EndCustomRecord()
}
}
function HandyRef_CheckForBrokenRef_RibbonFun(control) {
if (Application.Selection.End - Application.Selection.Start == 0) {
alert(TEXT_RefCheckingForWholeDocPrompt)
HandyRef_CheckForBrokenRef(ActiveDocument.Range())
}
else {
HandyRef_CheckForBrokenRef(Application.Selection.Range)
}
}
function HandyRef_CheckForBrokenRef(checkingRange) {
var oldScreenUpdating = Application.ScreenUpdating
try {
Application.ScreenUpdating = false
Application.UndoRecord.StartCustomRecord(HandyRef_FormatUndoRecordText(TEXT_ActionName_CheckReference))
HandyRef_ClearRefBrokenComment(checkingRange)
//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 || fd.Type == wdFieldNoteRef) {
r = refRegExp.exec(fd.Code.Text.replace(refRegExp0, ""))
var isBroken = true
if (r.length > 0) {
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
}
}
}
if (brokenCount == 0) {
alert(TEXT_NoBrokenRefFoundPrompt)
}
else {
alert(TEXT_BrokenRefFoundPrompt.replace(BrokenRefNumPosHolder, brokenCount))
try {
ActiveWindow.View.SplitSpecial = wdPaneNone
}
catch (err) { }
ActiveWindow.View.SplitSpecial = wdPaneRevisions
}
}
catch (err) {
HandyRef_ShowUnknowErrorPrompt(err.message)
}
finally {
Application.ScreenUpdating = oldScreenUpdating
Application.UndoRecord.EndCustomRecord()
}
}
function HandyRef_About_RibbonFun(control) {
HandyRef_About()
}
function HandyRef_About() {
alert(TEXT_HandyRefAppName + '\r\n' + TEXT_HandyRefDescription + '\r\n' + TEXT_NonCommecialPrompt + '\r\n\r\n' + TEXT_VersionPrompt + HandyRefVersion + '\r\n' + TEXT_HandyRefAuthor + '\r\n' + TEXT_HandyRefGithubUrl)//)
}
function HandyRef_GetLatestVersion_RibbonFun(control) {
try {
Shell("explorer.exe " + TEXT_HandyRefGithubUrl, jsNormalFocus)
}
catch (err) {
HandyRef_ShowUnknowErrorPrompt(err)
}
}
diff --git a/HandyRef/word/~zh-cn/vbaProject.bin b/HandyRef/word/~zh-cn/vbaProject.bin
index ad1a7eb..4db6d92 100644
Binary files a/HandyRef/word/~zh-cn/vbaProject.bin and b/HandyRef/word/~zh-cn/vbaProject.bin differ
diff --git a/Release/HandyRef-English.dotm b/Release/HandyRef-English.dotm
index 9ea58fa..c6fc6ce 100644
Binary files a/Release/HandyRef-English.dotm and b/Release/HandyRef-English.dotm differ
diff --git "a/Release/HandyRef-\344\270\255\346\226\207.dotm" "b/Release/HandyRef-\344\270\255\346\226\207.dotm"
index 1786a36..21ebd25 100644
Binary files "a/Release/HandyRef-\344\270\255\346\226\207.dotm" and "b/Release/HandyRef-\344\270\255\346\226\207.dotm" differ