Skip to content

Commit

Permalink
Change attribute name no-repeat to changes-in, in tests
Browse files Browse the repository at this point in the history
  • Loading branch information
fbennett committed Aug 31, 2019
1 parent caef809 commit 9e85cf9
Show file tree
Hide file tree
Showing 8 changed files with 101 additions and 101 deletions.
4 changes: 2 additions & 2 deletions fixtures/local/parallel_FrenchCaseAndComments.txt
Expand Up @@ -182,12 +182,12 @@ Cass. 1ere civ., March 28, 2000, <i>JCP G</i>, 2000, 10296, <span style="font-va
<group is-parallel="first">
<date variable="issued" form="text"/>
</group>
<group delimiter=", " no-repeat="container-title volume">
<group delimiter=", " changes-in="container-title volume">
<text variable="container-title" font-style="italic" strip-periods="true"/>
<number variable="volume"/>
</group>
<group delimiter=" ">
<group no-repeat="container-title volume section">
<group changes-in="container-title volume section">
<text variable="section"/>
</group>
<label variable="page" form="short"/>
Expand Down
2 changes: 1 addition & 1 deletion fixtures/local/parallel_ProceduralHistory.txt
Expand Up @@ -148,7 +148,7 @@ citation
<number variable="volume"/>
<text variable="container-title"/>
<number variable="page"/>
<group delimiter=" " prefix="(" suffix=")" no-repeat="jurisdiction" is-parallel="last">
<group delimiter=" " prefix="(" suffix=")" changes-in="jurisdiction" is-parallel="last">
<names variable="authority">
<name/>
<institution institution-parts="short"/>
Expand Down
2 changes: 1 addition & 1 deletion fixtures/local/parallel_TrailingIbid.txt
Expand Up @@ -86,7 +86,7 @@ citation
<number variable="page"/>
<number variable="locator"/>
</group>
<group delimiter=" " prefix="(" suffix=")" no-repeat="jurisdiction" is-parallel="last">
<group delimiter=" " prefix="(" suffix=")" changes-in="jurisdiction" is-parallel="last">
<names variable="authority">
<name/>
<institution institution-parts="short"/>
Expand Down
2 changes: 1 addition & 1 deletion src/api_cite.js
Expand Up @@ -898,7 +898,7 @@ CSL.getAmbiguousCite = function (Item, disambig, visualForm, item) {
label_form: flags.label_form,
parallel_condition: flags.parallel_condition,
parallel_result: flags.parallel_result,
no_repeat_condition: flags.no_repeat_condition,
changes_in_condition: flags.changes_in_condition,
parallel_repeats: flags.parallel_result,
condition: flags.condition,
force_suppress: flags.force_suppress,
Expand Down
3 changes: 3 additions & 0 deletions src/attributes.js
Expand Up @@ -812,6 +812,9 @@ CSL.Attributes["@locale-internal"] = function (state, arg) {
CSL.Attributes["@is-parallel"] = function (state, arg) {
this.strings.set_parallel_condition = arg;
};
CSL.Attributes["@changes-in"] = function (state, arg) {
this.strings.set_changes_in_condition = arg.split(/\s+/);
};
CSL.Attributes["@no-repeat"] = function (state, arg) {
this.strings.set_no_repeat_condition = arg.split(/\s+/);
};
Expand Down
8 changes: 4 additions & 4 deletions src/node_group.js
Expand Up @@ -83,7 +83,7 @@ CSL.Node.group = {
label_form: label_form,
label_capitalize_if_first: label_capitalize_if_first,
parallel_condition: this.strings.set_parallel_condition,
no_repeat_condition: this.strings.set_no_repeat_condition,
changes_in_condition: this.strings.set_changes_in_condition,
parallel_result: undefined,
parallel_repeats: undefined,
condition: condition,
Expand Down Expand Up @@ -300,13 +300,13 @@ CSL.Node.group = {
}
var blobs = state.output.current.value().blobs;
var pos = state.output.current.value().blobs.length - 1;
if (!state.tmp.just_looking && (flags.parallel_condition || flags.no_repeat_condition)) {
if (!state.tmp.just_looking && (flags.parallel_condition || flags.changes_in_condition)) {
var parallel_condition_object = {
blobs: blobs,
condition: flags.parallel_condition,
result: flags.parallel_result,
norepeat: flags.no_repeat_condition,
repeats: flags.parallel_repeats,
changes_in_condition: flags.changes_in_condition,
parallel_repeats: flags.parallel_repeats,
id: Item.id,
pos: pos
};
Expand Down
176 changes: 86 additions & 90 deletions src/util_parallel.js
Expand Up @@ -5,35 +5,73 @@
*/
CSL.Parallel = function (state) {
this.state = state;
this.info = {};
this.parallel_conditional_blobs_list = [];
};

CSL.Parallel.prototype.setSeriesRels = function(prevID, currID, seriesRels) {
if (this.info[prevID][currID]) {
if (!seriesRels) {
seriesRels = JSON.parse(JSON.stringify(this.info[prevID]));
CSL.Parallel.Partnerships = function(state, items) {
this.state = state;
this.items = items.concat([[{},{}]]);
this.partnerMap = null;
};

CSL.Parallel.Partnerships.prototype.update = function(i) {
var currItem = this.items[i][0];
var nextItem = this.items[i+1][0];
var partnerStatus = null;
if (this.partnerMap) {
if (this.partnerMap[nextItem.id]) {
partnerStatus = "mid";
} else {
this.partnerMap = null;
partnerStatus = "last";
}
} else {
seriesRels = false;
// set partnerMap for this and its partner if none present
if (this._setPartnerStatus(i)) {
partnerStatus = "first";
}
}
return partnerStatus;
// set repeatMap for this an its partner
}

CSL.Parallel.Partnerships.prototype.getID = function(i) {
return this.items[i][0].id;
}

CSL.Parallel.Partnerships.prototype._setPartnerStatus = function(i) {
var currItem = this.items[i][0];
var nextItem = this.items[i+1][0]
var hasMap = false;
if (currItem.seeAlso) {
if (currItem.seeAlso.indexOf(nextItem.id) > -1) {
this.partnerMap = {};
for (var j=0,jlen=currItem.seeAlso.length; j<jlen; j++) {
this.partnerMap[currItem.seeAlso[j]] = true;
}
hasMap = true;
}
}
return seriesRels;
return hasMap;
}

CSL.Parallel.prototype.getRepeats = function(prev, curr) {
CSL.Parallel.Partnerships.prototype._getPartnerRepeats = function(i) {
var currItem = this.items[i][0];
var nextItem = this.items[i+1][0];
var rex = /(?:type|id|seeAlso|.*-sub|.*-subjoin|.*-main)/;
var ret = {};
for (var key in prev) {
for (var key in currItem) {
if (key.match(rex)) {
continue;
}
if (typeof prev[key] === "string" || !prev[key]) {
if (prev[key] && prev[key] === curr[key]) {
if (!currItem[key]) continue;
if (typeof currItem[key] === "string") {
if (currItem[key] === nextItem[key]) {
ret[key] = true;
}
} else if (typeof prev[key] === "object") {
// Could do better than this.
if (JSON.stringify(prev[key]) === JSON.stringify(curr[key])) {
} else if (typeof currItem[key] === "object") {
// Could do better than this, should be proper deepEqual polyfill
if (JSON.stringify(currItem[key]) === JSON.stringify(nextItem[key])) {
ret[key] = true;
}
}
Expand All @@ -43,82 +81,39 @@ CSL.Parallel.prototype.getRepeats = function(prev, curr) {

CSL.Parallel.prototype.StartCitation = function (sortedItems, out) {
this.parallel_conditional_blobs_list = [];
this.info = {};
if (sortedItems.length > 1) {
// Harder than it looks.
// On a first pass, get the seeAlso of each item.
var partners = new CSL.Parallel.Partnerships(this.state, sortedItems);
var masterID = false;
for (var i=0,ilen=sortedItems.length; i<ilen; i++) {
var curr = sortedItems[i][0];
this.info[curr.id] = {};
if (curr.seeAlso) {
for (var j=0,jlen=curr.seeAlso.length; j<jlen; j++) {
if (curr.id === curr.seeAlso[j]) {
continue;
}
this.info[curr.id][curr.seeAlso[j]] = true;
var status = partners.update(i);
var currentID = partners.getID(i);
if (status === "first") {
sortedItems[i][1].parallel = "first";
if (i < ilen-1) {
sortedItems[i+1][1].parallel_repeats = partners._getPartnerRepeats(i);
sortedItems[i][1].parallel_repeats = sortedItems[i+1][1].parallel_repeats;
}
}
}
// On a second pass, set an item to FIRST if the current
// item is in its seeAlso. The seeAlso of the FIRST item control
// until (a) a non-member is encountered at CURRENT, or
// (b) the end of the array is reached.
// The seeAlso keys are deleted as each is seen.
// If neither (a) nor (b), set the current item to MID.
// If (a) and the previous item is FIRST, delete its
// parallel marker.
// If (b) and the current item is FIRST, delete its
// parallel marker.
// If (a) and the previous item is not FIRST, set it to
// LAST, and reset seeAlso from the current item.
// If (b) and the current item is not FIRST, set it to
// LAST.
var seriesRels = false;
var masterID = false;
for (var i=1,ilen=sortedItems.length; i<ilen; i++) {
var prev = sortedItems[i-1][0];
var curr = sortedItems[i][0];
var newSeriesRels = this.setSeriesRels(prev.id, curr.id, seriesRels);
if (!seriesRels) {
if (newSeriesRels) {
// first
seriesRels = newSeriesRels;
delete seriesRels[curr.id];
sortedItems[i-1][1].parallel = "first";
sortedItems[i][1].parallel = "mid";
sortedItems[i][1].repeats = this.getRepeats(prev, curr);
sortedItems[i-1][1].repeats = sortedItems[i][1].repeats;
if (!sortedItems[i][1].prefix) {
sortedItems[i][1].prefix = ", ";
}
masterID = prev.id;
this.state.registry.registry[masterID].master = true;
this.state.registry.registry[masterID].siblings = [curr.id];

masterID = currentID;
this.state.registry.registry[masterID].master = true;
this.state.registry.registry[masterID].siblings = [];
} else if (status === "mid") {
sortedItems[i][1].parallel = "mid";
if (i < ilen-1) {
sortedItems[i+1][1].parallel_repeats = partners._getPartnerRepeats(i);
}
} else {
if (seriesRels[curr.id]) {
sortedItems[i][1].parallel = "mid";
if (!sortedItems[i][1].prefix) {
sortedItems[i][1].prefix = ", ";
}
delete seriesRels[curr.id];
sortedItems[i][1].repeats = this.getRepeats(prev, curr);
//sortedItems[i-1][1].repeats = sortedItems[i][1].repeats;
this.state.registry.registry[masterID].siblings.push(curr.id);
} else {
sortedItems[i-1][1].parallel = "last";
sortedItems[i][1].repeats = this.getRepeats(prev, curr);
seriesRels = false;
if (!sortedItems[i][1].prefix) {
sortedItems[i][1].prefix = ", ";
}
}
if (i === (sortedItems.length-1)) {
if (sortedItems[i][1].parallel === "mid") {
sortedItems[i][1].parallel = "last";
sortedItems[i][1].repeats = this.getRepeats(prev, curr);
} else if (sortedItems[i][1].parallel !== "last") {
delete sortedItems[i][1].repeats;
this.state.registry.registry[masterID].siblings.push(currentID);
} else if (status === "last") {
sortedItems[i][1].parallel = "last";
if (!sortedItems[i][1].prefix) {
sortedItems[i][1].prefix = ", ";
}
if (i < ilen-1) {
sortedItems[i+1][1].parallel_repeats = partners._getPartnerRepeats(i);
}
this.state.registry.registry[masterID].siblings.push(currentID);
}
}
}
Expand All @@ -128,24 +123,25 @@ CSL.Parallel.prototype.StartCitation = function (sortedItems, out) {
CSL.Parallel.prototype.purgeGroupsIfParallel = function () {
for (var i = this.parallel_conditional_blobs_list.length - 1; i > -1; i += -1) {
var obj = this.parallel_conditional_blobs_list[i];
if (!obj.result && !obj.repeats) {
if (!obj.result && !obj.parallel_repeats) {
purgeme = false;
} else {
if (obj.condition) {
var purgeme = true;
if (obj.result === obj.condition) {
if (!obj.result || obj.result === obj.condition) {
purgeme = false;
}
}
if (purgeme && obj.norepeat && obj.repeats) {
if (purgeme && obj.changes_in_condition && obj.parallel_repeats) {
//if (purgeme && obj.changes_in_condition && obj.parallel_repeats)
purgeme = false;
var matches = 0;
for (var j=0,jlen=obj.norepeat.length; j<jlen; j++) {
if (obj.repeats[obj.norepeat[j]]) {
for (var j=0,jlen=obj.changes_in_condition.length; j<jlen; j++) {
if (obj.parallel_repeats[obj.changes_in_condition[j]]) {
matches += 1;
}
}
if (matches === obj.norepeat.length) {
if (matches === obj.changes_in_condition.length) {
purgeme = true;
}
}
Expand Down
5 changes: 3 additions & 2 deletions src/util_substitute.js
Expand Up @@ -6,8 +6,9 @@ CSL.Util.substituteStart = function (state, target) {
if (item && item.parallel) {
state.tmp.group_context.tip.parallel_result = item.parallel;
}
if (item && item.repeats && Object.keys(item.repeats).length > 0) {
state.tmp.group_context.tip.parallel_repeats = item.repeats;
//if (item && item.repeats && Object.keys(item.repeats).length > 0) {
if (item && item.parallel_repeats) {
state.tmp.group_context.tip.parallel_repeats = item.parallel_repeats;
}
for (var i = 0, ilen = this.decorations.length; i < ilen; i += 1) {
if ("@strip-periods" === this.decorations[i][0] && "true" === this.decorations[i][1]) {
Expand Down

0 comments on commit 9e85cf9

Please sign in to comment.