Overhaul Scaffold (#2293)

This commit is contained in:
Abe Jellinek 2021-12-28 17:32:56 -08:00 committed by Dan Stillman
parent a7cf689df2
commit 5409ae3313
24 changed files with 1936 additions and 1013 deletions

View file

@ -47,6 +47,10 @@ var Scaffold_Load = new function() {
.sort((a, b) => a.label.localeCompare(b.label)); .sort((a, b) => a.label.localeCompare(b.label));
translators["Import Translators"] = (yield translatorProvider.getAllForType("import")) translators["Import Translators"] = (yield translatorProvider.getAllForType("import"))
.sort((a, b) => a.label.localeCompare(b.label)); .sort((a, b) => a.label.localeCompare(b.label));
translators["Export Translators"] = (yield translatorProvider.getAllForType("export"))
.sort((a, b) => a.label.localeCompare(b.label));
translators["Search Translators"] = (yield translatorProvider.getAllForType("search"))
.sort((a, b) => a.label.localeCompare(b.label));
for (set in translators) { for (set in translators) {
// Make a separator // Make a separator

View file

@ -0,0 +1,64 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Monaco</title>
<style type="text/css">
html, body {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
</style>
</head>
<body>
<div id="container" style="width: 100%; height: 100%"></div>
<script src="resource://zotero/vs/loader.js"></script>
<script>
var container = document.getElementById('container');
var editor, globalEditor;
require.config({ paths: { vs: 'resource://zotero/vs' } });
let proxy = URL.createObjectURL(
new Blob(
[`
self.MonacoEnvironment = {
baseUrl: 'resource://zotero/'
};
importScripts('resource://zotero/vs/base/worker/workerMain.js');
`],
{ type: "text/javascript" }
)
);
window.MonacoEnvironment = { getWorkerUrl: () => proxy };
require(['vs/editor/editor.main'], function () {
globalEditor = monaco;
monaco.languages.typescript.javascriptDefaults.setCompilerOptions({
target: monaco.languages.typescript.ScriptTarget.ES6,
allowNonTsExtensions: true // needed for peeking definitions from in-memory models to work
});
editor = monaco.editor.create(container, {
theme: 'vs-dark',
language: 'javascript',
scrollBeyondLastLine: false,
minimap: { enabled: false }
});
window.onresize = function () {
editor.layout();
};
});
</script>
</body>
</html>

File diff suppressed because it is too large Load diff

View file

@ -1,58 +1,113 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<!-- <!--
***** BEGIN LICENSE BLOCK ***** ***** BEGIN LICENSE BLOCK *****
Copyright © 2011 Center for History and New Media Copyright © 2011 Center for History and New Media
George Mason University, Fairfax, Virginia, USA George Mason University, Fairfax, Virginia, USA
http://zotero.org http://zotero.org
This file is part of Zotero. This file is part of Zotero.
Zotero is free software: you can redistribute it and/or modify Zotero is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
Zotero is distributed in the hope that it will be useful, Zotero is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with Zotero. If not, see <http://www.gnu.org/licenses/>. along with Zotero. If not, see <http://www.gnu.org/licenses/>.
***** END LICENSE BLOCK ***** ***** END LICENSE BLOCK *****
--> -->
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?> <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<?xml-stylesheet href="chrome://scaffold/skin/scaffold.css" type="text/css"?> <?xml-stylesheet href="chrome://scaffold/skin/scaffold.css" type="text/css"?>
<?xml-stylesheet href="chrome://zotero/skin/overlay.css" type="text/css"?>
<?xml-stylesheet href="chrome://zotero-platform/content/overlay.css" type="text/css"?> <?xml-stylesheet href="chrome://zotero-platform/content/overlay.css" type="text/css"?>
<?xml-stylesheet href="chrome://zotero-platform-version/content/style.css"?> <?xml-stylesheet href="chrome://zotero-platform-version/content/style.css"?>
<?xml-stylesheet href="chrome://zotero-platform/content/zotero-react-client.css"?>
<!DOCTYPE window SYSTEM "chrome://scaffold/locale/scaffold.dtd"> <?xul-overlay href="chrome://zotero/content/containers/containers.xul"?>
<?xul-overlay href="chrome://zotero/content/standalone/editMenuOverlay.xul"?>
<?xul-overlay href="chrome://zotero-platform/content/standalone/menuOverlay.xul"?>
<window id="scaffold" width="600" height="600" minheight="600" persist="screenX screenY width height" <!DOCTYPE window [
<!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd"> %globalDTD;
<!ENTITY % textcontextDTD SYSTEM "chrome://global/locale/textcontext.dtd" > %textcontextDTD;
<!ENTITY % standaloneDTD SYSTEM "chrome://zotero/locale/standalone.dtd" > %standaloneDTD;
<!ENTITY % editMenuOverlayDTD SYSTEM "chrome://zotero/locale/mozilla/editMenuOverlay.dtd" > %editMenuOverlayDTD;
<!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd" > %brandDTD;
<!ENTITY % zoteroDTD SYSTEM "chrome://zotero/locale/zotero.dtd"> %zoteroDTD;
<!ENTITY % scaffoldDTD SYSTEM "chrome://scaffold/locale/scaffold.dtd"> %scaffoldDTD;
]>
<window id="scaffold" width="800" height="600" minheight="600" persist="screenX screenY width height"
title="Scaffold" title="Scaffold"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script src="chrome://zotero/content/include.js"/> <script src="chrome://zotero/content/include.js"/>
<script src="chrome://zotero/content/xpcom/translate/testTranslators/translatorTester.js"/> <script src="chrome://zotero/content/xpcom/translate/testTranslators/translatorTester.js"/>
<script src="translators.js"/> <script src="translators.js"/>
<script src="scaffold.js"/> <script src="scaffold.js"/>
<script src="chrome://global/content/globalOverlay.js"/>
<script src="chrome://global/content/contentAreaUtils.js"/>
<commandset id="mainCommandSet">
<command id="cmd_quitApplication" oncommand="goQuitApplication();"/>
<command id="cmd_close" oncommand="window.close();"/>
<command id="cmd_undo" oncommand="Scaffold.trigger('undo', 'cmd_undo')"/>
<command id="cmd_redo" oncommand="Scaffold.trigger('redo', 'cmd_redo')"/>
<command id="cmd_find" oncommand="Scaffold.trigger('actions.find', 'cmd_find')"/>
<command id="cmd_selectAll" oncommand="Scaffold.trigger('editor.selectAll', 'cmd_selectAll')"/>
<command id="cmd_new" oncommand="Scaffold.newTranslator()"/>
<command id="cmd_load" oncommand="Scaffold.load()" disabled="true"/>
<command id="cmd_run_translator_or_tests" oncommand="Scaffold.runTranslatorOrTests()"/>
<command id="cmd_run_detect" oncommand="Scaffold.run('detect')"/>
<command id="cmd_save" oncommand="Scaffold.save()"/>
<command id="cmd_save_to_zotero" oncommand="Scaffold.save(true)"/>
<command id="cmd_increase_font_size" oncommand="Scaffold.increaseFontSize()"/>
<command id="cmd_decrease_font_size" oncommand="Scaffold.decreaseFontSize()"/>
<command id="cmd_restore_font_size" oncommand="Scaffold.setFontSize(11)"/>
<commandset id="editMenuCommands"/>
</commandset>
<keyset> <keyset>
<key id="run-do-web" modifiers="accel" key="R" oncommand="Scaffold.runTranslatorOrTests()"/> <key id="new" modifiers="accel" key="N" command="cmd_new"/>
<key id="detect-web" modifiers="accel" key="T" oncommand="Scaffold.run('detect')"/> <key id="load" modifiers="accel" key="O" command="cmd_load"/>
<key id="save" modifiers="accel" key="S" oncommand="Scaffold.save()"/> <key id="run-do-web" modifiers="accel" key="R" command="cmd_run_translator_or_tests"/>
<key id="increase-font-size" modifiers="accel" key="+" oncommand="Scaffold.increaseFontSize()"/> <key id="detect-web" modifiers="accel" key="T" command="cmd_run_detect"/>
<key id="increase-font-size" modifiers="accel" key="=" oncommand="Scaffold.increaseFontSize()"/> <key id="save" modifiers="accel" key="S" command="cmd_save"/>
<key id="decrease-font-size" modifiers="accel" key="-" oncommand="Scaffold.decreaseFontSize()"/> <key id="save-to-zotero" modifiers="accel alt" key="S" command="cmd_save"/>
<key id="restore-font-size" modifiers="accel" key="0" oncommand="Scaffold.setFontSize(11)"/> <key id="increase-font-size" modifiers="accel" key="+" command="cmd_increase_font_size"/>
<key id="increase-font-size" modifiers="accel" key="=" command="cmd_increase_font_size"/>
<key id="decrease-font-size" modifiers="accel" key="-" command="cmd_decrease_font_size"/>
<key id="restore-font-size" modifiers="accel" key="0" command="cmd_restore_font_size"/>
<key modifiers="accel" key="1" oncommand="Scaffold.showTabNumbered(1)"/>
<key modifiers="accel" key="2" oncommand="Scaffold.showTabNumbered(2)"/>
<key modifiers="accel" key="3" oncommand="Scaffold.showTabNumbered(3)"/>
<key modifiers="accel" key="4" oncommand="Scaffold.showTabNumbered(4)"/>
<key modifiers="accel" key="5" oncommand="Scaffold.showTabNumbered(5)"/>
<key modifiers="accel" key="6" oncommand="Scaffold.showTabNumbered(6)"/>
<key modifiers="accel" key="7" oncommand="Scaffold.showTabNumbered(7)"/>
<key modifiers="accel" key="8" oncommand="Scaffold.showTabNumbered(8)"/>
<key modifiers="accel" key="9" oncommand="Scaffold.showTabNumbered(9)"/>
</keyset> </keyset>
<keyset id="editMenuKeys"/>
<popupset> <popupset>
<menupopup id="testing-context-menue"> <menupopup id="testing-context-menue">
<menuitem label="&scaffold.testing.edit.import;" tooltiptext="Edit the input data for the current test" oncommand="Scaffold.editImportFromTest()"/>
<menuitem label="&scaffold.testing.copyToClipboard;" tooltiptext="Copy the URL or data for the current test to the clipboard" oncommand="Scaffold.copyToClipboard()"/> <menuitem label="&scaffold.testing.copyToClipboard;" tooltiptext="Copy the URL or data for the current test to the clipboard" oncommand="Scaffold.copyToClipboard()"/>
<menu label="&scaffold.testing.openUrl;"> <menuitem id="testing_editImport" label="&scaffold.testing.edit;" tooltiptext="Edit the input data for the current test" oncommand="Scaffold.editImportFromTest()"/>
<menu id="testing_openURL" label="&scaffold.testing.openUrl;">
<menupopup> <menupopup>
<menuitem label="&scaffold.testing.openUrl.internally;" tooltiptext="Open the URL for the current test in the Scaffold browser" oncommand="Scaffold.openURL(false)"/> <menuitem label="&scaffold.testing.openUrl.internally;" tooltiptext="Open the URL for the current test in the Scaffold browser" oncommand="Scaffold.openURL(false)"/>
<menuitem label="&scaffold.testing.openUrl.externally;" tooltiptext="Open the URL for the current test in your default browser" oncommand="Scaffold.openURL(true)"/> <menuitem label="&scaffold.testing.openUrl.externally;" tooltiptext="Open the URL for the current test in your default browser" oncommand="Scaffold.openURL(true)"/>
@ -61,10 +116,95 @@
</menupopup> </menupopup>
</popupset> </popupset>
<broadcasterset>
<broadcaster id="code-tab-only" disabled="true"/>
<broadcaster id="validate-tests"/>
</broadcasterset>
<vbox flex="1" id="scaffold-pane"> <vbox flex="1" id="scaffold-pane">
<menubar id="mb"> <menubar id="mb">
<menu id="mb-help" label="&scaffold.menu.help;"> <menu id="mb-file" label="&fileMenu.label;" accesskey="&fileMenu.accesskey;">
<menupopup id="mb-file-popup">
<menuitem id="mb-file-new" label="&scaffold.menu.new;" key="new" command="cmd_new"/>
<menuitem id="mb-file-load" label="&scaffold.menu.open;" key="load" command="cmd_load"/>
<menuitem id="mb-file-setTranslatorsDirectory" label="&scaffold.menu.setTranslatorsDirectory;" oncommand="Scaffold.promptForTranslatorsDirectory()"/>
<menuseparator/>
<menuitem id="mb-file-save" label="&scaffold.toolbar.save.label;" key="save" command="cmd_save"/>
<menuitem id="mb-file-saveToZotero" label="&scaffold.toolbar.saveToZotero.label;" key="save-to-zotero" command="cmd_save_to_zotero"/>
<menuseparator/>
<menuitem id="mb-file-runDetect" label="&scaffold.menu.runDetect;" key="detect-web" command="cmd_run_detect"/>
<menuitem id="mb-file-runDo" label="&scaffold.menu.runDo;" key="run-do-web" command="cmd_run_translator_or_tests"/>
<menuseparator/>
<menuitem id="menu_close" label="&closeCmd.label;" key="key_close" accesskey="&closeCmd.accesskey;" command="cmd_close"/>
</menupopup>
</menu>
<menu id="menu_edit">
<menupopup id="menu_EditPopup">
<menuitem id="menu_undo" command="cmd_undo"/>
<menuitem id="menu_redo" command="cmd_redo"/>
<menuseparator/>
<menuitem id="menu_cut"/>
<menuitem id="menu_copy"/>
<menuitem id="menu_paste"/>
<menuitem id="menu_delete"/>
<menuseparator class="menu-type-library"/>
<menuitem id="menu_selectAll" class="menu-type-library" command="cmd_selectAll"/>
<menuseparator class="menu-type-library"/>
<menuitem id="menu_find" class="menu-type-library" command="cmd_find"/>
</menupopup>
</menu>
<menu id="mb-view" label="&viewMenu.label;">
<menupopup id="mb-view-popup">
<menu id="mb-font-size-fields" label="&fontSize.label;">
<menupopup id="mb-help-fields-popup">
<menuitem id="mb-view-biggerFont" label="&zotero.general.bigger;" key="increase-font-size" command="cmd_increase_font_size"/>
<menuitem id="mb-view-smallerFont" label="&zotero.general.smaller;" key="decrease-font-size" command="cmd_decrease_font_size"/>
<menuseparator/>
<menuitem id="mb-view-restoreFont" label="&zotero.general.reset;" key="restore-font-size" command="restore-font-size"/>
</menupopup>
</menu>
</menupopup>
</menu>
<menu id="toolsMenu" label="&toolsMenu.label;" accesskey="&toolsMenu.accesskey;">
<menupopup id="menu_ToolsPopup">
<menu id="menu_template"
label="&scaffold.menu.template;"
observes="code-tab-only">
<menupopup>
<menuitem label="&scaffold.toolbar.template.newWeb.label;" oncommand="Scaffold.addTemplate('newWeb')"/>
<menu label="&scaffold.toolbar.template.scrape.label;">
<menupopup id="menu_template_scrapePopup">
<menuitem id="tb-template-scrape-em" label="Embedded Metadata" oncommand="Scaffold.addTemplate('scrapeEM')"/>
<menuitem id="tb-template-scrape-ris" label="RIS" oncommand="Scaffold.addTemplate('scrapeRIS')"/>
<menuitem id="tb-template-scrape-bibtex" label="BibTeX" oncommand="Scaffold.addTemplate('scrapeBibTeX')"/>
<menuitem id="tb-template-scrape-marc" label="MARC" oncommand="Scaffold.addTemplate('scrapeMARC')"/>
</menupopup>
</menu>
</menupopup>
</menu>
<menuseparator/>
<menu id="linter-menu"
label="&scaffold.menu.linter;"
onpopupshowing="Scaffold.populateLinterMenu()">
<menupopup>
<menuitem id="menu_eslintStatus" disabled="true"/>
<menuitem id="menu_toggleESLint" oncommand="Scaffold.toggleESLint()"/>
</menupopup>
</menu>
</menupopup>
</menu>
<menu id="windowMenu"
label="&windowMenu.label;"
onpopupshowing="macWindowMenuDidShow();"
onpopuphidden="macWindowMenuDidHide();">
</menu>
<menu id="helpMenu" label="&helpMenu.label;" accesskey="&helpMenu.accesskey;">
<menupopup id="mb-help-popup"> <menupopup id="mb-help-popup">
<menuitem id="mb-help-types" label="&scaffold.toolbar.template.itemTypes.label;" oncommand="Scaffold.addTemplate('templateAllTypes')"/> <menuitem id="mb-help-types" label="&scaffold.toolbar.template.itemTypes.label;" oncommand="Scaffold.addTemplate('templateAllTypes')"/>
<menu id="mb-help-fields" label="&scaffold.toolbar.template.newItem.label;"> <menu id="mb-help-fields" label="&scaffold.toolbar.template.newItem.label;">
@ -82,162 +222,151 @@
</menu> </menu>
</menupopup> </menupopup>
</menu> </menu>
<menuitem id="mb-help-shortcuts" label="&scaffold.toolbar.help.shortcuts;" oncommand="Scaffold.addTemplate('shortcuts')"/>
</menupopup> </menupopup>
</menu> </menu>
</menubar> </menubar>
<toolbar id="tb" align="center"> <toolbar id="zotero-toolbar" class="toolbar toolbar-primary">
<toolbarbutton id="tb-load" tooltiptext="&scaffold.toolbar.load.label;" oncommand="Scaffold.load()" /> <hbox id="scaffold-toolbar" align="center">
<toolbarbutton id="tb-save" tooltiptext="&scaffold.toolbar.save.label;" oncommand="Scaffold.save()" /> <toolbarbutton id="tb-load" tooltiptext="&scaffold.toolbar.load.label;" command="cmd_load" class="zotero-tb-button" />
<toolbarbutton id="tb-saveToZotero" tooltiptext="&scaffold.toolbar.saveToZotero.label;" oncommand="Scaffold.save(true)" /> <toolbarbutton id="tb-save" tooltiptext="&scaffold.toolbar.save.label;" oncommand="Scaffold.save()" class="zotero-tb-button" />
<toolbarseparator/> <toolbarbutton id="tb-saveToZotero" tooltiptext="&scaffold.toolbar.saveToZotero.label;" oncommand="Scaffold.save(true)" class="zotero-tb-button" />
<toolbarbutton id="tb-detectWeb" tooltiptext="&scaffold.toolbar.detectWeb.label;" oncommand="Scaffold.run('detectWeb')" /> <toolbarseparator/>
<toolbarbutton id="tb-doWeb" tooltiptext="&scaffold.toolbar.doWeb.label;" oncommand="Scaffold.run('doWeb')" /> <toolbarbutton id="tb-detect" tooltiptext="&scaffold.toolbar.detect.label;" oncommand="Scaffold.run('detect')" class="zotero-tb-button" />
<toolbarseparator/> <toolbarbutton id="tb-do" tooltiptext="&scaffold.toolbar.do.label;" oncommand="Scaffold.run('do')" class="zotero-tb-button" />
<toolbarbutton id="tb-detectImport" tooltiptext="&scaffold.toolbar.detectImport.label;" oncommand="Scaffold.run('detectImport')" /> <toolbarseparator/>
<toolbarbutton id="tb-doImport" tooltiptext="&scaffold.toolbar.doImport.label;" oncommand="Scaffold.run('doImport')" /> <toolbarbutton id="tb-template" observes="code-tab-only" tooltiptext="&scaffold.toolbar.template.label;" class="zotero-tb-button" type="menu">
<toolbarseparator/> <menupopup>
<toolbarbutton id="tb-setTranslatorsDir" tooltiptext="&scaffold.toolbar.setTranslatorsDir.label;" oncommand="Scaffold.promptForTranslatorsDirectory()" /> <menuitem label="&scaffold.toolbar.template.newWeb.label;" oncommand="Scaffold.addTemplate('newWeb')"/>
<menu label="&scaffold.toolbar.template.scrape.label;">
<menupopup id="menu_template_scrapePopup">
<menuitem id="tb-template-scrape-em" label="Embedded Metadata" oncommand="Scaffold.addTemplate('scrapeEM')"/>
<menuitem id="tb-template-scrape-ris" label="RIS" oncommand="Scaffold.addTemplate('scrapeRIS')"/>
<menuitem id="tb-template-scrape-bibtex" label="BibTeX" oncommand="Scaffold.addTemplate('scrapeBibTeX')"/>
<menuitem id="tb-template-scrape-marc" label="MARC" oncommand="Scaffold.addTemplate('scrapeMARC')"/>
</menupopup>
</menu>
</menupopup>
</toolbarbutton>
</hbox>
</toolbar> </toolbar>
<hbox flex="1"> <hbox flex="1">
<tabbox id="left-tabbox" flex="1" width="300"> <tabbox id="left-tabbox" flex="2" width="300">
<tabs id="tabs" onselect="Scaffold.handleTabSelect(event)"> <tabs id="tabs" onselect="Scaffold.handleTabSelect(event)">
<tab id="tab-metadata" label="&scaffold.tabs.metadata.label;"/> <tab id="tab-metadata" label="&scaffold.tabs.metadata.label;"/>
<tab id="tab-code" label="&scaffold.tabs.code.label;"/> <tab id="tab-code" label="&scaffold.tabs.code.label;"/>
<tab id="tab-import" label="&scaffold.tabs.import.label;"/>
<tab id="tab-tests" label="&scaffold.tabs.tests.label;"/> <tab id="tab-tests" label="&scaffold.tabs.tests.label;"/>
<tab id="tab-testing" label="&scaffold.tabs.testing.label;"/>
<tab id="tab-browser" label="Browser"/> <tab id="tab-browser" label="Browser"/>
<tab id="tab-import" label="&scaffold.tabs.import.label;"/>
</tabs> </tabs>
<tabpanels flex="1"> <tabpanels flex="1">
<tabpanel flex="1" id="tabpanel-metadata"> <tabpanel flex="1" id="tabpanel-metadata">
<vbox flex="1"> <grid flex="1">
<hbox> <columns>
<label class="label-metadata" value="&scaffold.metadata.translatorID.label;" control="textbox-translatorID"/> <column/>
<textbox id="textbox-translatorID" flex="1"/> <column flex="1"/>
<button label="&scaffold.metadata.translatorID.generate;" oncommand="Scaffold.generateTranslatorID()"/> </columns>
</hbox>
<hbox> <rows>
<label class="label-metadata" value="&scaffold.metadata.label.label;" control="textbox-label"/> <row align="center">
<textbox id="textbox-label" flex="1" value="&scaffold.metadata.label.default;"/> <label class="label-metadata" value="&scaffold.metadata.translatorID.label;" control="textbox-translatorID"/>
</hbox> <hbox>
<hbox> <textbox id="textbox-translatorID" flex="1"/>
<label class="label-metadata" value="&scaffold.metadata.creator.label;" control="textbox-creator"/> <button label="&scaffold.metadata.translatorID.generate;" oncommand="Scaffold.generateTranslatorID()"/>
<textbox id="textbox-creator" flex="1"/> </hbox>
</hbox> </row>
<hbox>
<label class="label-metadata" value="&scaffold.metadata.target.label;" control="textbox-target"/> <row align="center">
<textbox id="textbox-target" flex="1"/> <label class="label-metadata" value="&scaffold.metadata.label.label;" control="textbox-label"/>
<button label="&scaffold.metadata.target.testRegex;" oncommand="Scaffold.logTargetRegex()"/> <textbox id="textbox-label" flex="1" value="&scaffold.metadata.label.default;"/>
</hbox> </row>
<hbox style="display:none">
<label class="label-metadata" value="&scaffold.metadata.targetAll.label;" control="textbox-target-all"/> <row align="center">
<textbox id="textbox-target-all" flex="1"/> <label class="label-metadata" value="&scaffold.metadata.creator.label;" control="textbox-creator"/>
</hbox> <textbox id="textbox-creator" flex="1"/>
<hbox> </row>
<label class="label-metadata" value="&scaffold.metadata.configOptions.label;" control="textbox-configOptions"/>
<textbox id="textbox-configOptions" flex="1"/> <row align="center">
</hbox> <label class="label-metadata" value="&scaffold.metadata.target.label;" control="textbox-target"/>
<hbox> <hbox>
<label class="label-metadata" value="&scaffold.metadata.displayOptions.label;" control="textbox-displayOptions"/> <textbox id="textbox-target" flex="1"/>
<textbox id="textbox-displayOptions" flex="1"/> <button label="&scaffold.metadata.target.testRegex;" oncommand="Scaffold.logTargetRegex()"/>
</hbox> </hbox>
<hbox> </row>
<label class="label-metadata" value="&scaffold.metadata.minVersion.label;" control="textbox-minVersion"/>
<textbox id="textbox-minVersion" flex="1" value="3.0"/> <row align="center">
<label class="label-metadata" value="&scaffold.metadata.maxVersion.label;" control="textbox-maxVersion"/> <label class="label-metadata" value="&scaffold.metadata.targetAll.label;" control="textbox-target-all" style="display: none"/>
<textbox id="textbox-maxVersion" flex="1"/> <textbox id="textbox-target-all" flex="1" style="display: none"/>
<label class="label-metadata" value="&scaffold.metadata.priority.label;" control="textbox-priority"/> </row>
<textbox id="textbox-priority" flex="1" value="&scaffold.metadata.priority.default;"/>
</hbox> <row align="center">
<hbox style="display:none"> <label class="label-metadata" value="&scaffold.metadata.configOptions.label;" control="textbox-configOptions"/>
<label class="label-metadata" value="&scaffold.metadata.hiddenPrefs.label;" control="textbox-hidden-prefs"/> <textbox id="textbox-configOptions" flex="1"/>
<textbox id="textbox-hidden-prefs" flex="1"/> </row>
</hbox>
<grid flex="1"> <row align="center">
<columns> <label class="label-metadata" value="&scaffold.metadata.displayOptions.label;" control="textbox-displayOptions"/>
<column flex="2"/> <textbox id="textbox-displayOptions" flex="1"/>
<column flex="1"/> </row>
</columns>
<rows><row><groupbox> <row align="center">
<caption label="&scaffold.metadata.translatorType.label;"/> <label class="label-metadata" value="&scaffold.metadata.minVersion.label;" control="textbox-minVersion"/>
<checkbox id="checkbox-import" label="&scaffold.metadata.translatorType.import;"/> <hbox>
<checkbox id="checkbox-export" label="&scaffold.metadata.translatorType.export;"/> <textbox id="textbox-minVersion" flex="1" value="5.0"/>
<checkbox id="checkbox-web" label="&scaffold.metadata.translatorType.web;" checked="true"/> <label class="label-metadata" value="&scaffold.metadata.priority.label;" control="textbox-priority"/>
<checkbox id="checkbox-search" label="&scaffold.metadata.translatorType.search;"/> <textbox id="textbox-priority" flex="1" value="&scaffold.metadata.priority.default;"/>
</groupbox> </hbox>
<groupbox> </row>
<caption label="&scaffold.metadata.browserSupport.label;"/>
<checkbox id="checkbox-gecko" label="&scaffold.metadata.browserSupport.gecko;" checked="true"/> <row align="center">
<checkbox id="checkbox-chrome" label="&scaffold.metadata.browserSupport.chrome;" checked="true"/> <label class="label-metadata" value="&scaffold.metadata.hiddenPrefs.label;" control="textbox-hidden-prefs" style="display: none"/>
<checkbox id="checkbox-safari" label="&scaffold.metadata.browserSupport.safari;" checked="true"/> <textbox id="textbox-hidden-prefs" flex="1" style="display: none"/>
<checkbox id="checkbox-ie" label="&scaffold.metadata.browserSupport.ie;" checked="true"/> </row>
<checkbox id="checkbox-bookmarklet" label="&scaffold.metadata.browserSupport.bookmarklet;" checked="true"/>
<checkbox id="checkbox-server" label="&scaffold.metadata.browserSupport.server;" checked="true"/> <row align="center">
</groupbox></row></rows> <label class="label-metadata" value="&scaffold.metadata.translatorType.label;"/>
</grid> <hbox id="checkboxes-translatorType">
</vbox> <checkbox id="checkbox-import" label="&scaffold.metadata.translatorType.import;"/>
<checkbox id="checkbox-export" label="&scaffold.metadata.translatorType.export;"/>
<checkbox id="checkbox-web" label="&scaffold.metadata.translatorType.web;" checked="true"/>
<checkbox id="checkbox-search" label="&scaffold.metadata.translatorType.search;"/>
</hbox>
</row>
</rows>
</grid>
</tabpanel> </tabpanel>
<tabpanel flex="1" id="tabpanel-code"> <tabpanel flex="1" id="tabpanel-code">
<vbox flex="1"> <vbox flex="1">
<hbox id="editor-toolbar" align="center"> <iframe src="monaco/monaco.html" id="editor-code" flex="1" onmousedown="this.focus()"/>
<toolbarbutton id="tb-template" tooltiptext="&scaffold.toolbar.template.label;" type="menu">
<menupopup id="tb-template-popup">
<menuitem id="tb-template-new-web-add" label="&scaffold.toolbar.template.newWeb.label;" oncommand="Scaffold.addTemplate('newWeb')"/>
<menu id="tb-template-scrape-add" label="&scaffold.toolbar.template.scrape.label;">
<menupopup id="tb-template-scrape-popup">
<menuitem id="tb-template-scrape-em" label="Embedded Metadata" oncommand="Scaffold.addTemplate('scrapeEM')"/>
<menuitem id="tb-template-scrape-ris" label="RIS" oncommand="Scaffold.addTemplate('scrapeRIS')"/>
<menuitem id="tb-template-scrape-bibtex" label="BibTeX" oncommand="Scaffold.addTemplate('scrapeBibTeX')"/>
<menuitem id="tb-template-scrape-marc" label="MARC" oncommand="Scaffold.addTemplate('scrapeMARC')"/>
</menupopup>
</menu>
</menupopup>
</toolbarbutton>
</hbox>
<iframe src="chrome://zotero/content/ace/ace.html" id="editor-code" flex="1"/>
<hbox id="editor-external-box" align="center">
<checkbox id="checkbox-editor-external"/>
<label class="label-metadata" value="&scaffold.editor.external.label;" control="checkbox-editor-external"/>
</hbox>
</vbox> </vbox>
</tabpanel> </tabpanel>
<tabpanel flex="1" id="tabpanel-import">
<iframe src="chrome://zotero/content/ace/ace.html" id="editor-import" flex="1"/>
</tabpanel>
<tabpanel flex="1" id="tabpanel-tests"> <tabpanel flex="1" id="tabpanel-tests">
<iframe src="chrome://zotero/content/ace/ace.html" id="editor-tests" flex="1"/> <vbox flex="1">
</tabpanel> <vbox flex="1">
<tabpanel flex="1" id="tabpanel-testing"> <hbox flex="1" context="testing-context-menue">
<keyset> <keyset>
<key id="key-delete-tests" keycode="VK_BACK" oncommand="Scaffold.deleteSelectedTests()"/> <key id="key-delete-tests" observes="validate-tests" keycode="VK_BACK" oncommand="Scaffold.deleteSelectedTests()"/>
</keyset> </keyset>
<vbox flex="1"><hbox><description>&scaffold.testing.description;</description></hbox> <listbox id="testing-listbox" observes="validate-tests" flex="1" seltype="multiple" onselect="Scaffold.handleTestSelect(event)">
<hbox flex="1" context="testing-context-menue"> <listhead>
<listbox id="testing-listbox" flex="1" seltype="multiple"> <listheader label="&scaffold.testing.input.label;"/>
<listhead> <listheader label="&scaffold.testing.status.label;"/>
<listheader label="&scaffold.testing.input.label;"/> </listhead>
<listheader label="&scaffold.testing.status.label;"/> <listcols>
</listhead> <listcol flex="1"/>
<listcols> <listcol class="listcol-testMessage"/>
<listcol flex="1"/> </listcols>
<listcol/> </listbox>
</listcols> </hbox>
</listbox> <hbox>
</hbox> <button observes="validate-tests" label="&scaffold.testing.delete;" tooltiptext="Delete the selected tests" oncommand="Scaffold.deleteSelectedTests()"/>
<hbox> <button observes="validate-tests" label="&scaffold.testing.run;" tooltiptext="Run the selected tests" oncommand="Scaffold.runSelectedTests()"/>
<button label="&scaffold.testing.populate;" tooltiptext="Load test definitions from the current translator" oncommand="Scaffold.populateTests()"/> <button observes="validate-tests" label="&scaffold.testing.update;" tooltiptext="Run the selected tests and update the translator" oncommand="Scaffold.updateSelectedTests()"/>
<button label="&scaffold.testing.save;" tooltiptext="Save the above test definitions into the current translator, and save the translator" oncommand="Scaffold.saveTests()"/> </hbox>
<button label="&scaffold.testing.delete;" tooltiptext="Delete the selected tests" oncommand="Scaffold.deleteSelectedTests()"/> </vbox>
<button label="&scaffold.testing.run;" tooltiptext="Run the selected tests" oncommand="Scaffold.runSelectedTests()"/> <splitter resizeafter="farthest"/>
</hbox> <iframe src="monaco/monaco.html" id="editor-tests" flex="2" onmousedown="this.focus()"/>
<hbox>
<button label="&scaffold.testing.update;" tooltiptext="Update a test to match current item" oncommand="Scaffold.updateSelectedTests()"/>
<button label="&scaffold.testing.new;" tooltiptext="Create a new test from the current page" oncommand="Scaffold.newTestFromCurrent('web')" />
<button label="&scaffold.testing.new.import;" tooltiptext="Create a new test from the current import" oncommand="Scaffold.newTestFromCurrent('import')" />
</hbox>
</vbox> </vbox>
</tabpanel> </tabpanel>
<tabpanel> <tabpanel>
@ -247,14 +376,24 @@
<menulist id="browser-url" editable="true" flex="1"> <menulist id="browser-url" editable="true" flex="1">
<menupopup></menupopup> <menupopup></menupopup>
</menulist> </menulist>
<button observes="validate-tests" label="&scaffold.testing.create.web;" tooltiptext="Create a new test from the current page" oncommand="Scaffold.saveTestFromCurrent('web')"/>
</hbox> </hbox>
<browser src="about:blank" type="content" flex="1"></browser> <browser id="browser" src="about:blank" type="content" flex="1"></browser>
</vbox>
</tabpanel>
<tabpanel flex="1" id="tabpanel-import">
<vbox flex="1">
<hbox align="right">
<button observes="validate-tests" label="&scaffold.testing.create.import;" tooltiptext="Create a new test from the current import data" oncommand="Scaffold.saveTestFromCurrent('import')" />
<button observes="validate-tests" label="&scaffold.testing.create.search;" tooltiptext="Create a new test from the current search data" oncommand="Scaffold.saveTestFromCurrent('search')" />
</hbox>
<iframe src="monaco/monaco.html" id="editor-import" flex="1" onmousedown="this.focus()"/>
</vbox> </vbox>
</tabpanel> </tabpanel>
</tabpanels> </tabpanels>
</tabbox> </tabbox>
<splitter resizeafter="farthest" oncommand="Scaffold.onResize();" /> <splitter resizeafter="farthest" />
<vbox id="right-pane" flex="1"> <vbox id="right-pane" flex="1">

View file

@ -1,34 +1,34 @@
/* /*
***** BEGIN LICENSE BLOCK ***** ***** BEGIN LICENSE BLOCK *****
Copyright © 2021 YOUR_NAME <- TODO Copyright © 2022 YOUR_NAME <- TODO
This file is part of Zotero.
Zotero is free software: you can redistribute it and/or modify This file is part of Zotero.
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Zotero is distributed in the hope that it will be useful, Zotero is free software: you can redistribute it and/or modify
but WITHOUT ANY WARRANTY; without even the implied warranty of it under the terms of the GNU Affero General Public License as published by
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the the Free Software Foundation, either version 3 of the License, or
GNU Affero General Public License for more details. (at your option) any later version.
You should have received a copy of the GNU Affero General Public License Zotero is distributed in the hope that it will be useful,
along with Zotero. If not, see <http://www.gnu.org/licenses/>. but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
***** END LICENSE BLOCK ***** You should have received a copy of the GNU Affero General Public License
along with Zotero. If not, see <http://www.gnu.org/licenses/>.
***** END LICENSE BLOCK *****
*/ */
function detectWeb(doc, url) { async function detectWeb(doc, url) {
// TODO: adjust the logic here // TODO: adjust the logic here
if (url.includes('/article/')) { if ($$CURSOR$$url.includes('/article/')) {
return "newspaperArticle"; return 'newspaperArticle';
} }
else if (getSearchResults(doc, true)) { else if (getSearchResults(doc, true)) {
return "multiple"; return 'multiple';
} }
return false; return false;
} }
@ -51,13 +51,17 @@ function getSearchResults(doc, checkOnly) {
return found ? items : false; return found ? items : false;
} }
function doWeb(doc, url) { async function doWeb(doc, url) {
if (detectWeb(doc, url) == "multiple") { if (await detectWeb(doc, url) == 'multiple') {
Zotero.selectItems(getSearchResults(doc, false), function (items) { let items = await Zotero.selectItems(getSearchResults(doc, false));
if (items) ZU.processDocuments(Object.keys(items), scrape); if (items) {
}); await Promise.all(
Object.keys(items)
.map(url => requestDocument(url).then(doc => scrape(doc, url)))
);
}
} }
else { else {
scrape(doc, url); await scrape(doc, url);
} }
} }

View file

@ -1,21 +1,20 @@
function scrape(doc, url) { async function scrape(doc, url) {
// TODO adjust the url building // TODO adjust the url building
var m = url.match(/FId=([\w\d]+)&/); let m = url.match(/FId=([\w\d]+)&/);
if (m) { if (m) {
// e.g. http://www.fachportal-paedagogik.de/fis_bildung/suche/fis_ausg.html?FId=A18196&lart=BibTeX&Speichern=Speichern&senden_an=+E-Mail-Adresse // e.g. http://www.fachportal-paedagogik.de/fis_bildung/suche/fis_ausg.html?FId=A18196&lart=BibTeX&Speichern=Speichern&senden_an=+E-Mail-Adresse
var bibUrl = "/fis_bildung/suche/fis_ausg.html?FId=" + m[1] + "&lart=BibTeX"; let bibUrl = '/fis_bildung/suche/fis_ausg.html?FId=' + m[1] + '&lart=BibTeX';
ZU.doGet(bibUrl, function (text) { let bibText = await requestText(bibUrl);
var translator = Zotero.loadTranslator("import"); let translator = Zotero.loadTranslator("import");
translator.setTranslator("9cb70025-a888-4a29-a210-93ec52da40d4"); translator.setTranslator('9cb70025-a888-4a29-a210-93ec52da40d4');
translator.setString(text); translator.setString(bibText);
translator.setHandler("itemDone", function (obj, item) { translator.setHandler('itemDone', (_obj, item) => {
item.attachments.push({ item.attachments.push({
title: "Snapshot", title: 'Snapshot',
document: doc document: doc
});
item.complete();
}); });
translator.translate(); item.complete();
}); });
await translator.translate();
} }
} }

View file

@ -1,21 +1,20 @@
function scrape(doc, url) { async function scrape(doc, url) {
var translator = Zotero.loadTranslator('web'); let translator = Zotero.loadTranslator('web');
// Embedded Metadata // Embedded Metadata
translator.setTranslator('951c027d-74ac-47d4-a107-9c3069ab7b48'); translator.setTranslator('951c027d-74ac-47d4-a107-9c3069ab7b48');
// translator.setDocument(doc); translator.setDocument(doc);
translator.setHandler('itemDone', function (obj, item) { translator.setHandler('itemDone', (_obj, item) => {
// TODO adjust if needed: // TODO adjust if needed:
item.section = "News"; item.section = 'News';
item.complete(); item.complete();
}); });
translator.getTranslatorObject(function (trans) { let em = await translator.getTranslatorObject();
trans.itemType = "newspaperArticle"; em.itemType = 'newspaperArticle';
// TODO map additional meta tags here, or delete completely // TODO map additional meta tags here, or delete completely
trans.addCustomFields({ em.addCustomFields({
'twitter:description': 'abstractNote' 'twitter:description': 'abstractNote'
});
trans.doWeb(doc, url);
}); });
await em.doWeb(doc, url);
} }

View file

@ -1,36 +1,35 @@
function scrape(doc, url) { async function scrape(doc, url) {
// TODO adjust the selector for the lines here // TODO adjust the selector for the lines here
var lines = doc.querySelectorAll('#cntPlcPortal_grdMrc tr'); let lines = doc.querySelectorAll('table#marcData tr');
// call MARC translator let translator = Zotero.loadTranslator('import');
var translator = Zotero.loadTranslator("import"); translator.setTranslator('a6ee60df-1ddc-4aae-bb25-45e0537be973'); // MARC
translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973"); let MARC = await translator.getTranslatorObject();
translator.getTranslatorObject(function (marc) {
var record = new marc.record(); let record = new MARC.Record();
var newItem = new Zotero.Item(); let item = new Zotero.Item();
// ignore the table headings in lines[0] // ignore the table headings in lines[0]
record.leader = text(lines[1], 'td', 4); record.leader = text(lines[1], 'td', 4);
var fieldTag, indicators, fieldContent; let fieldTag;
for (let line of Array.from(lines).slice(2)) { for (let line of Array.from(lines).slice(2)) {
// multiple lines with same fieldTag do not repeat the tag // multiple lines with same fieldTag do not repeat the tag
// i.e. in these cases we will just take same value as before // i.e. in these cases we will just take same value as before
if (text(line, 'td', 0).trim().length > 0) { if (text(line, 'td', 0)) {
fieldTag = text(line, 'td', 0); fieldTag = text(line, 'td', 0);
}
indicators = text(line, 'td', 1) + text(line, 'td', 2);
fieldContent = '';
if (text(line, 'td', 3).trim().length > 0) {
fieldContent = marc.subfieldDelimiter + text(line, 'td', 3);
}
fieldContent += text(line, 'td', 4);
record.addField(fieldTag, indicators, fieldContent);
} }
let indicators = text(line, 'td', 1) + text(line, 'td', 2);
record.translate(newItem); let fieldContent = '';
if (text(line, 'td', 3)) {
// possibly clean newItem further here fieldContent = MARC.subfieldDelimiter + text(line, 'td', 3);
}
newItem.complete(); fieldContent += text(line, 'td', 4);
});
record.addField(fieldTag, indicators, fieldContent);
}
record.translate(item);
// possibly clean item further here
item.complete();
} }

View file

@ -1,31 +1,33 @@
function scrape(doc, url) { async function scrape(doc, url) {
var DOI = url.match(/\/(10\.[^#?]+)/)[1]; let DOI = url.match(/\/(10\.[^#?]+)/)[1];
// TODO adjust the url here // TODO adjust the URL here
var risURL = "http://citation-needed.services.springer.com/v2/references/" + DOI + "?format=refman&flavour=citation"; let risURL = `http://citation-needed.services.springer.com/v2/references/${DOI}?format=refman&flavour=citation`;
// Z.debug(risURL) // Z.debug(risURL)
// TODO adjust the url here // TODO adjust this
var pdfURL = doc.getElementById("articlePdf"); let pdfLink = doc.querySelector('#articlePDF');
// Z.debug("pdfURL: " + pdfURL); // Z.debug("pdfURL: " + pdfURL);
ZU.doGet(risURL, function (text) {
var translator = Zotero.loadTranslator("import"); let risText = await requestText(risURL);
translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7"); let translator = Zotero.loadTranslator('import');
translator.setString(text); translator.setTranslator('32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7'); // RIS
translator.setHandler("itemDone", function (obj, item) { translator.setString(risText);
// TODO tweak some of the output here translator.setHandler('itemDone', (_obj, item) => {
if (pdfURL) { // TODO tweak some of the output here
item.attachments.push({ if (pdfLink) {
url: pdfURL.href,
title: "Full Text PDF",
mimeType: "application/pdf"
});
}
item.attachments.push({ item.attachments.push({
title: "Snapshot", url: pdfLink.href,
document: doc title: 'Full Text PDF',
mimeType: 'application/pdf'
}); });
item.complete(); }
item.attachments.push({
title: 'Snapshot',
document: doc
}); });
translator.translate();
item.complete();
}); });
await translator.translate();
} }

View file

@ -1,11 +0,0 @@
Keyboard Shortcuts
=============
Ctrl/Cmd S : Save
Ctrl/Cmd R : Run doWeb/doImport or selected tests
Ctrl/Cmd T : Run detectWeb/detectImport
Ctrl/Cmd + : Increase Font Size
Ctrl/Cmd - : Decrease Font Size
Ctrl/Cmd 0 : Restore Font Size

View file

@ -7,16 +7,16 @@ var Scaffold_Translators = {
_provider: null, _provider: null,
_translators: new Map(), _translators: new Map(),
_translatorFiles: new Map(), _translatorFiles: new Map(),
_onLoadBeginListener: null,
_onLoadCompleteListener: null,
load: Zotero.serial(async function (reload, filenames) { load: Zotero.serial(async function (reload) {
if (this._translators.size && !reload) { if (this._translators.size && !reload) {
Zotero.debug("Scaffold: Translators already loaded"); Zotero.debug("Scaffold: Translators already loaded");
return; return { numLoaded: 0, numDeleted: 0 };
}
if (filenames) {
} }
if (this._onLoadBeginListener) this._onLoadBeginListener();
var t = new Date(); var t = new Date();
var dir = this.getDirectory(); var dir = this.getDirectory();
@ -77,6 +77,13 @@ var Scaffold_Translators = {
this._translators.delete(id); this._translators.delete(id);
} }
} }
if (this._onLoadCompleteListener) this._onLoadCompleteListener();
return {
numLoaded,
numDeleted: deletedTranslators.size
};
}), }),
deleteByID: async function (translatorID) { deleteByID: async function (translatorID) {
@ -93,6 +100,10 @@ var Scaffold_Translators = {
getDirectory: function () { getDirectory: function () {
return Zotero.Prefs.get('scaffold.translatorsDir'); return Zotero.Prefs.get('scaffold.translatorsDir');
}, },
getModifiedTime: function (translatorID) {
return this._translators.get(translatorID)?.mtime;
},
getProvider: function () { getProvider: function () {
if (this._provider) { if (this._provider) {
@ -139,5 +150,10 @@ var Scaffold_Translators = {
}.bind(this) }.bind(this)
}); });
return this._provider; return this._provider;
},
setLoadListener({ onLoadBegin, onLoadComplete }) {
this._onLoadBeginListener = onLoadBegin;
this._onLoadCompleteListener = onLoadComplete;
} }
}; };

View file

@ -1,78 +1,83 @@
<!ENTITY scaffold.toolbar.load.label "Load"> <!ENTITY scaffold.toolbar.new.label "New Translator">
<!ENTITY scaffold.toolbar.save.label "Save"> <!ENTITY scaffold.toolbar.load.label "Open">
<!ENTITY scaffold.toolbar.saveToZotero.label "Save to Zotero"> <!ENTITY scaffold.toolbar.save.label "Save">
<!ENTITY scaffold.toolbar.template.label "Add a template"> <!ENTITY scaffold.toolbar.saveToZotero.label "Save to Zotero">
<!ENTITY scaffold.toolbar.template.newWeb.label "Add web translator template"> <!ENTITY scaffold.toolbar.template.newWeb.label "Web Translator">
<!ENTITY scaffold.toolbar.template.scrape.label "Add scrape function using…"> <!ENTITY scaffold.toolbar.template.scrape.label "Scrape Function Using">
<!ENTITY scaffold.toolbar.export.label "Export"> <!ENTITY scaffold.toolbar.export.label "Export">
<!ENTITY scaffold.toolbar.detectWeb.label "Run detectWeb"> <!ENTITY scaffold.toolbar.detect.label "Run detect*">
<!ENTITY scaffold.toolbar.doWeb.label "Run doWeb"> <!ENTITY scaffold.toolbar.do.label "Run do*">
<!ENTITY scaffold.toolbar.detectImport.label "Run detectImport">
<!ENTITY scaffold.toolbar.doImport.label "Run doImport">
<!ENTITY scaffold.toolbar.setTranslatorsDir.label "Set translators directory"> <!ENTITY scaffold.toolbar.setTranslatorsDir.label "Set translators directory">
<!ENTITY scaffold.toolbar.template.label "Insert Template">
<!ENTITY scaffold.tabs.metadata.label "Metadata"> <!ENTITY scaffold.tabs.metadata.label "Metadata">
<!ENTITY scaffold.tabs.code.label "Code"> <!ENTITY scaffold.tabs.code.label "Code">
<!ENTITY scaffold.tabs.import.label "Import"> <!ENTITY scaffold.tabs.import.label "Test Input">
<!ENTITY scaffold.tabs.tests.label "Tests"> <!ENTITY scaffold.tabs.tests.label "Tests">
<!ENTITY scaffold.tabs.testing.label "Testing"> <!ENTITY scaffold.tabs.testing.label "Testing">
<!ENTITY scaffold.menu.help "Help"> <!ENTITY scaffold.menu.new "New Translator">
<!ENTITY scaffold.toolbar.template.itemTypes.label "List all item types"> <!ENTITY scaffold.menu.open "Open…">
<!ENTITY scaffold.toolbar.template.newItem.label "List all fields for item type"> <!ENTITY scaffold.menu.setTranslatorsDirectory "Set Translators Directory…">
<!ENTITY scaffold.menu.runDetect "Run detect*">
<!ENTITY scaffold.menu.runDo "Run Selected Tests or do*">
<!ENTITY scaffold.menu.linter "Linter">
<!ENTITY scaffold.menu.template "Insert Template">
<!ENTITY scaffold.toolbar.template.itemTypes.label "List All Item Types">
<!ENTITY scaffold.toolbar.template.newItem.label "List All Fields for Item Type">
<!ENTITY scaffold.toolbar.template.more.label "More"> <!ENTITY scaffold.toolbar.template.more.label "More">
<!ENTITY scaffold.toolbar.help.shortcuts "Keyboard Shortcuts">
<!ENTITY scaffold.tabUrl.label "URL:"> <!ENTITY scaffold.tabUrl.label "URL:">
<!ENTITY scaffold.testFrame.label "Test Frame:"> <!ENTITY scaffold.testFrame.label "Test Frame:">
<!ENTITY scaffold.metadata.translatorID.label "Translator ID:"> <!ENTITY scaffold.metadata.translatorID.label "Translator ID:">
<!ENTITY scaffold.metadata.translatorID.generate "Generate"> <!ENTITY scaffold.metadata.translatorID.generate "Generate">
<!ENTITY scaffold.metadata.label.label "Label:"> <!ENTITY scaffold.metadata.label.label "Label:">
<!ENTITY scaffold.metadata.creator.label "Creator:"> <!ENTITY scaffold.metadata.creator.label "Creator:">
<!ENTITY scaffold.metadata.target.label "Target:"> <!ENTITY scaffold.metadata.target.label "Target:">
<!ENTITY scaffold.metadata.target.testRegex "Test Regex"> <!ENTITY scaffold.metadata.target.testRegex "Test Regex">
<!ENTITY scaffold.metadata.configOptions.label "Config Options:"> <!ENTITY scaffold.metadata.configOptions.label "Config Options:">
<!ENTITY scaffold.metadata.displayOptions.label "Display Options:"> <!ENTITY scaffold.metadata.displayOptions.label "Display Options:">
<!ENTITY scaffold.metadata.minVersion.label "Min. Version:"> <!ENTITY scaffold.metadata.minVersion.label "Min. Version:">
<!ENTITY scaffold.metadata.maxVersion.label "Max. Version:"> <!ENTITY scaffold.metadata.maxVersion.label "Max. Version:">
<!ENTITY scaffold.metadata.priority.label "Priority:"> <!ENTITY scaffold.metadata.priority.label "Priority:">
<!ENTITY scaffold.metadata.translatorType.label "Translator Type:"> <!ENTITY scaffold.metadata.translatorType.label "Translator Type:">
<!ENTITY scaffold.metadata.translatorType.import "Import"> <!ENTITY scaffold.metadata.translatorType.import "Import">
<!ENTITY scaffold.metadata.translatorType.export "Export"> <!ENTITY scaffold.metadata.translatorType.export "Export">
<!ENTITY scaffold.metadata.translatorType.web "Web"> <!ENTITY scaffold.metadata.translatorType.web "Web">
<!ENTITY scaffold.metadata.translatorType.search "Search"> <!ENTITY scaffold.metadata.translatorType.search "Search">
<!ENTITY scaffold.metadata.browserSupport.label "Browser Support:"> <!ENTITY scaffold.metadata.browserSupport.label "Browser Support:">
<!ENTITY scaffold.metadata.browserSupport.gecko "Gecko (Firefox)"> <!ENTITY scaffold.metadata.browserSupport.gecko "Gecko (Firefox)">
<!ENTITY scaffold.metadata.browserSupport.chrome "Chrome"> <!ENTITY scaffold.metadata.browserSupport.chrome "Chrome">
<!ENTITY scaffold.metadata.browserSupport.safari "Safari"> <!ENTITY scaffold.metadata.browserSupport.safari "Safari">
<!ENTITY scaffold.metadata.browserSupport.ie "Internet Explorer"> <!ENTITY scaffold.metadata.browserSupport.ie "Internet Explorer">
<!ENTITY scaffold.metadata.browserSupport.bookmarklet "Bookmarklet"> <!ENTITY scaffold.metadata.browserSupport.bookmarklet "Bookmarklet">
<!ENTITY scaffold.metadata.browserSupport.server "Server"> <!ENTITY scaffold.metadata.browserSupport.server "Server">
<!ENTITY scaffold.metadata.targetAll.label "Target All:"> <!ENTITY scaffold.metadata.targetAll.label "Target All:">
<!ENTITY scaffold.metadata.hiddenPrefs.label "Hidden Preferences:"> <!ENTITY scaffold.metadata.hiddenPrefs.label "Hidden Preferences:">
<!ENTITY scaffold.metadata.label.default "Untitled"> <!ENTITY scaffold.metadata.label.default "Untitled">
<!ENTITY scaffold.metadata.priority.default "100"> <!ENTITY scaffold.metadata.priority.default "100">
<!ENTITY scaffold.load.title "Load Translator"> <!ENTITY scaffold.load.title "Open Translator">
<!ENTITY scaffold.load.label.label "Label"> <!ENTITY scaffold.load.label.label "Label">
<!ENTITY scaffold.load.creator.label "Creator"> <!ENTITY scaffold.load.creator.label "Creator">
<!ENTITY scaffold.editor.external.label "Use external editor"> <!ENTITY scaffold.editor.external.label "Use external editor">
<!ENTITY scaffold.testing.description "Select a test to run"> <!ENTITY scaffold.testing.input.label "Input">
<!ENTITY scaffold.testing.input.label "Input"> <!ENTITY scaffold.testing.status.label "Status">
<!ENTITY scaffold.testing.status.label "Status"> <!ENTITY scaffold.testing.populate "Populate">
<!ENTITY scaffold.testing.populate "Populate"> <!ENTITY scaffold.testing.save "Save">
<!ENTITY scaffold.testing.save "Save"> <!ENTITY scaffold.testing.delete "Delete">
<!ENTITY scaffold.testing.delete "Delete"> <!ENTITY scaffold.testing.run "Run">
<!ENTITY scaffold.testing.run "Run"> <!ENTITY scaffold.testing.update "Run and Update">
<!ENTITY scaffold.testing.update "Update"> <!ENTITY scaffold.testing.create.web "Create Web Test">
<!ENTITY scaffold.testing.new "New Web"> <!ENTITY scaffold.testing.create.import "Create Import Test">
<!ENTITY scaffold.testing.new.import "New Import"> <!ENTITY scaffold.testing.create.search "Create Search Test">
<!ENTITY scaffold.testing.edit.import "Edit Import"> <!ENTITY scaffold.testing.edit "Edit Input">
<!ENTITY scaffold.testing.copyToClipboard "Copy to Clipboard"> <!ENTITY scaffold.testing.copyToClipboard "Copy Input to Clipboard">
<!ENTITY scaffold.testing.openUrl "Open URL"> <!ENTITY scaffold.testing.openUrl "Open URL">
<!ENTITY scaffold.testing.openUrl.internally "In Browser Tab"> <!ENTITY scaffold.testing.openUrl.internally "In Browser Tab">
<!ENTITY scaffold.testing.openUrl.externally "In External Browser"> <!ENTITY scaffold.testing.openUrl.externally "In External Browser">

Binary file not shown.

Before

Width:  |  Height:  |  Size: 537 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 750 B

After

Width:  |  Height:  |  Size: 1.2 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 825 B

View file

@ -1,74 +1,58 @@
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
@namespace html url("http://www.w3.org/1999/xhtml"); @namespace html url("http://www.w3.org/1999/xhtml");
toolbar { #tb-new {
height: 32px; list-style-image: url('chrome://scaffold/skin/new.png');
padding-left: 6px;
}
.toolbarbutton-text {
margin:0 2px;
}
.toolbarbutton-menu-dropmarker {
margin-right:4px;
}
.toolbarbutton-text {
margin:0;
}
.toolbarbutton-icon {
height: 16px;
}
toolbarseparator {
height: 24px;
} }
#tb-load { #tb-load {
list-style-image: url('chrome://scaffold/skin/load.png'); list-style-image: url('chrome://scaffold/skin/load.png');
} }
#tb-save { #tb-save {
list-style-image: url('chrome://scaffold/skin/save.png'); list-style-image: url('chrome://scaffold/skin/save.png');
} }
#tb-saveToZotero { #tb-saveToZotero {
list-style-image: url('chrome://scaffold/skin/saveToZotero.png'); list-style-image: url('chrome://scaffold/skin/saveToZotero.png');
} }
#tb-template { #tb-template {
list-style-image: url('chrome://scaffold/skin/add.png'); list-style-image: url('chrome://scaffold/skin/add.png');
} }
#tb-import { #tb-import {
list-style-image: url('chrome://scaffold/skin/import.png'); list-style-image: url('chrome://scaffold/skin/import.png');
} }
#tb-export { #tb-export {
list-style-image: url('chrome://scaffold/skin/export.png'); list-style-image: url('chrome://scaffold/skin/export.png');
} }
#tb-copy { #tb-copy {
list-style-image: url('chrome://scaffold/skin/copy.png'); list-style-image: url('chrome://scaffold/skin/copy.png');
} }
#tb-checkSyntax {
list-style-image: url('chrome://scaffold/skin/checkSyntax.png'); #tb-detect {
}
#tb-detectWeb {
list-style-image: url('chrome://scaffold/skin/detectWeb.png'); list-style-image: url('chrome://scaffold/skin/detectWeb.png');
} }
#tb-doWeb {
#tb-do {
list-style-image: url('chrome://scaffold/skin/doWeb.png'); list-style-image: url('chrome://scaffold/skin/doWeb.png');
} }
#tb-detectImport {
list-style-image: url('chrome://scaffold/skin/detectImport.png');
}
#tb-doImport {
list-style-image: url('chrome://scaffold/skin/doImport.png');
}
#tb-setTranslatorsDir { #tb-setTranslatorsDir {
list-style-image: url('chrome://scaffold/skin/setTranslatorsDir.png'); list-style-image: url('chrome://scaffold/skin/setTranslatorsDir.png');
} }
#tb-reference {
list-style-image: url('chrome://scaffold/skin/reference.png');
}
#tb-fields { #tb-fields {
list-style-image: url('chrome://scaffold/skin/fields.png'); list-style-image: url('chrome://scaffold/skin/fields.png');
} }
#tb-template {
list-style-image: url('chrome://scaffold/skin/add.png');
}
#tabpanel-metadata textbox { #tabpanel-metadata textbox {
height:2em; height:2em;
} }
@ -85,18 +69,44 @@ listbox {
min-width:200px; min-width:200px;
} }
#editor-toolbar { #zotero-toolbar {
border-top: .5px solid darkgray;
margin-bottom: 3px; margin-bottom: 3px;
} }
#editor-external-box { #zotero-toolbar toolbarseparator {
margin-top: 5px; height: 18px;
}
#editor-external-box label {
margin-left: 1px;
} }
browser { browser {
background: white; background: white;
} }
vbox > splitter {
cursor: row-resize;
}
listbox[disabled], toolbarbutton[disabled] {
opacity: 0.6;
pointer-events: none;
}
dialog listbox > listitem[disabled] {
font-weight: 600;
}
#left-tabbox {
margin-top: 5px;
}
#checkboxes-translatorType checkbox {
margin-right: 10px;
}
#tabpanel-metadata label:first-child {
text-align: right;
}
.listcol-testMessage {
width: 200px;
}

View file

@ -202,3 +202,6 @@ pref("extensions.zotero.retractions.recentItems", "[]");
pref("extensions.zotero.annotations.noteTemplates.title", "<h1>{{title}}<br/>({{date}})</h1>"); pref("extensions.zotero.annotations.noteTemplates.title", "<h1>{{title}}<br/>({{date}})</h1>");
pref("extensions.zotero.annotations.noteTemplates.highlight", "<p>{{highlight quotes='true'}} {{citation}} {{comment}}</p>"); pref("extensions.zotero.annotations.noteTemplates.highlight", "<p>{{highlight quotes='true'}} {{citation}} {{comment}}</p>");
pref("extensions.zotero.annotations.noteTemplates.note", "<p>{{citation}} {{comment}}</p>"); pref("extensions.zotero.annotations.noteTemplates.note", "<p>{{citation}} {{comment}}</p>");
// Scaffold
pref("extensions.zotero.scaffold.eslint.enabled", true);

11
package-lock.json generated
View file

@ -12,6 +12,7 @@
"ace-builds": "^1.4.12", "ace-builds": "^1.4.12",
"bluebird": "^3.5.1", "bluebird": "^3.5.1",
"classnames": "^2.2.6", "classnames": "^2.2.6",
"monaco-editor": "^0.15.6",
"prop-types": "^15.8.0", "prop-types": "^15.8.0",
"react": "^17.0.2", "react": "^17.0.2",
"react-autosuggest": "^10.1.0", "react-autosuggest": "^10.1.0",
@ -5164,6 +5165,11 @@
"node": ">= 0.6" "node": ">= 0.6"
} }
}, },
"node_modules/monaco-editor": {
"version": "0.15.6",
"resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.15.6.tgz",
"integrity": "sha512-JoU9V9k6KqT9R9Tiw1RTU8ohZ+Xnf9DMg6Ktqqw5hILumwmq7xqa/KLXw513uTUsWbhtnHoSJYYR++u3pkyxJg=="
},
"node_modules/ms": { "node_modules/ms": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@ -11332,6 +11338,11 @@
"xtend": "^4.0.0" "xtend": "^4.0.0"
} }
}, },
"monaco-editor": {
"version": "0.15.6",
"resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.15.6.tgz",
"integrity": "sha512-JoU9V9k6KqT9R9Tiw1RTU8ohZ+Xnf9DMg6Ktqqw5hILumwmq7xqa/KLXw513uTUsWbhtnHoSJYYR++u3pkyxJg=="
},
"ms": { "ms": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",

View file

@ -19,6 +19,7 @@
"ace-builds": "^1.4.12", "ace-builds": "^1.4.12",
"bluebird": "^3.5.1", "bluebird": "^3.5.1",
"classnames": "^2.2.6", "classnames": "^2.2.6",
"monaco-editor": "^0.15.6",
"prop-types": "^15.8.0", "prop-types": "^15.8.0",
"react": "^17.0.2", "react": "^17.0.2",
"react-autosuggest": "^10.1.0", "react-autosuggest": "^10.1.0",

1
resource/vs Symbolic link
View file

@ -0,0 +1 @@
../node_modules/monaco-editor/min/vs

View file

@ -14,7 +14,8 @@ const symlinkDirs = [
'chrome/content/zotero/xpcom/rdf', 'chrome/content/zotero/xpcom/rdf',
'chrome/content/zotero/xpcom/translate/src', 'chrome/content/zotero/xpcom/translate/src',
'styles', 'styles',
'translators' 'translators',
'resource/vs'
]; ];
// list of folders which are copied to the build folder // list of folders which are copied to the build folder