Skip to content

Commit

Permalink
fix(plugin-csl): fix citationsPre, citationsPost
Browse files Browse the repository at this point in the history
Fix #141, #190
  • Loading branch information
larsgw committed Feb 14, 2023
1 parent 024f633 commit bfb9db8
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 8 deletions.
65 changes: 58 additions & 7 deletions packages/plugin-csl/src/citation.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,59 @@
import { util } from '@citation-js/core'
import prepareEngine from './engines.js'

/**
* https://citeproc-js.readthedocs.io/en/latest/csl-json/markup.html#cite-items
*
* @typedef {Object} module:@citation-js/plugin-csl.output~CiteItem
* @property {String} id
*/

/**
* https://citeproc-js.readthedocs.io/en/latest/csl-json/markup.html#citations
*
* @typedef {Object} module:@citation-js/plugin-csl.output~Citation
* @property {Array<module:@citation-js/plugin-csl.output~CiteItem>} citationItems
* @property {Object} properties
* @property {Number} properties.noteIndex
*/

/**
* @access private
* @param {String|module:@citation-js/plugin-csl.output~CiteItem} citeItem
* @return {module:@citation-js/plugin-csl.output~CiteItem} citeItem
*/
function prepareCiteItem (citeItem) {
return typeof citeItem === 'object' ? citeItem : { id: citeItem }
}

/**
* @access private
* @param {String|Array<String>|Array<module:@citation-js/plugin-csl.output~CiteItem>|module:@citation-js/plugin-csl.output~CiteItem|module:@citation-js/plugin-csl.output~Citation} citation
* @return {module:@citation-js/plugin-csl.output~Citation} citation
*/
function prepareCitation (citation) {
if (citation.citationItems) {
return citation
}

return {
citationItems: [].concat(citation).map(prepareCiteItem),
properties: { noteIndex: 0 }
}
}

/**
* @access private
* @param {Array<String>|Array<module:@citation-js/plugin-csl.output~CiteItem>|Array<module:@citation-js/plugin-csl.output~Citation>} [context=[]]
* @return {Array<module:@citation-js/plugin-csl.output~Citation>} citations
*/
function prepareCitations (context) {
if (!context) {
return []
}
return context.map(prepareCitation)
}

/**
* Here's an example for `entry`:
*
Expand Down Expand Up @@ -46,13 +99,11 @@ export default function citation (data, options = {}) {
data = util.downgradeCsl(data)

const citeproc = prepareEngine(data, template, lang, format)
citeproc.updateItems(ids)

const { citationsPre = [], citationsPost = [] } = options
const citation = citeproc.previewCitationCluster({
citationItems: entries.map(id => typeof id === 'object' ? id : { id }),
properties: { noteIndex: 0 }
}, citationsPre, citationsPost, format)
const before = prepareCitations(options.citationsPre)
const citation = prepareCitation(entries)
const after = prepareCitations(options.citationsPost)
const output = citeproc.rebuildProcessorState([...before, citation, ...after], format, [])

return citation
return output[before.length][2]
}
3 changes: 2 additions & 1 deletion packages/plugin-csl/test/data.js
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ module.exports = {
'no entry option': [citationData, '(A, 2011; d & h, 2012; f, 2013)'],
'with locator': [citationData, '(A, 2011, p. 123)', { entry: { id: '1', locator: 123, label: 'page' } }],
'with suffix': [citationData, '(A, 2011 [!])', { entry: { id: '1', suffix: '[!]' } }],
'style-default locale': [citationData, '(« a », 2011; d et h, 2012; f, 2013)', { template: 'harvard1:fr-FR' }]
'style-default locale': [citationData, '(« a », 2011; d et h, 2012; f, 2013)', { template: 'harvard1:fr-FR' }],
'with context': [citationData, '(3)', { template: 'vancouver', citationsPre: ['1', '2'], entry: '3' }]
}
}
18 changes: 18 additions & 0 deletions packages/plugin-csl/test/index.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,24 @@ describe('output', function () {
{ id: '5', title: 'bar', author: [{ family: 'a' }] }
], { template })
})

it('clears citation cache', function () {
const a = plugins.output.format('citation', [
{ id: '6', title: 'foo', author: [{ family: 'a' }], issued: { 'date-parts': [[2000]] } },
{ id: '7', title: 'foo', author: [{ family: 'a' }], issued: { 'date-parts': [[2000]] } }
])
const b = plugins.output.format('bibliography', [
{ id: '6', title: 'foo', author: [{ family: 'a' }], issued: { 'date-parts': [[2000]] } },
{ id: '7', title: 'foo', author: [{ family: 'a' }], issued: { 'date-parts': [[2000]] } }
])
const c = plugins.output.format('bibliography', [
{ id: '6', title: 'foo', author: [{ family: 'a' }], issued: { 'date-parts': [[2000]] } }
])

assert.strictEqual(a, '(a, 2000a, 2000b)')
assert.strictEqual(b, 'a. (2000a). foo.\na. (2000b). foo.\n')
assert.strictEqual(c, 'a. (2000). foo.\n')
})
})

describe('errors', function () {
Expand Down

0 comments on commit bfb9db8

Please sign in to comment.