@citeproc-rs/wasm
Advanced tools
Comparing version 0.0.0-canary-7bb4807 to 0.0.0-canary-88f356a
@@ -43,3 +43,3 @@ /* tslint:disable */ | ||
export type Cluster = { | ||
id: number; | ||
id: string; | ||
cites: Cite[]; | ||
@@ -49,3 +49,3 @@ }; | ||
export type ClusterPosition = { | ||
id: number; | ||
id: string; | ||
/** Leaving off this field means this cluster is in-text. */ | ||
@@ -69,3 +69,3 @@ note?: number; | ||
export type UpdateSummary<Output = string> = { | ||
clusters: [number, Output][]; | ||
clusters: [string, Output][]; | ||
bibliography?: BibliographyUpdate; | ||
@@ -93,3 +93,26 @@ }; | ||
type BibEntry = { | ||
id: string; | ||
value: string; | ||
}; | ||
type BibEntries = BibEntry[]; | ||
type FullRender = { | ||
allClusters: { [clusterId: string]: string }, | ||
bibEntries: BibEntries, | ||
}; | ||
type BibliographyMeta = { | ||
max_offset: number; | ||
entry_spacing: number; | ||
line_spacing: number; | ||
hanging_indent: boolean; | ||
/** the second-field-align value of the CSL style */ | ||
secondFieldAlign: null | "flush" | "margin"; | ||
/** Format-specific metadata */ | ||
formatMeta: any, | ||
}; | ||
/** | ||
@@ -116,5 +139,4 @@ */ | ||
* @param {string} style_text | ||
* @returns {any} | ||
*/ | ||
setStyle(style_text: string): any; | ||
setStyle(style_text: string): void; | ||
/** | ||
@@ -160,11 +182,16 @@ * Completely overwrites the references library. | ||
/** | ||
* Returns a random cluster id, with an extra guarantee that it isn't already in use. | ||
* @returns {string} | ||
*/ | ||
randomClusterId(): string; | ||
/** | ||
* Inserts or replaces a cluster with a matching `id`. | ||
* @param {any} cluster_id | ||
* @param {any} cluster | ||
*/ | ||
insertCluster(cluster_id: any): void; | ||
insertCluster(cluster: any): void; | ||
/** | ||
* Removes a cluster with a matching `id` | ||
* @param {number} cluster_id | ||
* @param {string} cluster_id | ||
*/ | ||
removeCluster(cluster_id: number): void; | ||
removeCluster(cluster_id: string): void; | ||
/** | ||
@@ -182,6 +209,6 @@ * Resets all the clusters in the processor to a new list. | ||
* still useful for initialization. | ||
* @param {number} id | ||
* @param {string} id | ||
* @returns {any} | ||
*/ | ||
builtCluster(id: number): any; | ||
builtCluster(id: string): any; | ||
/** | ||
@@ -202,33 +229,10 @@ * Previews a formatted citation cluster, in a particular position. | ||
/** | ||
* @returns {any} | ||
* @returns {BibEntries} | ||
*/ | ||
makeBibliography(): any; | ||
makeBibliography(): BibEntries; | ||
/** | ||
* @returns {any} | ||
* @returns {BibliographyMeta} | ||
*/ | ||
bibliographyMeta(): any; | ||
bibliographyMeta(): BibliographyMeta; | ||
/** | ||
* Replaces cluster numberings in one go. | ||
* | ||
* * `mappings` is an `Array<[ ClusterId, ClusterNumber ]>` where `ClusterNumber` | ||
* is, e.g. `{ note: 1 }`, `{ note: [3, 1] }` or `{ inText: 5 }` in the same way a | ||
* Cluster must contain one of those three numberings. | ||
* | ||
* Not every ClusterId must appear in the array, just the ones you wish to renumber. | ||
* | ||
* The library consumer is responsible for ensuring that clusters are well-ordered. Clusters | ||
* are sorted for determining cite positions (ibid, subsequent, etc). If a footnote is | ||
* deleted, you will likely need to shift all cluster numbers after it back by one. | ||
* | ||
* The second note numbering, `{note: [3, 1]}`, is for having multiple clusters in a single | ||
* footnote. This is possible in many editors. The second number acts as a second sorting | ||
* key. | ||
* | ||
* The third note numbering, `{ inText: 5 }`, is for ordering in-text references that appear | ||
* within the body of a document. These will be sorted but won't cause | ||
* `first-reference-note-number` to become available. | ||
* @param {any[]} mappings | ||
*/ | ||
renumberClusters(mappings: any[]): void; | ||
/** | ||
* Specifies which clusters are actually considered to be in the document, and sets their | ||
@@ -272,5 +276,11 @@ * order. You may insert as many clusters as you like, but the ones provided here are the only | ||
/** | ||
* Drains the `batchedUpdates` queue manually. Use it to avoid serializing an unneeded | ||
* `UpdateSummary`. | ||
* Returns all the clusters and bibliography entries in the document. | ||
* Also drains the queue, just like batchedUpdates(). | ||
* Use this to rehydrate a document or run non-interactively. | ||
* @returns {FullRender} | ||
*/ | ||
fullRender(): FullRender; | ||
/** | ||
* Drains the `batchedUpdates` queue manually. | ||
*/ | ||
drain(): void; | ||
@@ -277,0 +287,0 @@ /** |
@@ -6,2 +6,18 @@ let imports = {}; | ||
let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); | ||
cachedTextDecoder.decode(); | ||
let cachegetUint8Memory0 = null; | ||
function getUint8Memory0() { | ||
if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== wasm.memory.buffer) { | ||
cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer); | ||
} | ||
return cachegetUint8Memory0; | ||
} | ||
function getStringFromWasm0(ptr, len) { | ||
return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); | ||
} | ||
const heap = new Array(32).fill(undefined); | ||
@@ -11,18 +27,15 @@ | ||
function getObject(idx) { return heap[idx]; } | ||
let heap_next = heap.length; | ||
function dropObject(idx) { | ||
if (idx < 36) return; | ||
heap[idx] = heap_next; | ||
heap_next = idx; | ||
} | ||
function addHeapObject(obj) { | ||
if (heap_next === heap.length) heap.push(heap.length + 1); | ||
const idx = heap_next; | ||
heap_next = heap[idx]; | ||
function takeObject(idx) { | ||
const ret = getObject(idx); | ||
dropObject(idx); | ||
return ret; | ||
heap[idx] = obj; | ||
return idx; | ||
} | ||
function getObject(idx) { return heap[idx]; } | ||
let WASM_VECTOR_LEN = 0; | ||
@@ -55,27 +68,14 @@ | ||
function addHeapObject(obj) { | ||
if (heap_next === heap.length) heap.push(heap.length + 1); | ||
const idx = heap_next; | ||
heap_next = heap[idx]; | ||
heap[idx] = obj; | ||
return idx; | ||
function dropObject(idx) { | ||
if (idx < 36) return; | ||
heap[idx] = heap_next; | ||
heap_next = idx; | ||
} | ||
let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); | ||
cachedTextDecoder.decode(); | ||
let cachegetUint8Memory0 = null; | ||
function getUint8Memory0() { | ||
if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== wasm.memory.buffer) { | ||
cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer); | ||
} | ||
return cachegetUint8Memory0; | ||
function takeObject(idx) { | ||
const ret = getObject(idx); | ||
dropObject(idx); | ||
return ret; | ||
} | ||
function getStringFromWasm0(ptr, len) { | ||
return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); | ||
} | ||
function isLikeNone(x) { | ||
@@ -109,4 +109,4 @@ return x === undefined || x === null; | ||
} | ||
function __wbg_adapter_18(arg0, arg1, arg2) { | ||
wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__hf77188239a1f71cd(arg0, arg1, addHeapObject(arg2)); | ||
function __wbg_adapter_20(arg0, arg1, arg2) { | ||
wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h4175376ea831a3e3(arg0, arg1, addHeapObject(arg2)); | ||
} | ||
@@ -142,6 +142,9 @@ | ||
} | ||
function __wbg_adapter_63(arg0, arg1, arg2, arg3) { | ||
wasm.wasm_bindgen__convert__closures__invoke2_mut__h19f62226ce422262(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3)); | ||
function __wbg_adapter_66(arg0, arg1, arg2, arg3) { | ||
wasm.wasm_bindgen__convert__closures__invoke2_mut__ha2c68a4bd40762fc(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3)); | ||
} | ||
function getArrayU8FromWasm0(ptr, len) { | ||
return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len); | ||
} | ||
/** | ||
@@ -188,3 +191,2 @@ */ | ||
* @param {string} style_text | ||
* @returns {any} | ||
*/ | ||
@@ -194,4 +196,3 @@ setStyle(style_text) { | ||
var len0 = WASM_VECTOR_LEN; | ||
var ret = wasm.driver_setStyle(this.ptr, ptr0, len0); | ||
return takeObject(ret); | ||
wasm.driver_setStyle(this.ptr, ptr0, len0); | ||
} | ||
@@ -257,14 +258,33 @@ /** | ||
/** | ||
* Returns a random cluster id, with an extra guarantee that it isn't already in use. | ||
* @returns {string} | ||
*/ | ||
randomClusterId() { | ||
try { | ||
const retptr = wasm.__wbindgen_export_4.value - 16; | ||
wasm.__wbindgen_export_4.value = retptr; | ||
wasm.driver_randomClusterId(retptr, this.ptr); | ||
var r0 = getInt32Memory0()[retptr / 4 + 0]; | ||
var r1 = getInt32Memory0()[retptr / 4 + 1]; | ||
return getStringFromWasm0(r0, r1); | ||
} finally { | ||
wasm.__wbindgen_export_4.value += 16; | ||
wasm.__wbindgen_free(r0, r1); | ||
} | ||
} | ||
/** | ||
* Inserts or replaces a cluster with a matching `id`. | ||
* @param {any} cluster_id | ||
* @param {any} cluster | ||
*/ | ||
insertCluster(cluster_id) { | ||
wasm.driver_insertCluster(this.ptr, addHeapObject(cluster_id)); | ||
insertCluster(cluster) { | ||
wasm.driver_insertCluster(this.ptr, addHeapObject(cluster)); | ||
} | ||
/** | ||
* Removes a cluster with a matching `id` | ||
* @param {number} cluster_id | ||
* @param {string} cluster_id | ||
*/ | ||
removeCluster(cluster_id) { | ||
wasm.driver_removeCluster(this.ptr, cluster_id); | ||
var ptr0 = passStringToWasm0(cluster_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); | ||
var len0 = WASM_VECTOR_LEN; | ||
wasm.driver_removeCluster(this.ptr, ptr0, len0); | ||
} | ||
@@ -287,7 +307,9 @@ /** | ||
* still useful for initialization. | ||
* @param {number} id | ||
* @param {string} id | ||
* @returns {any} | ||
*/ | ||
builtCluster(id) { | ||
var ret = wasm.driver_builtCluster(this.ptr, id); | ||
var ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); | ||
var len0 = WASM_VECTOR_LEN; | ||
var ret = wasm.driver_builtCluster(this.ptr, ptr0, len0); | ||
return takeObject(ret); | ||
@@ -319,3 +341,3 @@ } | ||
/** | ||
* @returns {any} | ||
* @returns {BibEntries} | ||
*/ | ||
@@ -327,3 +349,3 @@ makeBibliography() { | ||
/** | ||
* @returns {any} | ||
* @returns {BibliographyMeta} | ||
*/ | ||
@@ -335,29 +357,2 @@ bibliographyMeta() { | ||
/** | ||
* Replaces cluster numberings in one go. | ||
* | ||
* * `mappings` is an `Array<[ ClusterId, ClusterNumber ]>` where `ClusterNumber` | ||
* is, e.g. `{ note: 1 }`, `{ note: [3, 1] }` or `{ inText: 5 }` in the same way a | ||
* Cluster must contain one of those three numberings. | ||
* | ||
* Not every ClusterId must appear in the array, just the ones you wish to renumber. | ||
* | ||
* The library consumer is responsible for ensuring that clusters are well-ordered. Clusters | ||
* are sorted for determining cite positions (ibid, subsequent, etc). If a footnote is | ||
* deleted, you will likely need to shift all cluster numbers after it back by one. | ||
* | ||
* The second note numbering, `{note: [3, 1]}`, is for having multiple clusters in a single | ||
* footnote. This is possible in many editors. The second number acts as a second sorting | ||
* key. | ||
* | ||
* The third note numbering, `{ inText: 5 }`, is for ordering in-text references that appear | ||
* within the body of a document. These will be sorted but won't cause | ||
* `first-reference-note-number` to become available. | ||
* @param {any[]} mappings | ||
*/ | ||
renumberClusters(mappings) { | ||
var ptr0 = passArrayJsValueToWasm0(mappings, wasm.__wbindgen_malloc); | ||
var len0 = WASM_VECTOR_LEN; | ||
wasm.driver_renumberClusters(this.ptr, ptr0, len0); | ||
} | ||
/** | ||
* Specifies which clusters are actually considered to be in the document, and sets their | ||
@@ -408,5 +403,14 @@ * order. You may insert as many clusters as you like, but the ones provided here are the only | ||
/** | ||
* Drains the `batchedUpdates` queue manually. Use it to avoid serializing an unneeded | ||
* `UpdateSummary`. | ||
* Returns all the clusters and bibliography entries in the document. | ||
* Also drains the queue, just like batchedUpdates(). | ||
* Use this to rehydrate a document or run non-interactively. | ||
* @returns {FullRender} | ||
*/ | ||
fullRender() { | ||
var ret = wasm.driver_fullRender(this.ptr); | ||
return takeObject(ret); | ||
} | ||
/** | ||
* Drains the `batchedUpdates` queue manually. | ||
*/ | ||
drain() { | ||
@@ -427,4 +431,5 @@ wasm.driver_drain(this.ptr); | ||
module.exports.__wbindgen_object_drop_ref = function(arg0) { | ||
takeObject(arg0); | ||
module.exports.__wbindgen_json_parse = function(arg0, arg1) { | ||
var ret = JSON.parse(getStringFromWasm0(arg0, arg1)); | ||
return addHeapObject(ret); | ||
}; | ||
@@ -441,2 +446,10 @@ | ||
module.exports.__wbindgen_object_drop_ref = function(arg0) { | ||
takeObject(arg0); | ||
}; | ||
module.exports.__wbg_error_e549f7fed6d655aa = function(arg0) { | ||
console.error(takeObject(arg0)); | ||
}; | ||
module.exports.__wbindgen_object_clone_ref = function(arg0) { | ||
@@ -452,4 +465,10 @@ var ret = getObject(arg0); | ||
module.exports.__wbg_error_e549f7fed6d655aa = function(arg0) { | ||
console.error(takeObject(arg0)); | ||
module.exports.__wbindgen_cb_drop = function(arg0) { | ||
const obj = takeObject(arg0).original; | ||
if (obj.cnt-- == 1) { | ||
obj.a = 0; | ||
return true; | ||
} | ||
var ret = false; | ||
return ret; | ||
}; | ||
@@ -477,17 +496,2 @@ | ||
module.exports.__wbindgen_json_parse = function(arg0, arg1) { | ||
var ret = JSON.parse(getStringFromWasm0(arg0, arg1)); | ||
return addHeapObject(ret); | ||
}; | ||
module.exports.__wbindgen_cb_drop = function(arg0) { | ||
const obj = takeObject(arg0).original; | ||
if (obj.cnt-- == 1) { | ||
obj.a = 0; | ||
return true; | ||
} | ||
var ret = false; | ||
return ret; | ||
}; | ||
module.exports.__wbg_new_59cb74e423758ede = function() { | ||
@@ -514,3 +518,3 @@ var ret = new Error(); | ||
module.exports.__wbg_new_4896ab6bba55e0d9 = function(arg0, arg1) { | ||
module.exports.__wbg_new_1192d65414040ad9 = function(arg0, arg1) { | ||
var ret = new Error(getStringFromWasm0(arg0, arg1)); | ||
@@ -520,3 +524,3 @@ return addHeapObject(ret); | ||
module.exports.__wbg_call_0dad7db75ec90ae7 = handleError(function(arg0, arg1, arg2) { | ||
module.exports.__wbg_call_d713ea0274dfc6d2 = handleError(function(arg0, arg1, arg2) { | ||
var ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); | ||
@@ -526,3 +530,3 @@ return addHeapObject(ret); | ||
module.exports.__wbg_new_7039bf8b99f049e1 = function(arg0, arg1) { | ||
module.exports.__wbg_new_d0c63652ab4d825c = function(arg0, arg1) { | ||
try { | ||
@@ -534,3 +538,3 @@ var state0 = {a: arg0, b: arg1}; | ||
try { | ||
return __wbg_adapter_63(a, state0.b, arg0, arg1); | ||
return __wbg_adapter_66(a, state0.b, arg0, arg1); | ||
} finally { | ||
@@ -547,3 +551,3 @@ state0.a = a; | ||
module.exports.__wbg_resolve_4df26938859b92e3 = function(arg0) { | ||
module.exports.__wbg_resolve_2529512c3bb73938 = function(arg0) { | ||
var ret = Promise.resolve(getObject(arg0)); | ||
@@ -553,3 +557,3 @@ return addHeapObject(ret); | ||
module.exports.__wbg_then_ffb6e71f7a6735ad = function(arg0, arg1) { | ||
module.exports.__wbg_then_4a7a614abbbe6d81 = function(arg0, arg1) { | ||
var ret = getObject(arg0).then(getObject(arg1)); | ||
@@ -559,3 +563,3 @@ return addHeapObject(ret); | ||
module.exports.__wbg_then_021fcdc7f0350b58 = function(arg0, arg1, arg2) { | ||
module.exports.__wbg_then_3b7ac098cfda2fa5 = function(arg0, arg1, arg2) { | ||
var ret = getObject(arg0).then(getObject(arg1), getObject(arg2)); | ||
@@ -565,2 +569,45 @@ return addHeapObject(ret); | ||
module.exports.__wbindgen_is_undefined = function(arg0) { | ||
var ret = getObject(arg0) === undefined; | ||
return ret; | ||
}; | ||
module.exports.__wbg_getRandomValues_3ac1b33c90b52596 = function(arg0, arg1, arg2) { | ||
getObject(arg0).getRandomValues(getArrayU8FromWasm0(arg1, arg2)); | ||
}; | ||
module.exports.__wbg_randomFillSync_6f956029658662ec = function(arg0, arg1, arg2) { | ||
getObject(arg0).randomFillSync(getArrayU8FromWasm0(arg1, arg2)); | ||
}; | ||
module.exports.__wbg_self_1c83eb4471d9eb9b = handleError(function() { | ||
var ret = self.self; | ||
return addHeapObject(ret); | ||
}); | ||
module.exports.__wbg_static_accessor_MODULE_abf5ae284bffdf45 = function() { | ||
var ret = module; | ||
return addHeapObject(ret); | ||
}; | ||
module.exports.__wbg_require_5b2b5b594d809d9f = function(arg0, arg1, arg2) { | ||
var ret = getObject(arg0).require(getStringFromWasm0(arg1, arg2)); | ||
return addHeapObject(ret); | ||
}; | ||
module.exports.__wbg_crypto_c12f14e810edcaa2 = function(arg0) { | ||
var ret = getObject(arg0).crypto; | ||
return addHeapObject(ret); | ||
}; | ||
module.exports.__wbg_msCrypto_679be765111ba775 = function(arg0) { | ||
var ret = getObject(arg0).msCrypto; | ||
return addHeapObject(ret); | ||
}; | ||
module.exports.__wbg_getRandomValues_05a60bf171bfc2be = function(arg0) { | ||
var ret = getObject(arg0).getRandomValues; | ||
return addHeapObject(ret); | ||
}; | ||
module.exports.__wbindgen_string_get = function(arg0, arg1) { | ||
@@ -583,4 +630,4 @@ const obj = getObject(arg1); | ||
module.exports.__wbindgen_closure_wrapper839 = function(arg0, arg1, arg2) { | ||
var ret = makeMutClosure(arg0, arg1, 197, __wbg_adapter_18); | ||
module.exports.__wbindgen_closure_wrapper867 = function(arg0, arg1, arg2) { | ||
var ret = makeMutClosure(arg0, arg1, 197, __wbg_adapter_20); | ||
return addHeapObject(ret); | ||
@@ -587,0 +634,0 @@ }; |
import * as wasm from './citeproc_rs_wasm_bg.wasm'; | ||
const lTextDecoder = typeof TextDecoder === 'undefined' ? (0, module.require)('util').TextDecoder : TextDecoder; | ||
let cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true }); | ||
cachedTextDecoder.decode(); | ||
let cachegetUint8Memory0 = null; | ||
function getUint8Memory0() { | ||
if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== wasm.memory.buffer) { | ||
cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer); | ||
} | ||
return cachegetUint8Memory0; | ||
} | ||
function getStringFromWasm0(ptr, len) { | ||
return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); | ||
} | ||
const heap = new Array(32).fill(undefined); | ||
@@ -7,28 +25,17 @@ | ||
function getObject(idx) { return heap[idx]; } | ||
let heap_next = heap.length; | ||
function dropObject(idx) { | ||
if (idx < 36) return; | ||
heap[idx] = heap_next; | ||
heap_next = idx; | ||
} | ||
function addHeapObject(obj) { | ||
if (heap_next === heap.length) heap.push(heap.length + 1); | ||
const idx = heap_next; | ||
heap_next = heap[idx]; | ||
function takeObject(idx) { | ||
const ret = getObject(idx); | ||
dropObject(idx); | ||
return ret; | ||
heap[idx] = obj; | ||
return idx; | ||
} | ||
function getObject(idx) { return heap[idx]; } | ||
let WASM_VECTOR_LEN = 0; | ||
let cachegetUint8Memory0 = null; | ||
function getUint8Memory0() { | ||
if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== wasm.memory.buffer) { | ||
cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer); | ||
} | ||
return cachegetUint8Memory0; | ||
} | ||
const lTextEncoder = typeof TextEncoder === 'undefined' ? (0, module.require)('util').TextEncoder : TextEncoder; | ||
@@ -97,19 +104,12 @@ | ||
function addHeapObject(obj) { | ||
if (heap_next === heap.length) heap.push(heap.length + 1); | ||
const idx = heap_next; | ||
heap_next = heap[idx]; | ||
heap[idx] = obj; | ||
return idx; | ||
function dropObject(idx) { | ||
if (idx < 36) return; | ||
heap[idx] = heap_next; | ||
heap_next = idx; | ||
} | ||
const lTextDecoder = typeof TextDecoder === 'undefined' ? (0, module.require)('util').TextDecoder : TextDecoder; | ||
let cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true }); | ||
cachedTextDecoder.decode(); | ||
function getStringFromWasm0(ptr, len) { | ||
return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); | ||
function takeObject(idx) { | ||
const ret = getObject(idx); | ||
dropObject(idx); | ||
return ret; | ||
} | ||
@@ -145,4 +145,4 @@ | ||
} | ||
function __wbg_adapter_18(arg0, arg1, arg2) { | ||
wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__hf77188239a1f71cd(arg0, arg1, addHeapObject(arg2)); | ||
function __wbg_adapter_20(arg0, arg1, arg2) { | ||
wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h4175376ea831a3e3(arg0, arg1, addHeapObject(arg2)); | ||
} | ||
@@ -178,6 +178,9 @@ | ||
} | ||
function __wbg_adapter_63(arg0, arg1, arg2, arg3) { | ||
wasm.wasm_bindgen__convert__closures__invoke2_mut__h19f62226ce422262(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3)); | ||
function __wbg_adapter_66(arg0, arg1, arg2, arg3) { | ||
wasm.wasm_bindgen__convert__closures__invoke2_mut__ha2c68a4bd40762fc(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3)); | ||
} | ||
function getArrayU8FromWasm0(ptr, len) { | ||
return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len); | ||
} | ||
/** | ||
@@ -224,3 +227,2 @@ */ | ||
* @param {string} style_text | ||
* @returns {any} | ||
*/ | ||
@@ -230,4 +232,3 @@ setStyle(style_text) { | ||
var len0 = WASM_VECTOR_LEN; | ||
var ret = wasm.driver_setStyle(this.ptr, ptr0, len0); | ||
return takeObject(ret); | ||
wasm.driver_setStyle(this.ptr, ptr0, len0); | ||
} | ||
@@ -293,14 +294,33 @@ /** | ||
/** | ||
* Returns a random cluster id, with an extra guarantee that it isn't already in use. | ||
* @returns {string} | ||
*/ | ||
randomClusterId() { | ||
try { | ||
const retptr = wasm.__wbindgen_export_4.value - 16; | ||
wasm.__wbindgen_export_4.value = retptr; | ||
wasm.driver_randomClusterId(retptr, this.ptr); | ||
var r0 = getInt32Memory0()[retptr / 4 + 0]; | ||
var r1 = getInt32Memory0()[retptr / 4 + 1]; | ||
return getStringFromWasm0(r0, r1); | ||
} finally { | ||
wasm.__wbindgen_export_4.value += 16; | ||
wasm.__wbindgen_free(r0, r1); | ||
} | ||
} | ||
/** | ||
* Inserts or replaces a cluster with a matching `id`. | ||
* @param {any} cluster_id | ||
* @param {any} cluster | ||
*/ | ||
insertCluster(cluster_id) { | ||
wasm.driver_insertCluster(this.ptr, addHeapObject(cluster_id)); | ||
insertCluster(cluster) { | ||
wasm.driver_insertCluster(this.ptr, addHeapObject(cluster)); | ||
} | ||
/** | ||
* Removes a cluster with a matching `id` | ||
* @param {number} cluster_id | ||
* @param {string} cluster_id | ||
*/ | ||
removeCluster(cluster_id) { | ||
wasm.driver_removeCluster(this.ptr, cluster_id); | ||
var ptr0 = passStringToWasm0(cluster_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); | ||
var len0 = WASM_VECTOR_LEN; | ||
wasm.driver_removeCluster(this.ptr, ptr0, len0); | ||
} | ||
@@ -323,7 +343,9 @@ /** | ||
* still useful for initialization. | ||
* @param {number} id | ||
* @param {string} id | ||
* @returns {any} | ||
*/ | ||
builtCluster(id) { | ||
var ret = wasm.driver_builtCluster(this.ptr, id); | ||
var ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); | ||
var len0 = WASM_VECTOR_LEN; | ||
var ret = wasm.driver_builtCluster(this.ptr, ptr0, len0); | ||
return takeObject(ret); | ||
@@ -355,3 +377,3 @@ } | ||
/** | ||
* @returns {any} | ||
* @returns {BibEntries} | ||
*/ | ||
@@ -363,3 +385,3 @@ makeBibliography() { | ||
/** | ||
* @returns {any} | ||
* @returns {BibliographyMeta} | ||
*/ | ||
@@ -371,29 +393,2 @@ bibliographyMeta() { | ||
/** | ||
* Replaces cluster numberings in one go. | ||
* | ||
* * `mappings` is an `Array<[ ClusterId, ClusterNumber ]>` where `ClusterNumber` | ||
* is, e.g. `{ note: 1 }`, `{ note: [3, 1] }` or `{ inText: 5 }` in the same way a | ||
* Cluster must contain one of those three numberings. | ||
* | ||
* Not every ClusterId must appear in the array, just the ones you wish to renumber. | ||
* | ||
* The library consumer is responsible for ensuring that clusters are well-ordered. Clusters | ||
* are sorted for determining cite positions (ibid, subsequent, etc). If a footnote is | ||
* deleted, you will likely need to shift all cluster numbers after it back by one. | ||
* | ||
* The second note numbering, `{note: [3, 1]}`, is for having multiple clusters in a single | ||
* footnote. This is possible in many editors. The second number acts as a second sorting | ||
* key. | ||
* | ||
* The third note numbering, `{ inText: 5 }`, is for ordering in-text references that appear | ||
* within the body of a document. These will be sorted but won't cause | ||
* `first-reference-note-number` to become available. | ||
* @param {any[]} mappings | ||
*/ | ||
renumberClusters(mappings) { | ||
var ptr0 = passArrayJsValueToWasm0(mappings, wasm.__wbindgen_malloc); | ||
var len0 = WASM_VECTOR_LEN; | ||
wasm.driver_renumberClusters(this.ptr, ptr0, len0); | ||
} | ||
/** | ||
* Specifies which clusters are actually considered to be in the document, and sets their | ||
@@ -444,5 +439,14 @@ * order. You may insert as many clusters as you like, but the ones provided here are the only | ||
/** | ||
* Drains the `batchedUpdates` queue manually. Use it to avoid serializing an unneeded | ||
* `UpdateSummary`. | ||
* Returns all the clusters and bibliography entries in the document. | ||
* Also drains the queue, just like batchedUpdates(). | ||
* Use this to rehydrate a document or run non-interactively. | ||
* @returns {FullRender} | ||
*/ | ||
fullRender() { | ||
var ret = wasm.driver_fullRender(this.ptr); | ||
return takeObject(ret); | ||
} | ||
/** | ||
* Drains the `batchedUpdates` queue manually. | ||
*/ | ||
drain() { | ||
@@ -462,4 +466,5 @@ wasm.driver_drain(this.ptr); | ||
export const __wbindgen_object_drop_ref = function(arg0) { | ||
takeObject(arg0); | ||
export const __wbindgen_json_parse = function(arg0, arg1) { | ||
var ret = JSON.parse(getStringFromWasm0(arg0, arg1)); | ||
return addHeapObject(ret); | ||
}; | ||
@@ -476,2 +481,10 @@ | ||
export const __wbindgen_object_drop_ref = function(arg0) { | ||
takeObject(arg0); | ||
}; | ||
export const __wbg_error_e549f7fed6d655aa = function(arg0) { | ||
console.error(takeObject(arg0)); | ||
}; | ||
export const __wbindgen_object_clone_ref = function(arg0) { | ||
@@ -487,4 +500,10 @@ var ret = getObject(arg0); | ||
export const __wbg_error_e549f7fed6d655aa = function(arg0) { | ||
console.error(takeObject(arg0)); | ||
export const __wbindgen_cb_drop = function(arg0) { | ||
const obj = takeObject(arg0).original; | ||
if (obj.cnt-- == 1) { | ||
obj.a = 0; | ||
return true; | ||
} | ||
var ret = false; | ||
return ret; | ||
}; | ||
@@ -512,17 +531,2 @@ | ||
export const __wbindgen_json_parse = function(arg0, arg1) { | ||
var ret = JSON.parse(getStringFromWasm0(arg0, arg1)); | ||
return addHeapObject(ret); | ||
}; | ||
export const __wbindgen_cb_drop = function(arg0) { | ||
const obj = takeObject(arg0).original; | ||
if (obj.cnt-- == 1) { | ||
obj.a = 0; | ||
return true; | ||
} | ||
var ret = false; | ||
return ret; | ||
}; | ||
export const __wbg_new_59cb74e423758ede = function() { | ||
@@ -549,3 +553,3 @@ var ret = new Error(); | ||
export const __wbg_new_4896ab6bba55e0d9 = function(arg0, arg1) { | ||
export const __wbg_new_1192d65414040ad9 = function(arg0, arg1) { | ||
var ret = new Error(getStringFromWasm0(arg0, arg1)); | ||
@@ -555,3 +559,3 @@ return addHeapObject(ret); | ||
export const __wbg_call_0dad7db75ec90ae7 = handleError(function(arg0, arg1, arg2) { | ||
export const __wbg_call_d713ea0274dfc6d2 = handleError(function(arg0, arg1, arg2) { | ||
var ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); | ||
@@ -561,3 +565,3 @@ return addHeapObject(ret); | ||
export const __wbg_new_7039bf8b99f049e1 = function(arg0, arg1) { | ||
export const __wbg_new_d0c63652ab4d825c = function(arg0, arg1) { | ||
try { | ||
@@ -569,3 +573,3 @@ var state0 = {a: arg0, b: arg1}; | ||
try { | ||
return __wbg_adapter_63(a, state0.b, arg0, arg1); | ||
return __wbg_adapter_66(a, state0.b, arg0, arg1); | ||
} finally { | ||
@@ -582,3 +586,3 @@ state0.a = a; | ||
export const __wbg_resolve_4df26938859b92e3 = function(arg0) { | ||
export const __wbg_resolve_2529512c3bb73938 = function(arg0) { | ||
var ret = Promise.resolve(getObject(arg0)); | ||
@@ -588,3 +592,3 @@ return addHeapObject(ret); | ||
export const __wbg_then_ffb6e71f7a6735ad = function(arg0, arg1) { | ||
export const __wbg_then_4a7a614abbbe6d81 = function(arg0, arg1) { | ||
var ret = getObject(arg0).then(getObject(arg1)); | ||
@@ -594,3 +598,3 @@ return addHeapObject(ret); | ||
export const __wbg_then_021fcdc7f0350b58 = function(arg0, arg1, arg2) { | ||
export const __wbg_then_3b7ac098cfda2fa5 = function(arg0, arg1, arg2) { | ||
var ret = getObject(arg0).then(getObject(arg1), getObject(arg2)); | ||
@@ -600,2 +604,45 @@ return addHeapObject(ret); | ||
export const __wbindgen_is_undefined = function(arg0) { | ||
var ret = getObject(arg0) === undefined; | ||
return ret; | ||
}; | ||
export const __wbg_getRandomValues_3ac1b33c90b52596 = function(arg0, arg1, arg2) { | ||
getObject(arg0).getRandomValues(getArrayU8FromWasm0(arg1, arg2)); | ||
}; | ||
export const __wbg_randomFillSync_6f956029658662ec = function(arg0, arg1, arg2) { | ||
getObject(arg0).randomFillSync(getArrayU8FromWasm0(arg1, arg2)); | ||
}; | ||
export const __wbg_self_1c83eb4471d9eb9b = handleError(function() { | ||
var ret = self.self; | ||
return addHeapObject(ret); | ||
}); | ||
export const __wbg_static_accessor_MODULE_abf5ae284bffdf45 = function() { | ||
var ret = module; | ||
return addHeapObject(ret); | ||
}; | ||
export const __wbg_require_5b2b5b594d809d9f = function(arg0, arg1, arg2) { | ||
var ret = getObject(arg0).require(getStringFromWasm0(arg1, arg2)); | ||
return addHeapObject(ret); | ||
}; | ||
export const __wbg_crypto_c12f14e810edcaa2 = function(arg0) { | ||
var ret = getObject(arg0).crypto; | ||
return addHeapObject(ret); | ||
}; | ||
export const __wbg_msCrypto_679be765111ba775 = function(arg0) { | ||
var ret = getObject(arg0).msCrypto; | ||
return addHeapObject(ret); | ||
}; | ||
export const __wbg_getRandomValues_05a60bf171bfc2be = function(arg0) { | ||
var ret = getObject(arg0).getRandomValues; | ||
return addHeapObject(ret); | ||
}; | ||
export const __wbindgen_string_get = function(arg0, arg1) { | ||
@@ -618,6 +665,6 @@ const obj = getObject(arg1); | ||
export const __wbindgen_closure_wrapper839 = function(arg0, arg1, arg2) { | ||
var ret = makeMutClosure(arg0, arg1, 197, __wbg_adapter_18); | ||
export const __wbindgen_closure_wrapper867 = function(arg0, arg1, arg2) { | ||
var ret = makeMutClosure(arg0, arg1, 197, __wbg_adapter_20); | ||
return addHeapObject(ret); | ||
}; | ||
@@ -43,3 +43,3 @@ /* tslint:disable */ | ||
export type Cluster = { | ||
id: number; | ||
id: string; | ||
cites: Cite[]; | ||
@@ -49,3 +49,3 @@ }; | ||
export type ClusterPosition = { | ||
id: number; | ||
id: string; | ||
/** Leaving off this field means this cluster is in-text. */ | ||
@@ -69,3 +69,3 @@ note?: number; | ||
export type UpdateSummary<Output = string> = { | ||
clusters: [number, Output][]; | ||
clusters: [string, Output][]; | ||
bibliography?: BibliographyUpdate; | ||
@@ -93,3 +93,26 @@ }; | ||
type BibEntry = { | ||
id: string; | ||
value: string; | ||
}; | ||
type BibEntries = BibEntry[]; | ||
type FullRender = { | ||
allClusters: { [clusterId: string]: string }, | ||
bibEntries: BibEntries, | ||
}; | ||
type BibliographyMeta = { | ||
max_offset: number; | ||
entry_spacing: number; | ||
line_spacing: number; | ||
hanging_indent: boolean; | ||
/** the second-field-align value of the CSL style */ | ||
secondFieldAlign: null | "flush" | "margin"; | ||
/** Format-specific metadata */ | ||
formatMeta: any, | ||
}; | ||
/** | ||
@@ -116,5 +139,4 @@ */ | ||
* @param {string} style_text | ||
* @returns {any} | ||
*/ | ||
setStyle(style_text: string): any; | ||
setStyle(style_text: string): void; | ||
/** | ||
@@ -160,11 +182,16 @@ * Completely overwrites the references library. | ||
/** | ||
* Returns a random cluster id, with an extra guarantee that it isn't already in use. | ||
* @returns {string} | ||
*/ | ||
randomClusterId(): string; | ||
/** | ||
* Inserts or replaces a cluster with a matching `id`. | ||
* @param {any} cluster_id | ||
* @param {any} cluster | ||
*/ | ||
insertCluster(cluster_id: any): void; | ||
insertCluster(cluster: any): void; | ||
/** | ||
* Removes a cluster with a matching `id` | ||
* @param {number} cluster_id | ||
* @param {string} cluster_id | ||
*/ | ||
removeCluster(cluster_id: number): void; | ||
removeCluster(cluster_id: string): void; | ||
/** | ||
@@ -182,6 +209,6 @@ * Resets all the clusters in the processor to a new list. | ||
* still useful for initialization. | ||
* @param {number} id | ||
* @param {string} id | ||
* @returns {any} | ||
*/ | ||
builtCluster(id: number): any; | ||
builtCluster(id: string): any; | ||
/** | ||
@@ -202,33 +229,10 @@ * Previews a formatted citation cluster, in a particular position. | ||
/** | ||
* @returns {any} | ||
* @returns {BibEntries} | ||
*/ | ||
makeBibliography(): any; | ||
makeBibliography(): BibEntries; | ||
/** | ||
* @returns {any} | ||
* @returns {BibliographyMeta} | ||
*/ | ||
bibliographyMeta(): any; | ||
bibliographyMeta(): BibliographyMeta; | ||
/** | ||
* Replaces cluster numberings in one go. | ||
* | ||
* * `mappings` is an `Array<[ ClusterId, ClusterNumber ]>` where `ClusterNumber` | ||
* is, e.g. `{ note: 1 }`, `{ note: [3, 1] }` or `{ inText: 5 }` in the same way a | ||
* Cluster must contain one of those three numberings. | ||
* | ||
* Not every ClusterId must appear in the array, just the ones you wish to renumber. | ||
* | ||
* The library consumer is responsible for ensuring that clusters are well-ordered. Clusters | ||
* are sorted for determining cite positions (ibid, subsequent, etc). If a footnote is | ||
* deleted, you will likely need to shift all cluster numbers after it back by one. | ||
* | ||
* The second note numbering, `{note: [3, 1]}`, is for having multiple clusters in a single | ||
* footnote. This is possible in many editors. The second number acts as a second sorting | ||
* key. | ||
* | ||
* The third note numbering, `{ inText: 5 }`, is for ordering in-text references that appear | ||
* within the body of a document. These will be sorted but won't cause | ||
* `first-reference-note-number` to become available. | ||
* @param {any[]} mappings | ||
*/ | ||
renumberClusters(mappings: any[]): void; | ||
/** | ||
* Specifies which clusters are actually considered to be in the document, and sets their | ||
@@ -272,5 +276,11 @@ * order. You may insert as many clusters as you like, but the ones provided here are the only | ||
/** | ||
* Drains the `batchedUpdates` queue manually. Use it to avoid serializing an unneeded | ||
* `UpdateSummary`. | ||
* Returns all the clusters and bibliography entries in the document. | ||
* Also drains the queue, just like batchedUpdates(). | ||
* Use this to rehydrate a document or run non-interactively. | ||
* @returns {FullRender} | ||
*/ | ||
fullRender(): FullRender; | ||
/** | ||
* Drains the `batchedUpdates` queue manually. | ||
*/ | ||
drain(): void; | ||
@@ -277,0 +287,0 @@ /** |
@@ -43,3 +43,3 @@ /* tslint:disable */ | ||
export type Cluster = { | ||
id: number; | ||
id: string; | ||
cites: Cite[]; | ||
@@ -49,3 +49,3 @@ }; | ||
export type ClusterPosition = { | ||
id: number; | ||
id: string; | ||
/** Leaving off this field means this cluster is in-text. */ | ||
@@ -69,3 +69,3 @@ note?: number; | ||
export type UpdateSummary<Output = string> = { | ||
clusters: [number, Output][]; | ||
clusters: [string, Output][]; | ||
bibliography?: BibliographyUpdate; | ||
@@ -93,3 +93,26 @@ }; | ||
type BibEntry = { | ||
id: string; | ||
value: string; | ||
}; | ||
type BibEntries = BibEntry[]; | ||
type FullRender = { | ||
allClusters: { [clusterId: string]: string }, | ||
bibEntries: BibEntries, | ||
}; | ||
type BibliographyMeta = { | ||
max_offset: number; | ||
entry_spacing: number; | ||
line_spacing: number; | ||
hanging_indent: boolean; | ||
/** the second-field-align value of the CSL style */ | ||
secondFieldAlign: null | "flush" | "margin"; | ||
/** Format-specific metadata */ | ||
formatMeta: any, | ||
}; | ||
/** | ||
@@ -116,5 +139,4 @@ */ | ||
* @param {string} style_text | ||
* @returns {any} | ||
*/ | ||
setStyle(style_text: string): any; | ||
setStyle(style_text: string): void; | ||
/** | ||
@@ -160,11 +182,16 @@ * Completely overwrites the references library. | ||
/** | ||
* Returns a random cluster id, with an extra guarantee that it isn't already in use. | ||
* @returns {string} | ||
*/ | ||
randomClusterId(): string; | ||
/** | ||
* Inserts or replaces a cluster with a matching `id`. | ||
* @param {any} cluster_id | ||
* @param {any} cluster | ||
*/ | ||
insertCluster(cluster_id: any): void; | ||
insertCluster(cluster: any): void; | ||
/** | ||
* Removes a cluster with a matching `id` | ||
* @param {number} cluster_id | ||
* @param {string} cluster_id | ||
*/ | ||
removeCluster(cluster_id: number): void; | ||
removeCluster(cluster_id: string): void; | ||
/** | ||
@@ -182,6 +209,6 @@ * Resets all the clusters in the processor to a new list. | ||
* still useful for initialization. | ||
* @param {number} id | ||
* @param {string} id | ||
* @returns {any} | ||
*/ | ||
builtCluster(id: number): any; | ||
builtCluster(id: string): any; | ||
/** | ||
@@ -202,33 +229,10 @@ * Previews a formatted citation cluster, in a particular position. | ||
/** | ||
* @returns {any} | ||
* @returns {BibEntries} | ||
*/ | ||
makeBibliography(): any; | ||
makeBibliography(): BibEntries; | ||
/** | ||
* @returns {any} | ||
* @returns {BibliographyMeta} | ||
*/ | ||
bibliographyMeta(): any; | ||
bibliographyMeta(): BibliographyMeta; | ||
/** | ||
* Replaces cluster numberings in one go. | ||
* | ||
* * `mappings` is an `Array<[ ClusterId, ClusterNumber ]>` where `ClusterNumber` | ||
* is, e.g. `{ note: 1 }`, `{ note: [3, 1] }` or `{ inText: 5 }` in the same way a | ||
* Cluster must contain one of those three numberings. | ||
* | ||
* Not every ClusterId must appear in the array, just the ones you wish to renumber. | ||
* | ||
* The library consumer is responsible for ensuring that clusters are well-ordered. Clusters | ||
* are sorted for determining cite positions (ibid, subsequent, etc). If a footnote is | ||
* deleted, you will likely need to shift all cluster numbers after it back by one. | ||
* | ||
* The second note numbering, `{note: [3, 1]}`, is for having multiple clusters in a single | ||
* footnote. This is possible in many editors. The second number acts as a second sorting | ||
* key. | ||
* | ||
* The third note numbering, `{ inText: 5 }`, is for ordering in-text references that appear | ||
* within the body of a document. These will be sorted but won't cause | ||
* `first-reference-note-number` to become available. | ||
* @param {any[]} mappings | ||
*/ | ||
renumberClusters(mappings: any[]): void; | ||
/** | ||
* Specifies which clusters are actually considered to be in the document, and sets their | ||
@@ -272,5 +276,11 @@ * order. You may insert as many clusters as you like, but the ones provided here are the only | ||
/** | ||
* Drains the `batchedUpdates` queue manually. Use it to avoid serializing an unneeded | ||
* `UpdateSummary`. | ||
* Returns all the clusters and bibliography entries in the document. | ||
* Also drains the queue, just like batchedUpdates(). | ||
* Use this to rehydrate a document or run non-interactively. | ||
* @returns {FullRender} | ||
*/ | ||
fullRender(): FullRender; | ||
/** | ||
* Drains the `batchedUpdates` queue manually. | ||
*/ | ||
drain(): void; | ||
@@ -291,3 +301,3 @@ /** | ||
readonly driver_new: (a: number, b: number, c: number, d: number, e: number) => number; | ||
readonly driver_setStyle: (a: number, b: number, c: number) => number; | ||
readonly driver_setStyle: (a: number, b: number, c: number) => void; | ||
readonly driver_resetReferences: (a: number, b: number, c: number) => void; | ||
@@ -299,12 +309,13 @@ readonly driver_insertReferences: (a: number, b: number, c: number) => void; | ||
readonly driver_toFetch: (a: number) => number; | ||
readonly driver_randomClusterId: (a: number, b: number) => void; | ||
readonly driver_insertCluster: (a: number, b: number) => void; | ||
readonly driver_removeCluster: (a: number, b: number) => void; | ||
readonly driver_removeCluster: (a: number, b: number, c: number) => void; | ||
readonly driver_initClusters: (a: number, b: number, c: number) => void; | ||
readonly driver_builtCluster: (a: number, b: number) => number; | ||
readonly driver_builtCluster: (a: number, b: number, c: number) => number; | ||
readonly driver_previewCitationCluster: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => number; | ||
readonly driver_makeBibliography: (a: number) => number; | ||
readonly driver_bibliographyMeta: (a: number) => number; | ||
readonly driver_renumberClusters: (a: number, b: number, c: number) => void; | ||
readonly driver_setClusterOrder: (a: number, b: number, c: number) => void; | ||
readonly driver_batchedUpdates: (a: number) => number; | ||
readonly driver_fullRender: (a: number) => number; | ||
readonly driver_drain: (a: number) => void; | ||
@@ -315,6 +326,6 @@ readonly driver_fetchAll: (a: number) => number; | ||
readonly __wbindgen_export_2: WebAssembly.Table; | ||
readonly _dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__hf77188239a1f71cd: (a: number, b: number, c: number) => void; | ||
readonly _dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h4175376ea831a3e3: (a: number, b: number, c: number) => void; | ||
readonly __wbindgen_free: (a: number, b: number) => void; | ||
readonly __wbindgen_exn_store: (a: number) => void; | ||
readonly wasm_bindgen__convert__closures__invoke2_mut__h19f62226ce422262: (a: number, b: number, c: number, d: number) => void; | ||
readonly wasm_bindgen__convert__closures__invoke2_mut__ha2c68a4bd40762fc: (a: number, b: number, c: number, d: number) => void; | ||
} | ||
@@ -321,0 +332,0 @@ |
let wasm; | ||
let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); | ||
cachedTextDecoder.decode(); | ||
let cachegetUint8Memory0 = null; | ||
function getUint8Memory0() { | ||
if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== wasm.memory.buffer) { | ||
cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer); | ||
} | ||
return cachegetUint8Memory0; | ||
} | ||
function getStringFromWasm0(ptr, len) { | ||
return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); | ||
} | ||
const heap = new Array(32).fill(undefined); | ||
@@ -8,28 +24,17 @@ | ||
function getObject(idx) { return heap[idx]; } | ||
let heap_next = heap.length; | ||
function dropObject(idx) { | ||
if (idx < 36) return; | ||
heap[idx] = heap_next; | ||
heap_next = idx; | ||
} | ||
function addHeapObject(obj) { | ||
if (heap_next === heap.length) heap.push(heap.length + 1); | ||
const idx = heap_next; | ||
heap_next = heap[idx]; | ||
function takeObject(idx) { | ||
const ret = getObject(idx); | ||
dropObject(idx); | ||
return ret; | ||
heap[idx] = obj; | ||
return idx; | ||
} | ||
function getObject(idx) { return heap[idx]; } | ||
let WASM_VECTOR_LEN = 0; | ||
let cachegetUint8Memory0 = null; | ||
function getUint8Memory0() { | ||
if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== wasm.memory.buffer) { | ||
cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer); | ||
} | ||
return cachegetUint8Memory0; | ||
} | ||
let cachedTextEncoder = new TextEncoder('utf-8'); | ||
@@ -96,17 +101,12 @@ | ||
function addHeapObject(obj) { | ||
if (heap_next === heap.length) heap.push(heap.length + 1); | ||
const idx = heap_next; | ||
heap_next = heap[idx]; | ||
heap[idx] = obj; | ||
return idx; | ||
function dropObject(idx) { | ||
if (idx < 36) return; | ||
heap[idx] = heap_next; | ||
heap_next = idx; | ||
} | ||
let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); | ||
cachedTextDecoder.decode(); | ||
function getStringFromWasm0(ptr, len) { | ||
return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); | ||
function takeObject(idx) { | ||
const ret = getObject(idx); | ||
dropObject(idx); | ||
return ret; | ||
} | ||
@@ -142,4 +142,4 @@ | ||
} | ||
function __wbg_adapter_18(arg0, arg1, arg2) { | ||
wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__hf77188239a1f71cd(arg0, arg1, addHeapObject(arg2)); | ||
function __wbg_adapter_20(arg0, arg1, arg2) { | ||
wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h4175376ea831a3e3(arg0, arg1, addHeapObject(arg2)); | ||
} | ||
@@ -175,6 +175,9 @@ | ||
} | ||
function __wbg_adapter_63(arg0, arg1, arg2, arg3) { | ||
wasm.wasm_bindgen__convert__closures__invoke2_mut__h19f62226ce422262(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3)); | ||
function __wbg_adapter_66(arg0, arg1, arg2, arg3) { | ||
wasm.wasm_bindgen__convert__closures__invoke2_mut__ha2c68a4bd40762fc(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3)); | ||
} | ||
function getArrayU8FromWasm0(ptr, len) { | ||
return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len); | ||
} | ||
/** | ||
@@ -221,3 +224,2 @@ */ | ||
* @param {string} style_text | ||
* @returns {any} | ||
*/ | ||
@@ -227,4 +229,3 @@ setStyle(style_text) { | ||
var len0 = WASM_VECTOR_LEN; | ||
var ret = wasm.driver_setStyle(this.ptr, ptr0, len0); | ||
return takeObject(ret); | ||
wasm.driver_setStyle(this.ptr, ptr0, len0); | ||
} | ||
@@ -290,14 +291,33 @@ /** | ||
/** | ||
* Returns a random cluster id, with an extra guarantee that it isn't already in use. | ||
* @returns {string} | ||
*/ | ||
randomClusterId() { | ||
try { | ||
const retptr = wasm.__wbindgen_export_4.value - 16; | ||
wasm.__wbindgen_export_4.value = retptr; | ||
wasm.driver_randomClusterId(retptr, this.ptr); | ||
var r0 = getInt32Memory0()[retptr / 4 + 0]; | ||
var r1 = getInt32Memory0()[retptr / 4 + 1]; | ||
return getStringFromWasm0(r0, r1); | ||
} finally { | ||
wasm.__wbindgen_export_4.value += 16; | ||
wasm.__wbindgen_free(r0, r1); | ||
} | ||
} | ||
/** | ||
* Inserts or replaces a cluster with a matching `id`. | ||
* @param {any} cluster_id | ||
* @param {any} cluster | ||
*/ | ||
insertCluster(cluster_id) { | ||
wasm.driver_insertCluster(this.ptr, addHeapObject(cluster_id)); | ||
insertCluster(cluster) { | ||
wasm.driver_insertCluster(this.ptr, addHeapObject(cluster)); | ||
} | ||
/** | ||
* Removes a cluster with a matching `id` | ||
* @param {number} cluster_id | ||
* @param {string} cluster_id | ||
*/ | ||
removeCluster(cluster_id) { | ||
wasm.driver_removeCluster(this.ptr, cluster_id); | ||
var ptr0 = passStringToWasm0(cluster_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); | ||
var len0 = WASM_VECTOR_LEN; | ||
wasm.driver_removeCluster(this.ptr, ptr0, len0); | ||
} | ||
@@ -320,7 +340,9 @@ /** | ||
* still useful for initialization. | ||
* @param {number} id | ||
* @param {string} id | ||
* @returns {any} | ||
*/ | ||
builtCluster(id) { | ||
var ret = wasm.driver_builtCluster(this.ptr, id); | ||
var ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); | ||
var len0 = WASM_VECTOR_LEN; | ||
var ret = wasm.driver_builtCluster(this.ptr, ptr0, len0); | ||
return takeObject(ret); | ||
@@ -352,3 +374,3 @@ } | ||
/** | ||
* @returns {any} | ||
* @returns {BibEntries} | ||
*/ | ||
@@ -360,3 +382,3 @@ makeBibliography() { | ||
/** | ||
* @returns {any} | ||
* @returns {BibliographyMeta} | ||
*/ | ||
@@ -368,29 +390,2 @@ bibliographyMeta() { | ||
/** | ||
* Replaces cluster numberings in one go. | ||
* | ||
* * `mappings` is an `Array<[ ClusterId, ClusterNumber ]>` where `ClusterNumber` | ||
* is, e.g. `{ note: 1 }`, `{ note: [3, 1] }` or `{ inText: 5 }` in the same way a | ||
* Cluster must contain one of those three numberings. | ||
* | ||
* Not every ClusterId must appear in the array, just the ones you wish to renumber. | ||
* | ||
* The library consumer is responsible for ensuring that clusters are well-ordered. Clusters | ||
* are sorted for determining cite positions (ibid, subsequent, etc). If a footnote is | ||
* deleted, you will likely need to shift all cluster numbers after it back by one. | ||
* | ||
* The second note numbering, `{note: [3, 1]}`, is for having multiple clusters in a single | ||
* footnote. This is possible in many editors. The second number acts as a second sorting | ||
* key. | ||
* | ||
* The third note numbering, `{ inText: 5 }`, is for ordering in-text references that appear | ||
* within the body of a document. These will be sorted but won't cause | ||
* `first-reference-note-number` to become available. | ||
* @param {any[]} mappings | ||
*/ | ||
renumberClusters(mappings) { | ||
var ptr0 = passArrayJsValueToWasm0(mappings, wasm.__wbindgen_malloc); | ||
var len0 = WASM_VECTOR_LEN; | ||
wasm.driver_renumberClusters(this.ptr, ptr0, len0); | ||
} | ||
/** | ||
* Specifies which clusters are actually considered to be in the document, and sets their | ||
@@ -441,5 +436,14 @@ * order. You may insert as many clusters as you like, but the ones provided here are the only | ||
/** | ||
* Drains the `batchedUpdates` queue manually. Use it to avoid serializing an unneeded | ||
* `UpdateSummary`. | ||
* Returns all the clusters and bibliography entries in the document. | ||
* Also drains the queue, just like batchedUpdates(). | ||
* Use this to rehydrate a document or run non-interactively. | ||
* @returns {FullRender} | ||
*/ | ||
fullRender() { | ||
var ret = wasm.driver_fullRender(this.ptr); | ||
return takeObject(ret); | ||
} | ||
/** | ||
* Drains the `batchedUpdates` queue manually. | ||
*/ | ||
drain() { | ||
@@ -498,4 +502,5 @@ wasm.driver_drain(this.ptr); | ||
imports.wbg = {}; | ||
imports.wbg.__wbindgen_object_drop_ref = function(arg0) { | ||
takeObject(arg0); | ||
imports.wbg.__wbindgen_json_parse = function(arg0, arg1) { | ||
var ret = JSON.parse(getStringFromWasm0(arg0, arg1)); | ||
return addHeapObject(ret); | ||
}; | ||
@@ -510,2 +515,8 @@ imports.wbg.__wbindgen_json_serialize = function(arg0, arg1) { | ||
}; | ||
imports.wbg.__wbindgen_object_drop_ref = function(arg0) { | ||
takeObject(arg0); | ||
}; | ||
imports.wbg.__wbg_error_e549f7fed6d655aa = function(arg0) { | ||
console.error(takeObject(arg0)); | ||
}; | ||
imports.wbg.__wbindgen_object_clone_ref = function(arg0) { | ||
@@ -519,4 +530,10 @@ var ret = getObject(arg0); | ||
}; | ||
imports.wbg.__wbg_error_e549f7fed6d655aa = function(arg0) { | ||
console.error(takeObject(arg0)); | ||
imports.wbg.__wbindgen_cb_drop = function(arg0) { | ||
const obj = takeObject(arg0).original; | ||
if (obj.cnt-- == 1) { | ||
obj.a = 0; | ||
return true; | ||
} | ||
var ret = false; | ||
return ret; | ||
}; | ||
@@ -538,15 +555,2 @@ imports.wbg.__wbg_debug_4885c3f7d6f044a3 = function(arg0, arg1) { | ||
}; | ||
imports.wbg.__wbindgen_json_parse = function(arg0, arg1) { | ||
var ret = JSON.parse(getStringFromWasm0(arg0, arg1)); | ||
return addHeapObject(ret); | ||
}; | ||
imports.wbg.__wbindgen_cb_drop = function(arg0) { | ||
const obj = takeObject(arg0).original; | ||
if (obj.cnt-- == 1) { | ||
obj.a = 0; | ||
return true; | ||
} | ||
var ret = false; | ||
return ret; | ||
}; | ||
imports.wbg.__wbg_new_59cb74e423758ede = function() { | ||
@@ -570,11 +574,11 @@ var ret = new Error(); | ||
}; | ||
imports.wbg.__wbg_new_4896ab6bba55e0d9 = function(arg0, arg1) { | ||
imports.wbg.__wbg_new_1192d65414040ad9 = function(arg0, arg1) { | ||
var ret = new Error(getStringFromWasm0(arg0, arg1)); | ||
return addHeapObject(ret); | ||
}; | ||
imports.wbg.__wbg_call_0dad7db75ec90ae7 = handleError(function(arg0, arg1, arg2) { | ||
imports.wbg.__wbg_call_d713ea0274dfc6d2 = handleError(function(arg0, arg1, arg2) { | ||
var ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); | ||
return addHeapObject(ret); | ||
}); | ||
imports.wbg.__wbg_new_7039bf8b99f049e1 = function(arg0, arg1) { | ||
imports.wbg.__wbg_new_d0c63652ab4d825c = function(arg0, arg1) { | ||
try { | ||
@@ -586,3 +590,3 @@ var state0 = {a: arg0, b: arg1}; | ||
try { | ||
return __wbg_adapter_63(a, state0.b, arg0, arg1); | ||
return __wbg_adapter_66(a, state0.b, arg0, arg1); | ||
} finally { | ||
@@ -598,14 +602,48 @@ state0.a = a; | ||
}; | ||
imports.wbg.__wbg_resolve_4df26938859b92e3 = function(arg0) { | ||
imports.wbg.__wbg_resolve_2529512c3bb73938 = function(arg0) { | ||
var ret = Promise.resolve(getObject(arg0)); | ||
return addHeapObject(ret); | ||
}; | ||
imports.wbg.__wbg_then_ffb6e71f7a6735ad = function(arg0, arg1) { | ||
imports.wbg.__wbg_then_4a7a614abbbe6d81 = function(arg0, arg1) { | ||
var ret = getObject(arg0).then(getObject(arg1)); | ||
return addHeapObject(ret); | ||
}; | ||
imports.wbg.__wbg_then_021fcdc7f0350b58 = function(arg0, arg1, arg2) { | ||
imports.wbg.__wbg_then_3b7ac098cfda2fa5 = function(arg0, arg1, arg2) { | ||
var ret = getObject(arg0).then(getObject(arg1), getObject(arg2)); | ||
return addHeapObject(ret); | ||
}; | ||
imports.wbg.__wbindgen_is_undefined = function(arg0) { | ||
var ret = getObject(arg0) === undefined; | ||
return ret; | ||
}; | ||
imports.wbg.__wbg_getRandomValues_3ac1b33c90b52596 = function(arg0, arg1, arg2) { | ||
getObject(arg0).getRandomValues(getArrayU8FromWasm0(arg1, arg2)); | ||
}; | ||
imports.wbg.__wbg_randomFillSync_6f956029658662ec = function(arg0, arg1, arg2) { | ||
getObject(arg0).randomFillSync(getArrayU8FromWasm0(arg1, arg2)); | ||
}; | ||
imports.wbg.__wbg_self_1c83eb4471d9eb9b = handleError(function() { | ||
var ret = self.self; | ||
return addHeapObject(ret); | ||
}); | ||
imports.wbg.__wbg_static_accessor_MODULE_abf5ae284bffdf45 = function() { | ||
var ret = module; | ||
return addHeapObject(ret); | ||
}; | ||
imports.wbg.__wbg_require_5b2b5b594d809d9f = function(arg0, arg1, arg2) { | ||
var ret = getObject(arg0).require(getStringFromWasm0(arg1, arg2)); | ||
return addHeapObject(ret); | ||
}; | ||
imports.wbg.__wbg_crypto_c12f14e810edcaa2 = function(arg0) { | ||
var ret = getObject(arg0).crypto; | ||
return addHeapObject(ret); | ||
}; | ||
imports.wbg.__wbg_msCrypto_679be765111ba775 = function(arg0) { | ||
var ret = getObject(arg0).msCrypto; | ||
return addHeapObject(ret); | ||
}; | ||
imports.wbg.__wbg_getRandomValues_05a60bf171bfc2be = function(arg0) { | ||
var ret = getObject(arg0).getRandomValues; | ||
return addHeapObject(ret); | ||
}; | ||
imports.wbg.__wbindgen_string_get = function(arg0, arg1) { | ||
@@ -625,4 +663,4 @@ const obj = getObject(arg1); | ||
}; | ||
imports.wbg.__wbindgen_closure_wrapper839 = function(arg0, arg1, arg2) { | ||
var ret = makeMutClosure(arg0, arg1, 197, __wbg_adapter_18); | ||
imports.wbg.__wbindgen_closure_wrapper867 = function(arg0, arg1, arg2) { | ||
var ret = makeMutClosure(arg0, arg1, 197, __wbg_adapter_20); | ||
return addHeapObject(ret); | ||
@@ -629,0 +667,0 @@ }; |
@@ -7,3 +7,3 @@ { | ||
"description": "citeproc-rs, compiled to WebAssembly", | ||
"version": "0.0.0-canary-7bb4807", | ||
"version": "0.0.0-canary-88f356a", | ||
"license": "MPL-2.0", | ||
@@ -18,2 +18,3 @@ "repository": { | ||
"_web/*", | ||
"_no_modules/*", | ||
"README.md" | ||
@@ -20,0 +21,0 @@ ], |
421
README.md
# `@citeproc-rs/wasm` | ||
This is a build of `citeproc` that is suitable for use in Node.js, a browser or | ||
a Firefox/Chromium-based application like Zotero. It consists of a WebAssembly | ||
(WASM) binary, and a fairly lightweight JavaScript wrapper for that binary. | ||
This is a front-end to | ||
[`citeproc-rs`](https://github.com/cormacrelf/citeproc-rs), a citation | ||
processor written in Rust and compiled to WebAssembly. | ||
README for newer version of the API forthcoming. | ||
It contains builds appropriate for: | ||
- Node.js | ||
- Browsers, using a bundler like Webpack.js | ||
- Browsers directly importing an ES Module from a webserver | ||
## Installation / Release channels | ||
There are two release channels: | ||
**Stable** is each versioned release. (*At the time of writing, there are no | ||
versioned releases.*) Install with: | ||
```sh | ||
yarn add @citeproc-rs/wasm | ||
``` | ||
**Canary** tracks the master branch [on | ||
GitHub](https://github.com/cormacrelf/citeproc-rs). Its version numbers follow | ||
the format `0.0.0-canary-GIT_COMMIT_SHA`, so version ranges in your | ||
`package.json` are not meaningful. But you can install the latest one with: | ||
```sh | ||
yarn add @citeproc-rs/wasm@canary | ||
# alternatively, a specific commit | ||
yarn add @citeproc-rs/wasm@0.0.0-canary-COMMIT_SHA | ||
``` | ||
If you use NPM, replace `yarn add` with `npm install`. | ||
### Including in your project | ||
For Node.js, simply import the package as normal. Typescript definitions are | ||
provided, though parts of the API that cannot have auto-generated type | ||
definitions are alluded to in doc comments with an accompanying type you can | ||
import. | ||
``` | ||
// Node.js | ||
const { Driver } = require("@citeproc-rs/wasm"); | ||
``` | ||
#### Using Webpack | ||
When loading on the web, for technical reasons and because the compiled | ||
WebAssembly is large, you must load the package asynchronously. Webpack comes | ||
with the ability to import packages asynchronously like so: | ||
```javascript | ||
// Webpack | ||
import("@citeproc-rs/wasm") | ||
.then(go) | ||
.catch(console.error); | ||
function go(wasm) { | ||
const { Driver } = wasm; | ||
// use Driver | ||
} | ||
``` | ||
When you do this, your code will trigger a download (and streaming parse) of | ||
the binary, and when that is complete, your `go` function will be called. The | ||
download can of course be cached if your web server is set up correctly, making | ||
the whole process very quick. | ||
You can use the regular-import Driver as a TypeScript type anywhere, just don't | ||
use it to call `.new()`. | ||
Note the caveats in around Microsoft Edge's TextEncoder/TextDecoder support in | ||
[the wasm-bindgen | ||
tutorial](https://rustwasm.github.io/docs/wasm-bindgen/examples/hello-world.html). | ||
```typescript | ||
import { Driver } from "@citeproc-rs/wasm"; | ||
function doSomethingWithDriver(driver: Driver) { | ||
// ... | ||
} | ||
``` | ||
#### Importing it in a script tag (`web` target) | ||
To directly import it without a bundler in a (modern) web browser with ES | ||
modules support, the procedure is different. You must: | ||
1. Make the `_web` subdirectory of the published NPM package available in a | ||
content directory on your webserver, or use a CDN like [unpkg](unpkg.com). | ||
2. Include a `<script type="module">` tag in your page's `<body>`, like so: | ||
```html | ||
<script type="module"> | ||
import init, { Driver } from './path/to/_web/citeproc_rs_wasm.js'; | ||
async function run() { | ||
await init(); | ||
// use Driver | ||
} | ||
run() | ||
</script> | ||
``` | ||
#### Importing it in a script tag (`no-modules` target) | ||
This replicates the [wasm-bindgen guide | ||
entry](https://rustwasm.github.io/docs/wasm-bindgen/examples/without-a-bundler.html?highlight=no-modules#using-the-older---target-no-modules), | ||
noting the caveats. You will, similarly to the `web` target, need to make the | ||
contents of the `_no_modules` subdirectory of the published NPM package | ||
available on a webserver or via a CDN. | ||
``` | ||
<html> | ||
<head> | ||
<meta content="text/html;charset=utf-8" http-equiv="Content-Type"/> | ||
</head> | ||
<body> | ||
<!-- Include the JS generated by `wasm-pack build` --> | ||
<script src='path/to/@citeproc-rs/wasm/_no_modules/citeproc_rs_wasm.js'></script> | ||
<script> | ||
// Like with the `--target web` output the exports are immediately | ||
// available but they won't work until we initialize the module. Unlike | ||
// `--target web`, however, the globals are all stored on a | ||
// `wasm_bindgen` global. The global itself is the initialization | ||
// function and then the properties of the global are all the exported | ||
// functions. | ||
// | ||
// Note that the name `wasm_bindgen` will at some point be configurable with the | ||
// `--no-modules-global` CLI flag (https://github.com/rustwasm/wasm-pack/issues/729) | ||
const { Driver } = wasm_bindgen; | ||
async function run() { | ||
// Note the _bg.wasm ending | ||
await wasm_bindgen('path/to/@citeproc-rs/wasm/_no_modules/citeproc_rs_wasm_bg.wasm'); | ||
// Use Driver | ||
} | ||
run(); | ||
</script> | ||
</body> | ||
</html> | ||
``` | ||
## Usage | ||
### Overview | ||
The basic pattern of interactive use is: | ||
1. Create a driver instance with your style | ||
2. Edit the references or the citation clusters as you please | ||
3. **Call `driver.batchedUpdates()`** | ||
4. Apply the updates to your document (e.g. GUI) | ||
5. Go to step 2 when a user makes a change | ||
Step three is the important one. Each time you edit a cluster or a reference, | ||
it is common for only one or two visible modifications to result. Therefore, | ||
the driver only gives you those clusters or bibliography entries that have | ||
changed, or have been caused to change by an edit elsewhere. You can submit any | ||
number of edits between each call. | ||
The API also allows for non-interactive use. See below. | ||
### 1. Creating a driver instance | ||
First, create a driver. Note that for now, you must also call `.free()` on the | ||
Driver when you are finished with it to deallocate its memory, but [there is a TC39 | ||
proposal](https://rustwasm.github.io/docs/wasm-bindgen/reference/weak-references.html) | ||
in the implementation phase that will make this unnecessary. | ||
A driver needs an XML style string, a fetcher (below), and an output format | ||
(one of `"html"`, `"rtf"` or `"plain"`). | ||
```javascript | ||
let driver = Driver.new(cslStyleTextAsXML, fetcher, "html"); | ||
// ... use the driver ... | ||
driver.free() | ||
``` | ||
The library parses and validates the CSL style input. Any validation errors are | ||
reported, with line/column positions, the text at that location, a descriptive | ||
and useful message (only in English at the moment) and sometimes even a hint | ||
for how to fix it. This is thrown as an error, which you can catch in a `try {} | ||
catch (e) {}` block. | ||
#### Fetcher | ||
There are hundreds of locales, and the locales you need change depending on the | ||
references that are active in your document, so the procedure for retrieving | ||
one is asynchronous to allow for fetching one over HTTP. There's not much more | ||
to it than this: | ||
```javascript | ||
class Fetcher { | ||
async fetchLocale(lang) { | ||
return fetch("https://some-cdn-with-locales.com/locales-${lang}.xml") | ||
.then(res => res.text()); | ||
// or just | ||
// return "<locale> ... </locale>"; | ||
// return LOCALES_PRELOADED[lang]; | ||
// or if you don't support locales other than the bundled en-US! | ||
// return null; | ||
} | ||
} | ||
let fetcher = new Fetcher(); // Pass to Driver.new() | ||
``` | ||
Unless you don't have `async` syntax, in which case, return a `Promise` | ||
directly, e.g. `return Promise.resolve("<locale> ... </locale>")`. | ||
### 2. Edit the references or the citation clusters | ||
#### References | ||
You can insert a reference like so. This is a [CSL-JSON][schema] object. | ||
[schema]: https://github.com/citation-style-language/schema | ||
```javascript | ||
driver.insertReference({ id: "citekey", type: "book", title: "Title" }); | ||
driver.insertReferences([ ... many references ... ]); | ||
driver.resetReferences([ ... deletes any others ... ]); | ||
driver.removeReference("citekey"); | ||
``` | ||
When you do insert a reference, it may have locale information in it. This | ||
should be done after updating the references, so any new locales can be | ||
fetched. | ||
```javascript | ||
// May call your Fetcher instance. | ||
await driver.fetchAll(); | ||
``` | ||
#### Citation Clusters and their Cites | ||
A document consists of a series of clusters, each with a series of cites. Each | ||
cluster has an `id`, which is any old string. | ||
```javascript | ||
// initClusters is like booting up an existing document and getting up to speed | ||
driver.initClusters([ | ||
{ id: "one", cites: [ {id: "citekey"} ] }, | ||
{ id: "two", cites: [ {id: "citekey", locator: "56", label: "page" } ] }, | ||
]); | ||
// Update or insert any one of them like so | ||
driver.insertCluster({ id: "one", cites: [ { id: "updated_citekey" } ] }); | ||
// (You can use `driver.randomClusterId()` to generate a new one at random.) | ||
let three = driver.randomClusterId(); | ||
driver.insertCluster({ id: three, cites: [ { id: "new_cluster_here" } ] }); | ||
``` | ||
These clusters do not contain position information, so reordering is a separate | ||
procedure. **Without calling setClusterOrder, the driver considers the document | ||
to be empty.** | ||
So, `setClusterOrder` expresses the ordering of the clusters within the | ||
document. Each one in the document should appear in this list. You can skip | ||
note numbers, which means there were non-citing footnotes in between. Omitting | ||
`note` means it's an in-text reference. Note numbers must be monotonic, but you | ||
can have more than one cluster in the same footnote. | ||
```javascript | ||
driver.setClusterOrder([ { id: "one", note: 1 }, { id: "two", note: 4 } ]); | ||
``` | ||
You will notice that if an interactive user cuts and pastes a paragraph | ||
containing citation clusters, the whole reordering operation can be expressed | ||
in two calls, one after the cut (with some clusters omitted) and one after the | ||
paste (with those same clusters placed somewhere else). No calls to | ||
`insertCluster` need be made. | ||
#### Uncited items | ||
Sometimes a user wishes to include references in the bibliography even though | ||
they are not mentioned in a citation anywhere in the document. | ||
```javascript | ||
driver.includeUncited("None"); // Default | ||
driver.includeUncited("All"); | ||
driver.includeUncited({ Specific: ["citekeyA", "citekeyB"] }); | ||
``` | ||
The "All" is based on which references your driver knows about. If you have | ||
this set to "All", simply calling `driver.insertReference()` with a new | ||
reference ID will result in an entry being added to the bibliography. Entries | ||
in Specific mode do not have to exist when they are provided here; they can be, | ||
for instance, the citekeys of collection of references in a reference library | ||
which are subsequently provided in full to the driver, at which point they | ||
appear in the bibliography, but not items from elsewhere in the library. | ||
### 3. Call `driver.batchedUpdates()` and apply the diff | ||
This gets you a diff to apply to your document UI. It includes both clusters | ||
that have changed, and bibliography entries that have changed. | ||
```javascript | ||
// Get the diff since last time batchedUpdates, fullRender or drain was called. | ||
let diff = driver.batchedUpdates(); | ||
// apply cluster changes to the UI. | ||
for (let changedCluster of diff.clusters) { | ||
let [id, html] = changedCluster; | ||
myDocument.updateCluster(id, html); | ||
} | ||
// Null? No change to the bibliography. | ||
if (diff.bibliography != null) { | ||
let bib = diff.bibliography; | ||
// Save the entries that have actually changed | ||
for (let key of Object.keys(bib.updatedEntries)) { | ||
let rendered = bib.updatedEntries[key]; | ||
myDocument.updateBibEntry(key, rendered); | ||
} | ||
// entryIds is the full list of entries in the bibliography. | ||
// If a citekey isn't in there, it should be removed. | ||
// It is non-null when it has changed. | ||
if (bib.entryIds != null) { | ||
myDocument.setBibliographyOrder(bib.entryIds); | ||
} | ||
} | ||
``` | ||
Note, for some intuition, if you call `batchedUpdates()` again immediately, the | ||
diff will be empty. | ||
### Bibliographies | ||
Beyond the interactive batchedUpdates method, there are two functions for | ||
producing a bibliography statically. | ||
```javascript | ||
// returns BibliographyMeta, with information about how a library consumer should | ||
// lay out the bibliography. There is a similar API in citeproc-js. | ||
let meta = driver.bibliographyMeta(); | ||
// This is an array of BibEntry | ||
let bibliography = driver.makeBibliography(); | ||
for (let entry of bibliography) { | ||
console.log(entry.id, entry.value); | ||
} | ||
``` | ||
### Preview citation clusters | ||
Sometimes, a user wants to see how a cluster will look while they are editing | ||
it, before confirming the change. | ||
```javascript | ||
let cites = [ { id: "citekey", locator: "45" }, { ... } ]; | ||
let positions = [ ... before, { note: 34 }, ... after ]; | ||
let preview = driver.previewCitationCluster(cites, positions, "html"); | ||
``` | ||
The positions array is exactly like a call to `setClusterOrder`, except exactly | ||
one of the positions omits the id field. This could either: | ||
- Replace an existing cluster's position, and preview a cluster replacement; or | ||
- Represent the position a cluster is hypothetically inserted. | ||
If you passed only one position, it would be like previewing an operation like | ||
"delete the entire document and replace it with this one cluster". **That would | ||
mean you would never see "ibid" in a preview.** So for maximum utility, | ||
assemble the positions array as you would a call to `setClusterOrder` with | ||
exactly the operation you're previewing applied. | ||
### Non-Interactive use, or re-hydrating a previously created document | ||
If you are working non-interactively, or re-hydrating a previously created | ||
document for interactive use, you may want to do one pass over all the clusters | ||
in the document, so that each cluster and bibliography entry reflects the | ||
correct value. | ||
```javascript | ||
// Get the clusters from your document (example) | ||
let allNotes = myDocument.footnotes.map(fn => { | ||
return { cluster: getCluster(fn), number: fn.number } | ||
}); | ||
// Re-hydrate the entire document based on the reference library and your | ||
// document's clusters | ||
driver.resetReferences(myDocument.allReferences); | ||
driver.initClusters(allNotes.map(fn => fn.cluster)); | ||
driver.setClusterOrder(allNotes.map(fn => { id: fn.cluster.id, note: fn.number })); | ||
// Render every cluster and bibliography item. | ||
// It then drains the update queue, leaving the diff empty for the next edit. | ||
// see the FullRender typescript type | ||
let render = driver.fullRender(); | ||
// Write out the rendered clusters into the doc | ||
for (let fn of allNotes) { | ||
fn.renderedHtml = render.allClusters[fn.cluster.id]; | ||
} | ||
// Write out the bibliography entries as well | ||
let allBibKeys = render.bibEntries.map(entry => entry.id); | ||
for (let bibEntry of render.bibEntries) { | ||
myDocument.bibliographyMap[entry.id] = entry.value; | ||
} | ||
// Update your (example) UI | ||
updateUserInterface(allNotes, myDocument, whatever); | ||
``` | ||
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Native code
Supply chain riskContains native code (e.g., compiled binaries or shared libraries). Including native code can obscure malicious behavior.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
21460003
19
3610
421
6