{ "translatorID": "4e7119e0-02be-4848-86ef-79a64185aad8", "label": "Bookmarks", "creator": "Avram Lyon", "target": "html", "minVersion": "2.1b6", "maxVersion": "", "priority": 100, "inRepository": true, "translatorType": 3, "browserSupport": "gscn", "lastUpdated": "2011-07-09 18:52:34" } /* Browser bookmarks translator Copyright (C) 2011 Avram Lyon, ajlyon@gmail.com 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 . */ /* This translator imports and exports browser bookmark files in the standard * "Netscape Bookmark Format". * See http://msdn.microsoft.com/en-us/library/aa753582%28VS.85%29.aspx * This code draws from the CSL style for bookmark export, by Rintze Zelle * http://www.zotero.org/styles/bookmark-export * Input looks like: Bookmarks

Bookmarks Menu

Example Site
Longer title
*/ const MAX_DETECT_LINES = 150; function detectImport() { var text = ""; var line; var match; var re = /
\s*]*HREF="([^"]+)"[^>]*>([^<\n]+)/gi; var i = 0; while((line = Zotero.read()) !== false && (i++ < MAX_DETECT_LINES)) { text += line; match = re.exec(text); if (match) { Zotero.debug("Found a match with line: "+line); return true; } } return false; } function doImport() { var line; var hits; var item = false; var itemIncomplete = false; var collection = false; var re = /([A-Za-z_]+)="([^"]+)"/g; while((line = Zotero.read()) !== false) { if (line.indexOf("
") !== -1 && line.indexOf("([^<]*)<\/A>/)[1]; //Zotero.debug(item.title); while(hits = re.exec(line)) { if (!hits) { Zotero.debug("RE no match in "+line); continue; } switch (hits[1]) { case "HREF": item.url = hits[2]; break; case "TAGS": item.tags = hits[2].split(','); break; case "ICON": break; case "ICON_URI": break; case "ADD_DATE": item.accessDate = convertDate(hits[2]); break; default: item.extra = item.extra ? item.extra + "; "+ [hits[1], hits[2]].join("=") : [hits[1], hits[2]].join("="); } } if (item.url.match(/^place:/)) { item = false; itemIncomplete = false; } } else if (line.indexOf("
") !== -1 && line.indexOf("]*>([^<]*)<\/H3>/i)[1]); Zotero.debug("Starting collection: "+ collection.name); collection.type = "collection"; collection.children = new Array(); } else if (line.substr(0,4) == "
") { if (itemIncomplete) item.abstractNote = item.abstractNote ? item.abstractNote + " " + line.substr(4) : line.substr(4); else Zotero.debug("Discarding description line without item: " + line); } else { //Zotero.debug("Discarding line: " + line); } } if (item && itemIncomplete) item.complete(); if (collection) collection.complete(); } function convertDate(timestamp){ var d = new Date(timestamp*1000); function pad(n){return n<10 ? '0'+n : n}; return d.getUTCFullYear()+'-' + pad(d.getUTCMonth()+1)+'-' + pad(d.getUTCDate())+' ' + pad(d.getUTCHours())+':' + pad(d.getUTCMinutes())+':' + pad(d.getUTCSeconds())+' UTC'; } function doExport() { var item; var header = '\n'+ '\n'+ '\n'+ 'Bookmarks\n'+ '

Bookmarks Menu

\n'+ '
\n'; var footer = '
'; //var tags = ""; Zotero.write(header); while (item = Zotero.nextItem()) { // TODO Be more verbose, making an informative title and including more metadata //tags = item.tags.forEach(function (tag) {return tag.tag}).join(","); if (item.url) Zotero.write('
'+item.title+'\n'); else Zotero.debug("Skipping item without URL: "+item.title); } Zotero.write(footer); } /** BEGIN TEST CASES **/ var testCases = [] /** END TEST CASES **/