Permalink
Join GitHub today
GitHub is home to over 31 million developers working together to host and review code, manage projects, and build software together.
Sign up
translators/TEI.js
Find file
Copy path
Fetching contributors…
Cannot retrieve contributors at this time
{ | |
"translatorID": "032ae9b7-ab90-9205-a479-baf81f49184a", | |
"translatorType": 2, | |
"label": "TEI", | |
"creator": "Stefan Majewski", | |
"target": "xml", | |
"minVersion": "4.0.27", | |
"maxVersion": null, | |
"priority": 25, | |
"inRepository": true, | |
"configOptions": { | |
"dataMode": "xml/dom", | |
"getCollections": "true" | |
}, | |
"displayOptions": { | |
"exportNotes": false, | |
"Export Tags": false, | |
"Generate XML IDs": true, | |
"Full TEI Document": false, | |
"Export Collections": false | |
}, | |
"lastUpdated": "2019-01-31 00:12:00" | |
} | |
// ******************************************************************** | |
// | |
// tei-zotero-translator. Zotero 2 to TEI P5 exporter. | |
// | |
// Copyright (C) 2010 Stefan Majewski <xml@stefanmajewski.eu> | |
// This program is free software: you can redistribute it and/or modify | |
// it under the terms of the GNU General Public License as published by | |
// the Free Software Foundation, either version 3 of the License, or | |
// (at your option) any later version. | |
// This program is distributed in the hope that it will be useful, | |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
// GNU General Public License for more details. | |
// You should have received a copy of the GNU General Public License | |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | |
// ********************************************************************* | |
// | |
// This script does fairly well with papers, theses, websites and | |
// books. Some item properties, important for the more exotic | |
// publication types, are still missing. That means, the first 30 are | |
// implemented, the rest may be added when I need them. If you like to | |
// see some particular item property and you also have a basic idea | |
// how to represent them in TEI (without breaking the, to me, more | |
// important ones), please contact me or send a patch. | |
// | |
// <analytic> vs <monogr> Both elements are used. The script tries to | |
// figure out where which information might be appropriately placed. I | |
// hope this works. | |
// | |
// Zotero.addOption("exportNotes", false); | |
// Zotero.addOption("generateXMLIds", true); | |
var ns = { | |
"tei": "http://www.tei-c.org/ns/1.0", | |
"xml": "http://www.w3.org/XML/1998/namespace" | |
}; | |
var exportedXMLIds = {}; | |
var generatedItems = {}; | |
var allItems = {}; | |
// replace formatting with TEI tags | |
function replaceFormatting(title) { | |
var titleText = title; | |
// italics | |
titleText = titleText.replace(/<i>/g, '<hi rend="italics">'); | |
titleText = titleText.replace(/<\/i>/g, '</hi>'); | |
// bold | |
titleText = titleText.replace(/<b>/g, '<hi rend="bold">'); | |
titleText = titleText.replace(/<\/b>/g, '</hi>'); | |
// subscript | |
titleText = titleText.replace(/<sub>/g, '<hi rend="sub">'); | |
titleText = titleText.replace(/<\/sub>/g, '</hi>'); | |
// superscript | |
titleText = titleText.replace(/<sup>/g, '<hi rend="sup">'); | |
titleText = titleText.replace(/<\/sup>/g, '</hi>'); | |
// small caps | |
titleText = titleText.replace(/<span style="font-variant:\s*small-caps;">(.*?)<\/span>/g, '<hi rend="smallcaps">$1</hi>'); | |
titleText = titleText.replace(/<sc>/g, '<hi rend="smallcaps">'); | |
titleText = titleText.replace(/<\/sc>/g, '</hi>'); | |
// no capitalization | |
titleText = titleText.replace(/<span class="nocase">(.*?)<\/span>/g, '<hi rend="nocase">$1</hi>'); | |
return titleText; | |
} | |
function genXMLId(item) { | |
// use Better BibTeX for Zotero citation key if available | |
if (item.extra) { | |
item.extra = item.extra.replace(/(?:^|\n)citation key\s*:\s*([^\s]+)(?:\n|$)/i, (m, citationKey) => { | |
item.citationKey = citationKey | |
return '\n' | |
}).trim() | |
} | |
if (item.citationKey) return item.citationKey | |
var xmlid = ''; | |
if (item.creators && item.creators[0] && (item.creators[0].lastName || item.creators[0].name)) { | |
if (item.creators[0].lastName){ | |
xmlid = item.creators[0].lastName; | |
} | |
if (item.creators[0].name){ | |
xmlid = item.creators[0].name; | |
} | |
if (item.date) { | |
var date = Zotero.Utilities.strToDate(item.date); | |
if (date.year) { | |
xmlid += date.year; | |
} | |
} | |
// Replace space, tabulations, colon, punctuation, parenthesis and apostrophes by "_" | |
xmlid = xmlid.replace(/([ \t\[\]:\u00AD\u0021-\u002C\u2010-\u2021])+/g, "_"); | |
// Remove any non xml NCName characters | |
// Namestart = ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | | |
// [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | |
// | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | | |
// [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | | |
// [#x10000-#xEFFFF] | |
// Name = NameStartChar | "-" | "." | [0-9] | #xB7 | | |
// [#x0300-#x036F] | [#x203F-#x2040] | |
xmlid = xmlid.replace(/^[^A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u10000-\uEFFFF]/, ""); | |
xmlid = xmlid.replace(/[^-A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u10000-\uEFFFF.0-9\u00B7\u0300-\u036F\u203F-\u2040]/g, ""); | |
} else { | |
// "zoteroItem_item.key" as value for entries without creator | |
var str = item.uri; | |
var n = str.lastIndexOf('/'); | |
var result = str.substring(n + 1); | |
xmlid += 'zoteroItem_' + result; | |
} | |
// this is really inefficient | |
var curXmlId = xmlid; | |
if (exportedXMLIds[curXmlId]) { | |
// append characters to make xml:id unique | |
// a-z aa-az ba-bz | |
var charA = 97; | |
var charZ = 122; | |
var firstId = xmlid + "a"; | |
// reset id of previous date-only item to <date> + "a"; | |
if (exportedXMLIds[curXmlId] && | |
!exportedXMLIds[firstId]) { | |
exportedXMLIds[curXmlId].setAttributeNS(ns.xml, "xml:id", firstId); | |
exportedXMLIds[firstId] = exportedXMLIds[curXmlId]; | |
} | |
// then start from b | |
for (var i = charA + 1; exportedXMLIds[curXmlId]; i++) { | |
curXmlId = xmlid + String.fromCharCode(i); | |
if (i == charZ) { | |
i = charA; | |
xmlid += String.fromCharCode(charA); | |
} | |
} | |
xmlid = curXmlId; | |
} | |
// set in main loop | |
// exportedXMLIds[xmlid] = true; | |
return xmlid; | |
} | |
function generateItem(item, teiDoc) { | |
// fixme not all conferencepapers are analytic! | |
var analyticItemTypes = { | |
"journalArticle": true, | |
"bookSection": true, | |
"magazineArticle": true, | |
"newspaperArticle": true, | |
"conferencePaper": true, | |
"encyclopediaArticle": true, | |
"dictionaryEntry": true, | |
"webpage": true | |
}; | |
var isAnalytic = analyticItemTypes[item.itemType] ? true : false; | |
var bibl = teiDoc.createElementNS(ns.tei, "biblStruct"); | |
bibl.setAttribute("type", item.itemType); | |
if (Zotero.getOption("Generate XML IDs")) { | |
if (!generatedItems[item.uri]) { | |
var xmlid = genXMLId(item); | |
bibl.setAttributeNS(ns.xml, "xml:id", xmlid); | |
exportedXMLIds[xmlid] = bibl; | |
} else { | |
var xmlid = "#" + generatedItems[item.uri].getAttributeNS(ns.xml, "id"); | |
var myXmlid = "zoteroItem_" + item.uri; | |
bibl.setAttribute("sameAs", xmlid); | |
bibl.setAttributeNS(ns.xml, "xml:id", myXmlid); | |
exportedXMLIds[myXmlid] = bibl; | |
} | |
//create attribute for Zotero item URI | |
bibl.setAttribute("corresp", item.uri); | |
} | |
generatedItems[item.uri] = bibl; | |
/** CORE FIELDS **/ | |
var monogr = teiDoc.createElementNS(ns.tei, "monogr"); | |
var analytic = null; | |
var series = null; | |
// create title or monogr | |
if (isAnalytic) { | |
analytic = teiDoc.createElementNS(ns.tei, "analytic") | |
bibl.appendChild(analytic); | |
bibl.appendChild(monogr); | |
var analyticTitle = teiDoc.createElementNS(ns.tei, "title"); | |
analyticTitle.setAttribute("level", "a"); | |
analytic.appendChild(analyticTitle); | |
if (item.title) { | |
analyticTitle.appendChild(teiDoc.createTextNode(replaceFormatting(item.title))); | |
} | |
//A DOI is presumably for the article, not the journal. | |
if (item.DOI) { | |
var idno = teiDoc.createElementNS(ns.tei, "idno"); | |
idno.setAttribute("type", "DOI"); | |
idno.appendChild(teiDoc.createTextNode(item.DOI)); | |
analytic.appendChild(idno); | |
} | |
// publication title | |
var publicationTitle = item.bookTitle || item.proceedingsTitle || item.encyclopediaTitle || item.dictionaryTitle || item.publicationTitle || item.websiteTitle; | |
if (publicationTitle) { | |
var pubTitle = teiDoc.createElementNS(ns.tei, "title"); | |
if (item.itemType == "journalArticle") { | |
pubTitle.setAttribute("level", "j"); | |
} else { | |
pubTitle.setAttribute("level", "m"); | |
} | |
pubTitle.appendChild(teiDoc.createTextNode(replaceFormatting(publicationTitle))); | |
monogr.appendChild(pubTitle); | |
} | |
// short title | |
if (item.shortTitle) { | |
var shortTitle = teiDoc.createElementNS(ns.tei, "title"); | |
shortTitle.setAttribute("type", "short"); | |
shortTitle.appendChild(teiDoc.createTextNode(item.shortTitle)); | |
analytic.appendChild(shortTitle); | |
} | |
} else { | |
bibl.appendChild(monogr); | |
if (item.title) { | |
var title = teiDoc.createElementNS(ns.tei, "title"); | |
title.setAttribute("level", "m"); | |
title.appendChild(teiDoc.createTextNode(replaceFormatting(item.title))); | |
monogr.appendChild(title); | |
} else if (!item.conferenceName) { | |
var title = teiDoc.createElementNS(ns.tei, "title"); | |
monogr.appendChild(title); | |
} | |
// short title | |
if (item.shortTitle) { | |
var shortTitle = teiDoc.createElementNS(ns.tei, "title"); | |
shortTitle.setAttribute("type", "short"); | |
shortTitle.appendChild(teiDoc.createTextNode(item.shortTitle)); | |
monogr.appendChild(shortTitle); | |
} | |
//A DOI where there's no analytic must be for the monogr. | |
if (item.DOI) { | |
var idno = teiDoc.createElementNS(ns.tei, "idno"); | |
idno.setAttribute("type", "DOI"); | |
idno.appendChild(teiDoc.createTextNode(item.DOI)); | |
analytic.appendChild(idno); | |
} | |
} | |
// add name of conference | |
if (item.conferenceName) { | |
var conferenceName = teiDoc.createElementNS(ns.tei, "title"); | |
conferenceName.setAttribute("type", "conferenceName"); | |
conferenceName.appendChild(teiDoc.createTextNode(replaceFormatting(item.conferenceName))); | |
monogr.appendChild(conferenceName); | |
} | |
// itemTypes in Database do unfortunately not match fields | |
// of item | |
if (item.series || item.seriesTitle) { | |
series = teiDoc.createElementNS(ns.tei, "series"); | |
bibl.appendChild(series); | |
if (item.series) { | |
var title = teiDoc.createElementNS(ns.tei, "title"); | |
title.setAttribute("level", "s"); | |
title.appendChild(teiDoc.createTextNode(replaceFormatting(item.series))); | |
series.appendChild(title); | |
} | |
if (item.seriesTitle) { | |
var seriesTitle = teiDoc.createElementNS(ns.tei, "title"); | |
seriesTitle.setAttribute("level", "s"); | |
seriesTitle.setAttribute("type", "alternative"); | |
seriesTitle.appendChild(teiDoc.createTextNode(replaceFormatting(item.seriesTitle))); | |
series.appendChild(seriesTitle); | |
} | |
if (item.seriesText) { | |
var seriesText = teiDoc.createElementNS(ns.tei, "note"); | |
seriesText.setAttribute("type", "description"); | |
seriesText.appendChild(teiDoc.createTextNode(item.seriesText)); | |
series.appendChild(seriesText); | |
} | |
if (item.seriesNumber) { | |
var seriesNumber = teiDoc.createElementNS(ns.tei, "biblScope"); | |
seriesNumber.setAttribute("unit", "volume"); | |
seriesNumber.appendChild(teiDoc.createTextNode(item.seriesNumber)); | |
series.appendChild(seriesNumber); | |
} | |
} | |
//Other canonical ref nos come right after the title(s) in monogr. | |
if (item.ISBN) { | |
var idno = teiDoc.createElementNS(ns.tei, "idno"); | |
idno.setAttribute("type", "ISBN"); | |
idno.appendChild(teiDoc.createTextNode(item.ISBN)); | |
monogr.appendChild(idno); | |
} | |
if (item.ISSN) { | |
var idno = teiDoc.createElementNS(ns.tei, "idno"); | |
idno.setAttribute("type", "ISSN"); | |
idno.appendChild(teiDoc.createTextNode(item.ISSN)); | |
monogr.appendChild(idno); | |
} | |
if (item.callNumber) { | |
var idno = teiDoc.createElementNS(ns.tei, "idno"); | |
idno.setAttribute("type", "callNumber"); | |
idno.appendChild(teiDoc.createTextNode(item.callNumber)); | |
monogr.appendChild(idno); | |
} | |
// creators are all people only remotely involved into the creation of | |
// a resource | |
for (let creator of item.creators) { | |
var role = ''; | |
var curCreator = ''; | |
var curRespStmt = null; | |
var type = creator.creatorType; | |
if (type == "author") { | |
curCreator = teiDoc.createElementNS(ns.tei, "author"); | |
} else if (type == "editor") { | |
curCreator = teiDoc.createElementNS(ns.tei, "editor"); | |
} else if (type == "seriesEditor") { | |
curCreator = teiDoc.createElementNS(ns.tei, "editor"); | |
} else if (type == "bookAuthor") { | |
curCreator = teiDoc.createElementNS(ns.tei, "author"); | |
} else { | |
curRespStmt = teiDoc.createElementNS(ns.tei, "respStmt"); | |
var resp = teiDoc.createElementNS(ns.tei, "resp"); | |
resp.appendChild(teiDoc.createTextNode(type)); | |
curRespStmt.appendChild(resp); | |
curCreator = teiDoc.createElementNS(ns.tei, "persName"); | |
curRespStmt.appendChild(curCreator); | |
} | |
// add the names of a particular creator | |
if (creator.firstName) { | |
var forename = teiDoc.createElementNS(ns.tei, "forename"); | |
forename.appendChild(teiDoc.createTextNode(creator.firstName)); | |
curCreator.appendChild(forename); | |
} | |
if (creator.lastName) { | |
var surname = null; | |
if (creator.firstName) { | |
surname = teiDoc.createElementNS(ns.tei, "surname"); | |
} else { | |
surname = teiDoc.createElementNS(ns.tei, "name"); | |
} | |
surname.appendChild(teiDoc.createTextNode(creator.lastName)); | |
curCreator.appendChild(surname); | |
} | |
if (creator.name) { | |
let name = teiDoc.createElementNS(ns.tei, "name"); | |
name.appendChild(teiDoc.createTextNode(creator.name)); | |
curCreator.appendChild(name); | |
} | |
// make sure the right thing gets added | |
if (curRespStmt) { | |
curCreator = curRespStmt; | |
} | |
//decide where the creator shall appear | |
if (type == "seriesEditor" && series) { | |
series.appendChild(curCreator); | |
} else if (isAnalytic && (type != 'editor' && type != 'bookAuthor')) { | |
// assuming that only authors go here | |
analytic.appendChild(curCreator); | |
} else { | |
monogr.appendChild(curCreator); | |
} | |
} | |
if (item.edition) { | |
var edition = teiDoc.createElementNS(ns.tei, "edition"); | |
edition.appendChild(teiDoc.createTextNode(item.edition)); | |
monogr.appendChild(edition); | |
} | |
// software | |
else if (item.versionNumber) { | |
var edition = teiDoc.createElementNS(ns.tei, "edition"); | |
edition.appendChild(teiDoc.createTextNode(item.versionNumber)); | |
monogr.appendChild(edition); | |
} | |
//create the imprint | |
var imprint = teiDoc.createElementNS(ns.tei, "imprint"); | |
monogr.appendChild(imprint); | |
if (item.place) { | |
var pubPlace = teiDoc.createElementNS(ns.tei, "pubPlace"); | |
pubPlace.appendChild(teiDoc.createTextNode(item.place)); | |
imprint.appendChild(pubPlace); | |
} | |
if (item.volume) { | |
var volume = teiDoc.createElementNS(ns.tei, "biblScope"); | |
volume.setAttribute("unit", "volume"); | |
volume.appendChild(teiDoc.createTextNode(item.volume)); | |
imprint.appendChild(volume); | |
} | |
if (item.issue) { | |
var issue = teiDoc.createElementNS(ns.tei, "biblScope"); | |
issue.setAttribute("unit", "issue"); | |
issue.appendChild(teiDoc.createTextNode(item.issue)); | |
imprint.appendChild(issue); | |
} | |
if (item.section) { | |
var section = teiDoc.createElementNS(ns.tei, "biblScope"); | |
section.setAttribute("unit", "chapter"); | |
section.appendChild(teiDoc.createTextNode(item.section)); | |
imprint.appendChild(section); | |
} | |
if (item.pages) { | |
var pages = teiDoc.createElementNS(ns.tei, "biblScope"); | |
pages.setAttribute("unit", "page"); | |
pages.appendChild(teiDoc.createTextNode(item.pages)); | |
imprint.appendChild(pages); | |
} | |
if (item.publisher) { | |
var publisher = teiDoc.createElementNS(ns.tei, "publisher"); | |
publisher.appendChild(teiDoc.createTextNode(item.publisher)); | |
imprint.appendChild(publisher); | |
} | |
if (item.date) { | |
var date = Zotero.Utilities.strToDate(item.date); | |
var imprintDate = teiDoc.createElementNS(ns.tei, "date"); | |
if (date.year) { | |
imprintDate.appendChild(teiDoc.createTextNode(date.year)); | |
} else { | |
imprintDate.appendChild(teiDoc.createTextNode(item.date)); | |
} | |
imprint.appendChild(imprintDate); | |
} | |
// If no date exists, add an empty date node so that spec minimum requirement for one imprint element is met | |
else { | |
var date = teiDoc.createElementNS(ns.tei, "date"); | |
imprint.appendChild(date); | |
} | |
if (item.accessDate) { | |
var note = teiDoc.createElementNS(ns.tei, "note"); | |
note.setAttribute("type", "accessed"); | |
note.appendChild(teiDoc.createTextNode(item.accessDate)); | |
imprint.appendChild(note); | |
} | |
if (item.url) { | |
var note = teiDoc.createElementNS(ns.tei, "note"); | |
note.setAttribute("type", "url"); | |
note.appendChild(teiDoc.createTextNode(item.url)); | |
imprint.appendChild(note); | |
} | |
if (item.thesisType) { | |
var note = teiDoc.createElementNS(ns.tei, "note"); | |
note.setAttribute("type", "thesisType"); | |
note.appendChild(teiDoc.createTextNode(item.thesisType)); | |
imprint.appendChild(note); | |
} | |
//export notes | |
if (item.notes && Zotero.getOption("exportNotes")) { | |
for (let singleNote of item.notes) { | |
// do only some basic cleaning of the html | |
// strip HTML tags | |
var noteText = Zotero.Utilities.cleanTags(singleNote.note); | |
// unescape remaining entities -> no double escapes | |
noteText = Zotero.Utilities.unescapeHTML(noteText); | |
var note = teiDoc.createElementNS(ns.tei, "note"); | |
note.appendChild(teiDoc.createTextNode(noteText)); | |
bibl.appendChild(note); | |
} | |
} | |
//export tags, if available | |
if (Zotero.getOption("Export Tags") && item.tags && item.tags.length > 0) { | |
var tags = teiDoc.createElementNS(ns.tei, "note"); | |
tags.setAttribute("type", "tags"); | |
for (let singleTag of item.tags) { | |
var tag = teiDoc.createElementNS(ns.tei, "note"); | |
tag.setAttribute("type", "tag"); | |
tag.appendChild(teiDoc.createTextNode(singleTag.tag)); | |
tags.appendChild(tag); | |
} | |
bibl.appendChild(tags); | |
} | |
return bibl; | |
} | |
function generateCollection(collection, teiDoc) { | |
var listBibl; | |
var children = collection.children ? collection.children : collection.descendents; | |
if (children.length > 0) { | |
listBibl = teiDoc.createElementNS(ns.tei, "listBibl"); | |
var colHead = teiDoc.createElementNS(ns.tei, "head"); | |
colHead.appendChild(teiDoc.createTextNode(collection.name)); | |
listBibl.appendChild(colHead); | |
for (var i = 0; i < children.length; i++) { | |
var child = children[i]; | |
if (child.type == "collection") { | |
listBibl.appendChild(generateCollection(child, teiDoc)); | |
} else if (allItems[child.id]) { | |
listBibl.appendChild(generateItem(allItems[child.id], teiDoc)); | |
} | |
} | |
} | |
return listBibl; | |
} | |
function generateTEIDocument(listBibls, teiDoc) { | |
var text = teiDoc.createElementNS(ns.tei, "text"); | |
var body = teiDoc.createElementNS(ns.tei, "body"); | |
teiDoc.documentElement.appendChild(text); | |
text.appendChild(body); | |
for (var i = 0; i < listBibls.length; i++) { | |
body.appendChild(listBibls[i]); | |
} | |
return teiDoc; | |
} | |
function doExport() { | |
Zotero.debug("starting TEI-XML export"); | |
Zotero.setCharacterSet("utf-8"); | |
Zotero.debug("TEI-XML Exporting items"); | |
// Initialize XML Doc | |
var parser = new DOMParser(); | |
var teiDoc = // <TEI/> | |
parser.parseFromString('<TEI xmlns="http://www.tei-c.org/ns/1.0"><teiHeader><fileDesc><titleStmt><title>Exported from Zotero</title></titleStmt><publicationStmt><p>unpublished</p></publicationStmt><sourceDesc><p>Generated from Zotero database</p></sourceDesc></fileDesc></teiHeader></TEI>', 'application/xml'); | |
var item = null; | |
while (item = Zotero.nextItem()) { | |
allItems[item.uri] = item; | |
} | |
var collection = Zotero.nextCollection(); | |
var listBibls = new Array(); | |
if (Zotero.getOption("Export Collections") && collection) { | |
var curListBibl = generateCollection(collection, teiDoc); | |
if (curListBibl) { | |
listBibls.push(curListBibl); | |
} | |
while (collection = Zotero.nextCollection()) { | |
curListBibl = generateCollection(collection, teiDoc); | |
if (curListBibl) { | |
listBibls.push(curListBibl); | |
} | |
} | |
} else { | |
var listBibl = teiDoc.createElementNS(ns.tei, "listBibl"); | |
for (var i in allItems) { | |
var item = allItems[i]; | |
//skip attachments | |
if (item.itemType == "attachment") { | |
continue; | |
} | |
listBibl.appendChild(generateItem(item, teiDoc)); | |
} | |
listBibls.push(listBibl); | |
} | |
var outputElement; | |
if (Zotero.getOption("Full TEI Document")) { | |
outputElement = generateTEIDocument(listBibls, teiDoc); | |
} else { | |
if (listBibls.length > 1) { | |
outputElement = teiDoc.createElementNS(ns.tei, "listBibl"); | |
for (var i = 0; i < listBibls.length; i++) { | |
outputElement.appendChild(listBibls[i]); | |
} | |
} else if (listBibls.length == 1) { | |
outputElement = listBibls[0]; | |
} else { | |
outputElement = teiDoc.createElement("empty"); | |
} | |
} | |
// write to file. | |
Zotero.write('<?xml version="1.0" encoding="UTF-8"?>' + "\n"); | |
var serializer = new XMLSerializer(); | |
Zotero.write(serializer.serializeToString(outputElement)); | |
} |