-
Notifications
You must be signed in to change notification settings - Fork 0
/
Find Duplicate Citations.fh_lua
175 lines (166 loc) · 6.61 KB
/
Find Duplicate Citations.fh_lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
--[[
@Title: Find Duplicate Citations
@Author: Jane Taubman
@Version: 1.2
@LastUpdated: Feb 2013
@Description: Finds all Facts with more than 1 citation to the same source and optionally deletes second and subsequent citations.
It is recommended that the list option is used first to allow checking of the items to be deleted, before using the delete option.
]]
------------------------------------------------------------------ main
function main()
tblOutput,iC = createResultTable()
local intButton = iupButtons("List or Delete All Duplicate Citations","Please Select from the following options","V",
"List All Duplicate Citations on Facts","Delete All Duplicate Citations on Facts")
if intButton == 0 then return end
if intButton == 2 and fhMessageBox("Warning\nPlease confirm deletion of the second and subsequent citations\n where the same source cited more than once for a fact", "MB_YESNO","MB_ICONEXCLAMATION") ~= 'Yes' then
return
end
-- Define Columns
tblOutput.indi = {title='Record',type='item',width=140,align='align_left',content={}}
tblOutput.fact = {title='Fact',type='item',width=140,align='align_left',content={}}
for i = 1,10 do
tblOutput['cite'..i] = {title='Cite '..i,type='item',width=140,align='align_left',content={}}
end
for _,sType in ipairs({'FAM','INDI'}) do
for pi in records(sType) do
for pfact in facts(pi) do
-- Add Columns
local i,j,k = 0,0,0
local tblDups = {}
local pfSource = fhNewItemPtr()
-- Build a list of sources
for pcite in childitem(pfact,'SOUR') do
i = i + 1
pfSource = fhGetValueAsLink(pcite)
table.insert(tblDups,{rec=pcite:Clone(),id=fhGetRecordId(pfSource)})
end
table.sort(tblDups,function(a, b) return a.id > b.id end)
local bFound = false
local tblLast = {}
local tblList = {}
function outputLine(line)
iC = iC + 1
tblOutput.indi.content[iC] = pi:Clone()
tblOutput.fact.content[iC] = pfact:Clone()
if intButton == 1 then
for j,tbline in ipairs(tblList) do
tblOutput['cite'..j].content[iC] = tbline.rec:Clone()
end
else
for j,tbline in ipairs(tblList) do
if j == 1 then
tblOutput['cite'..j].content[iC] = tbline.rec:Clone()
else
if not(fhDeleteItem(tbline.rec)) then error('Error Occured Deleting Citation') end
end
end
end
end
for i,tblcite in ipairs(tblDups) do
if i > 1 and tblLast.id == tblcite.id then
if #tblList == 0 then tblList[1] = tblLast end
tblList[#tblList + 1] = tblcite
else
if #tblList > 0 then
-- Output Line
outputLine(tblline)
tblList = {}
end
end
tblLast = tblcite
end
if #tblList > 0 then
-- Output Line
outputLine(tblline)
end
end
end
end
fhOutputResultSetTitles("All Individuals", "All Individuals", "Item List Example Date: %#x")
for t in tblOutput() do
fhOutputResultSetColumn(t.title, t.type, t.content, iC, t.width,t.align)
end
end
------------------------------------------------------------------ custom functions
function childitem(pi)
local pf = fhNewItemPtr()
local pf2 = fhNewItemPtr()
pf:MoveTo(pi,'~.SOUR')
return function ()
while pf:IsNotNull() do
pf2:MoveTo(pf)
pf:MoveNext('SAME_TAG')
if pf2:IsNotNull() then return pf2 end
end
end
end
------------------------------------------------------------------ standard functions
function facts(pi)
local pf = fhNewItemPtr()
local pf2 = fhNewItemPtr()
pf:MoveToFirstChildItem(pi)
return function ()
while pf:IsNotNull() do
pf2:MoveTo(pf)
pf:MoveNext()
if fhIsFact(pf2) then return pf2 end
end
end
end
function records(type)
local pi = fhNewItemPtr()
local p2 = fhNewItemPtr()
pi:MoveToFirstRecord(type)
return function ()
p2:MoveTo(pi)
pi:MoveNext()
if p2:IsNotNull() then return p2 end
end
end
function createResultTable()
-- create metatable
local tblOutput_mt = {}
tblOutput_mt.col = 0
tblOutput_mt.seq = {}
tblOutput_mt.__newindex = function (t,k,v)
rawset(t,k,v) -- update original table
local m = getmetatable(t)
m.col = m.col + 1
table.insert(m.seq,k)
end
tblOutput_mt.__call = function (t)
local i = 0
local m = getmetatable(t)
local n = table.getn(m.seq)
return function ()
i = i + 1
if i <= n then return t[m.seq[i]] end
end
end
local tblOutput = {} -- Define Columns Table
setmetatable(tblOutput, tblOutput_mt)
local iC = 0 -- Define count of lines
return tblOutput,iC
end
function iupButtons(strTitle,strMessage,strBoxType,...)
local intButton = 0 -- Returned value if X Close button is used
-- Create the GUI labels and buttons
local lblMessage = iup.label{title=strMessage,expand="YES"}
local lblLineSep = iup.label{separator="HORIZONTAL"}
local iupBox = iup.hbox{homogeneous="YES"}
if strBoxType == "V" then
iupBox = iup.vbox{homogeneous="YES"}
end
for intArgNum, strButton in ipairs(arg) do
local btnName = iup.button{title=strButton,expand="YES",padding="4",action=function() intButton=intArgNum return iup.CLOSE end}
iup.Append(iupBox,btnName)
end
-- Create dialogue and turn off resize, maximize, minimize, and menubox except Close button
local dialogue = iup.dialog{title=strTitle,iup.vbox{lblMessage,lblLineSep,iupBox},dialogframe="YES",background="250 250 250",gap="8",margin="8x8"}
dialogue:show()
if (iup.MainLoopLevel()==0) then iup.MainLoop() end
dialogue:destroy()
return intButton
end -- function iupButtons
------------------------------------------------------------------ call main
main()