diff --git a/.classpath b/.classpath index f3a024c95..cb9a7d8b6 100644 --- a/.classpath +++ b/.classpath @@ -4,13 +4,15 @@ + - + + @@ -127,5 +129,7 @@ + + diff --git a/extensions/build.xml b/extensions/build.xml index ed44ecab7..b229e6093 100644 --- a/extensions/build.xml +++ b/extensions/build.xml @@ -13,7 +13,8 @@ - + + @@ -22,12 +23,14 @@ - + + - + + diff --git a/extensions/wikidata/.classpath b/extensions/wikidata/.classpath new file mode 100644 index 000000000..d44b29c4b --- /dev/null +++ b/extensions/wikidata/.classpath @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extensions/wikidata/.gitignore b/extensions/wikidata/.gitignore new file mode 100644 index 000000000..09edcb05e --- /dev/null +++ b/extensions/wikidata/.gitignore @@ -0,0 +1,3 @@ +tests/classes/ +tests/report/ +tests/test-output/ diff --git a/extensions/wikidata/build.xml b/extensions/wikidata/build.xml new file mode 100644 index 000000000..f3e01d188 --- /dev/null +++ b/extensions/wikidata/build.xml @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extensions/wikidata/credits.txt b/extensions/wikidata/credits.txt new file mode 100644 index 000000000..f6a21a1b1 --- /dev/null +++ b/extensions/wikidata/credits.txt @@ -0,0 +1,32 @@ +#------------------------------------------------------------------------------- +# Copyright (C) 2018 Antonin Delpeuch +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +#------------------------------------------------------------------------------- + + +The following images were obtained from Wikimedia Commons: +- Information.svg by User:Bobarino: (CC BY-SA) + https://commons.wikimedia.org/wiki/File:Information.svg +- Warning.svg by User:Ezekiel63745 (CC BY-SA) + https://commons.wikimedia.org/wiki/File:Information_orange.svg +- Important.svg originally from David Vignoni (GNU LGPL) + https://commons.wikimedia.org/wiki/File:Nuvola_apps_important.svg +- Critical.svg by User:Stannered (CC BY-SA) + https://commons.wikimedia.org/wiki/File:Stop_x_nuvola.svg diff --git a/extensions/wikidata/module/MOD-INF/controller.js b/extensions/wikidata/module/MOD-INF/controller.js new file mode 100644 index 000000000..e2e36dda1 --- /dev/null +++ b/extensions/wikidata/module/MOD-INF/controller.js @@ -0,0 +1,78 @@ + +importPackage(org.openrefine.wikidata.commands); + +/* + * Function invoked to initialize the extension. + */ +function init() { + var RefineServlet = Packages.com.google.refine.RefineServlet; + RefineServlet.registerClassMapping( + "org.openrefine.wikidata.operations.SaveWikibaseSchemaOperation$WikibaseSchemaChange", + "org.openrefine.wikidata.operations.SaveWikibaseSchemaOperation$WikibaseSchemaChange"); + RefineServlet.registerClassMapping( + "org.openrefine.wikidata.operations.PerformWikibaseEditsOperation$PerformWikibaseEditsChange", + "org.openrefine.wikidata.operations.PerformWikibaseEditsOperation$PerformWikibaseEditsChange"); + + RefineServlet.cacheClass(Packages.org.openrefine.wikidata.operations.SaveWikibaseSchemaOperation$WikibaseSchemaChange); + RefineServlet.cacheClass(Packages.org.openrefine.wikidata.operations.PerformWikibaseEditsOperation$PerformWikibaseEditsChange); + + /* + * Attach a Wikibase schema to each project. + */ + Packages.com.google.refine.model.Project.registerOverlayModel( + "wikibaseSchema", + Packages.org.openrefine.wikidata.schema.WikibaseSchema); + + /* + * Operations + */ + Packages.com.google.refine.operations.OperationRegistry.registerOperation( + module, "save-wikibase-schema", Packages.org.openrefine.wikidata.operations.SaveWikibaseSchemaOperation); + Packages.com.google.refine.operations.OperationRegistry.registerOperation( + module, "perform-wikibase-edits", Packages.org.openrefine.wikidata.operations.PerformWikibaseEditsOperation); + + /* + * Exporters + */ + var ExporterRegistry = Packages.com.google.refine.exporters.ExporterRegistry; + var QSExporter = Packages.org.openrefine.wikidata.exporters.QuickStatementsExporter; + + ExporterRegistry.registerExporter("quickstatements", new QSExporter()); + + /* + * Commands + */ + RefineServlet.registerCommand(module, "save-wikibase-schema", new SaveWikibaseSchemaCommand()); + RefineServlet.registerCommand(module, "preview-wikibase-schema", new PreviewWikibaseSchemaCommand()); + RefineServlet.registerCommand(module, "perform-wikibase-edits", new PerformWikibaseEditsCommand()); + RefineServlet.registerCommand(module, "login", new LoginCommand()); + + /* + * Resources + */ + ClientSideResourceManager.addPaths( + "project/scripts", + module, + [ + "scripts/menu-bar-extension.js", + "scripts/warningsrenderer.js", + "scripts/langsuggest.js", + "scripts/bettersuggest.js", + "scripts/previewrenderer.js", + "scripts/dialogs/schema-alignment-dialog.js", + "scripts/dialogs/manage-account-dialog.js", + "scripts/dialogs/perform-edits-dialog.js", + "scripts/jquery.uls.data.js", + ]); + + ClientSideResourceManager.addPaths( + "project/styles", + module, + [ + "styles/dialogs/schema-alignment-dialog.css", + "styles/dialogs/manage-account-dialog.less", + "styles/dialogs/perform-edits.less", + ]); + +} + diff --git a/extensions/wikidata/module/MOD-INF/lib-src/wdtk-datamodel-0.9.0-SNAPSHOT-sources.jar b/extensions/wikidata/module/MOD-INF/lib-src/wdtk-datamodel-0.9.0-SNAPSHOT-sources.jar new file mode 100644 index 000000000..975097035 Binary files /dev/null and b/extensions/wikidata/module/MOD-INF/lib-src/wdtk-datamodel-0.9.0-SNAPSHOT-sources.jar differ diff --git a/extensions/wikidata/module/MOD-INF/lib-src/wdtk-wikibaseapi-0.9.0-SNAPSHOT-sources.jar b/extensions/wikidata/module/MOD-INF/lib-src/wdtk-wikibaseapi-0.9.0-SNAPSHOT-sources.jar new file mode 100644 index 000000000..bfb4c41f8 Binary files /dev/null and b/extensions/wikidata/module/MOD-INF/lib-src/wdtk-wikibaseapi-0.9.0-SNAPSHOT-sources.jar differ diff --git a/extensions/wikidata/module/MOD-INF/lib/wdtk-datamodel-0.9.0-SNAPSHOT-jar-with-dependencies.jar b/extensions/wikidata/module/MOD-INF/lib/wdtk-datamodel-0.9.0-SNAPSHOT-jar-with-dependencies.jar new file mode 100644 index 000000000..4cefe5a59 Binary files /dev/null and b/extensions/wikidata/module/MOD-INF/lib/wdtk-datamodel-0.9.0-SNAPSHOT-jar-with-dependencies.jar differ diff --git a/extensions/wikidata/module/MOD-INF/lib/wdtk-wikibaseapi-0.9.0-SNAPSHOT.jar b/extensions/wikidata/module/MOD-INF/lib/wdtk-wikibaseapi-0.9.0-SNAPSHOT.jar new file mode 100644 index 000000000..fb099272b Binary files /dev/null and b/extensions/wikidata/module/MOD-INF/lib/wdtk-wikibaseapi-0.9.0-SNAPSHOT.jar differ diff --git a/extensions/wikidata/module/MOD-INF/module.properties b/extensions/wikidata/module/MOD-INF/module.properties new file mode 100644 index 000000000..a158dbdeb --- /dev/null +++ b/extensions/wikidata/module/MOD-INF/module.properties @@ -0,0 +1,3 @@ +name = wikidata +description = OpenRefine Wikidata export +requires = core diff --git a/extensions/wikidata/module/images/Critical.png b/extensions/wikidata/module/images/Critical.png new file mode 100644 index 000000000..bfbee49ea Binary files /dev/null and b/extensions/wikidata/module/images/Critical.png differ diff --git a/extensions/wikidata/module/images/Critical.svg b/extensions/wikidata/module/images/Critical.svg new file mode 100644 index 000000000..2798405d4 --- /dev/null +++ b/extensions/wikidata/module/images/Critical.svg @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extensions/wikidata/module/images/Important.png b/extensions/wikidata/module/images/Important.png new file mode 100644 index 000000000..dbb3e4ae8 Binary files /dev/null and b/extensions/wikidata/module/images/Important.png differ diff --git a/extensions/wikidata/module/images/Important.svg b/extensions/wikidata/module/images/Important.svg new file mode 100644 index 000000000..2798405d4 --- /dev/null +++ b/extensions/wikidata/module/images/Important.svg @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extensions/wikidata/module/images/Information.png b/extensions/wikidata/module/images/Information.png new file mode 100644 index 000000000..3e0b60464 Binary files /dev/null and b/extensions/wikidata/module/images/Information.png differ diff --git a/extensions/wikidata/module/images/Information.svg b/extensions/wikidata/module/images/Information.svg new file mode 100644 index 000000000..3a43f1128 --- /dev/null +++ b/extensions/wikidata/module/images/Information.svg @@ -0,0 +1,252 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extensions/wikidata/module/images/Warning.png b/extensions/wikidata/module/images/Warning.png new file mode 100644 index 000000000..baf31b7cb Binary files /dev/null and b/extensions/wikidata/module/images/Warning.png differ diff --git a/extensions/wikidata/module/images/Warning.svg b/extensions/wikidata/module/images/Warning.svg new file mode 100644 index 000000000..9efc4d9c8 --- /dev/null +++ b/extensions/wikidata/module/images/Warning.svg @@ -0,0 +1,348 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extensions/wikidata/module/images/Wikidata-logo-en.svg b/extensions/wikidata/module/images/Wikidata-logo-en.svg new file mode 100644 index 000000000..fbb40e4d0 --- /dev/null +++ b/extensions/wikidata/module/images/Wikidata-logo-en.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/extensions/wikidata/module/images/wikidata.png b/extensions/wikidata/module/images/wikidata.png new file mode 100644 index 000000000..d0aa6d802 Binary files /dev/null and b/extensions/wikidata/module/images/wikidata.png differ diff --git a/extensions/wikidata/module/langs/translation-en.json b/extensions/wikidata/module/langs/translation-en.json new file mode 100644 index 000000000..9806d62b4 --- /dev/null +++ b/extensions/wikidata/module/langs/translation-en.json @@ -0,0 +1,205 @@ +{ + "wikidata-extension": { + "menu-label": "Wikidata", + "edit-wikidata-schema": "Edit Wikidata schema", + "manage-wikidata-account": "Manage Wikidata account", + "perform-edits-on-wikidata": "Upload edits to Wikidata", + "export-to-qs": "Export to QuickStatements", + "quickstatements-export-name": "QuickStatements" + }, + "wikidata-schema": { + "dialog-header": "Align to Wikidata", + "dialog-explanation": "The Wikidata schema below specifies how your tabular data will be transformed into Wikidata edits. You can drag and drop the column names below in most input boxes: for each row, edits will be generated with the values in these columns.", + "preview-explanation": "This tab shows the first edits (out of {nb_edits}) that will be made once you upload the changes to Wikidata. You can use facets to inspect the edits on particular items.", + "schema-tab-header": "Schema", + "warnings-tab-header": "Issues", + "edits-preview-tab-header": "Preview", + "statements-header": "Statements", + "terms-header": "Terms", + "empty-statements": "no statements added", + "empty-terms": "no labels, descriptions or aliases added", + "add-item-button": "add item", + "add-term": "add term", + "remove": "remove", + "add-statement": "add statement", + "add-value": "add value", + "add-qualifier": "add qualifier", + "add-reference": "add reference", + "add-reference-snak": "add", + "property-placeholder": "property", + "nb-references": " references", + "remove-column": "remove column", + "label": "Label", + "description": "Description", + "alias": "Alias", + "item-or-reconciled-column": "type item or drag reconciled column here", + "amount": "amount", + "unit": "unit", + "full-url": "full URL including the protocol", + "tabular-data-with-prefix": "filename starting with \"Data:\"", + "commons-media": "filename", + "math-expression": "mathematical expression", + "geoshape-with-prefix": "filename starting with \"Data:\"", + "datatype-not-supported-yet": "This datatype is not supported yet, sorry.", + "invalid-schema-warning-issues": "Your schema is incomplete, fix it to see the issues.", + "invalid-schema-warning-preview": "Your schema is incomplete, fix it to see the preview.", + "discard-button": "Discard changes", + "save-button": "Save schema", + "close-button": "Close", + "unsaved-changes-alt": "You have made unsaved changes to your Wikidata schema.", + "save-schema-alt": "Save the schema to OpenRefine. The changes will not be uploaded to Wikidata yet.", + "discard-schema-changes-alt": "Discard the changes made to the schema.", + "incomplete-schema-could-not-be-saved": "Your schema is incomplete so it cannot be saved yet.", + "unsaved-warning": "You have made unsaved changes to your Wikidata schema. Close anyway?" + }, + "wikidata-preview": { + "new-id": "new item" + }, + "wikidata-account": { + "dialog-header": "Wikidata account", + "explain-log-in": "Logging in to Wikidata lets you to upload edits directly from OpenRefine.", + "username-label": "Username:", + "username-placeholder": "Enter your username", + "password-label": "Password:", + "password-placeholder": "Enter your password", + "remember-credentials-label": "Remember credentials (stored unencrypted in OpenRefine's preferences)", + "close": "Close", + "log-in": "Log in", + "logged-in-as": "You are logged in as:", + "log-out": "Log out", + "connecting-to-wikidata": "Connecting to Wikidata..." + }, + "perform-wikidata-edits": { + "dialog-header": "Upload edits to Wikidata", + "review-your-edits": "You are about to upload {nb_edits} edits to Wikidata. Please check them carefully. Large edit batches should be submitted for bot review first.", + "logged-in-as": "You are logged in as", + "edit-summary-label": "Edit summary:", + "edit-summary-placeholder": "a few words to describe your edits", + "perform-edits": "Upload edits", + "cancel": "Cancel", + "analyzing-edits": "Analyzing your edits..." + }, + "warnings-messages": { + "new-item-created": { + "title": "This edit batch will create new Wikidata items.", + "body": "Please make sure that these items do not exist yet and are suitable for inclusion in Wikidata." + }, + "new-item-without-labels-or-aliases": { + "title": "New items created without any label or alias.", + "body": "You should at least provide one label for new items such as {example_entity}, so that others can understand what the item is about." + }, + "new-item-without-descriptions": { + "title": "New items created without any description.", + "body": "Adding descriptions on new items such as {example_entity} will make it easier to disambiguate the items from namesakes." + }, + "new-item-with-deleted-statements": { + "title": "Deleting statements on new items.", + "body": "There is probably something wrong in your schema or project." + }, + "new-item-without-P31-or-P279": { + + "title": "New items created without any type.", + "body": "You should provide an \"instance of\" (P31) or \"subclass of\" (P279) statement for each item that you create, such as {example_entity}." + }, + "add-statements-with-invalid-format": { + "title": "{property_entity} statements with invalid format.", + "body": "Values for this property are expected to match the regular expression {regex}, which is not the case for {example_value} added on {example_item_entity}." + }, + "remove-statements-with-invalid-format": { + "title": "Removed statements with invalid format.", + "body": "If these statements currently exist on Wikidata, this will solve constraint violations." + }, + "missing-inverse-statements": { + "title": "Inverse statements missing for {added_property_entity}.", + "body": "Any {added_property_entity} statement such as the one from {source_entity} to {target_entity} should also be added in reverse with {inverse_property_entity}: in this case, {target_entity} {inverse_property_entity} {source_entity}." + }, + "self-referential-statements": { + "title": "Self-referential statements.", + "body": "While not forbidden, self-referential statements are generally suspicious. You have some on {example_entity}." + }, + "unsourced-statements": { + "title": "Statements without references.", + "body": "Most statements should have references. You can add them easily in the schema." + }, + "property-restricted-to-reference-found-in-mainsnak": { + "title": "{property_entity} used as statement.", + "body": "You are using {property_entity} in a statement but it is designed to be used in references only." + }, + "property-restricted-to-reference-found-in-qualifier": { + "title": "{property_entity} used as qualifier.", + "body": "You are using in {property_entity} in a qualifier but it is designed to be used in references only." + }, + "property-restricted-to-qualifier-found-in-mainsnak": { + "title": "{property_entity} used as statement.", + "body": "You are using {property_entity} in a statement but it is designed to be used in qualifiers only." + }, + "property-restricted-to-qualifier-found-in-reference": { + "title": "{property_entity} used as reference.", + "body": "You are using {property_entity} in a reference but it is designed to be used in qualifiers only." + }, + "property-restricted-to-mainsnak-found-in-qualifier": { + "title": "{property_entity} used as qualifier.", + "body": "You are using {property_entity} in a qualifier but it is designed to be used as a statement only." + }, + "property-restricted-to-mainsnak-found-in-reference": { + "title": "{property_entity} used as reference.", + "body": "You are using {property_entity} in a reference but it is designed to be used as a statement only." + }, + "missing-mandatory-qualifiers": { + "title": "{statement_property_entity} is missing a {missing_property_entity} qualifier.", + "body": "Statements using {statement_property_entity} such as the one on {example_item_entity} are missing a mandatory {missing_property_entity} qualifier." + }, + "disallowed-qualifiers": { + "title": "Qualifier {disallowed_property_entity} is incompatible with {statement_property_entity}.", + "body": "Statements using {statement_property_entity} such as the one on {example_item_entity} should not have a {disallowed_property_entity} qualifier as they are incompatible." + }, + "single-valued-property-added-more-than-once": { + "title": "{property_entity} added more than once on the same item.", + "body": "This property is expected to be used at most once on each item but has been added multiple times on the same item, for instance on {example_entity}." + }, + "identical-values-for-distinct-valued-property": { + "title": "Identical values for {property_entity}", + "body": "This property should have distinct values, but the same value was found on {item1_entity} and {item2_entity} for instance." + }, + "no-edit-generated": { + "title": "No edit was generated.", + "body": "There might be something wrong with your schema." + }, + "no-issue-detected": { + "title": "No issue was detected in your edits.", + "body": "Note that OpenRefine cannot detect all the types of problems Wikidata edits can have." + }, + "ignored-qualifiers": { + "title": "Some qualifiers were ignored.", + "body": "Qualifier values could not be parsed, so they will not be added to the corresponding statements." + }, + "ignored-references": { + "title": "Some references were ignored.", + "body": "None of their statements could be parsed, so no reference was added." + }, + "monolingual-text-without-language": { + "title": "No language provided for monolingual text.", + "body": "Some label, description, alias or monolingual text value have been skipped because no language was provided. Example value: {example_text}." + }, + "leading-whitespace": { + "title": "Leading whitespace in strings.", + "body": "Strings such as {example_string} have leading whitespace." + }, + "trailing-whitespace": { + "title": "Trailing whitespace in strings.", + "body": "Strings such as {example_string} have trailing whitespace." + }, + "duplicate-whitespace": { + "title": "Duplicate whitespace in strings.", + "body": "Strings such as {example_string} contain duplicate whitespace." + }, + "non-printable-characters": { + "title": "Non-printable characters in strings.", + "body": "Strings such as {example_string} contain non-printable characters." + }, + "invalid-identifier-space": { + "title": "Invalid identifier space for reconciled cells.", + "body": "Some reconciled cells such as {example_cell} were ignored because they are not reconciled to Wikidata." + } + } +} diff --git a/extensions/wikidata/module/scripts/bettersuggest.js b/extensions/wikidata/module/scripts/bettersuggest.js new file mode 100644 index 000000000..58fb8bec3 --- /dev/null +++ b/extensions/wikidata/module/scripts/bettersuggest.js @@ -0,0 +1,22 @@ + +/** + * Adds a few tweaks to a suggest widget, mostly to indicate + * the status of the validation. + */ +var fixSuggestInput = function(input) { + input.bind("fb-select", function(evt, data) { + input.addClass('wbs-validated-input'); + input.blur(); + }).bind("fb-textchange", function(evt, data) { + input.removeClass('wbs-validated-input'); + }).blur(function() { + setTimeout(function() { + if(! input.hasClass('wbs-validated-input')) { + input.addClass('wbs-unvalidated-input'); + } + }, 100); + }).focus(function() { + input.removeClass('wbs-unvalidated-input'); + }); +} + diff --git a/extensions/wikidata/module/scripts/dialogs/manage-account-dialog.html b/extensions/wikidata/module/scripts/dialogs/manage-account-dialog.html new file mode 100644 index 000000000..0a5679b65 --- /dev/null +++ b/extensions/wikidata/module/scripts/dialogs/manage-account-dialog.html @@ -0,0 +1,49 @@ +
+
+
+ + + + +
+
diff --git a/extensions/wikidata/module/scripts/dialogs/manage-account-dialog.js b/extensions/wikidata/module/scripts/dialogs/manage-account-dialog.js new file mode 100644 index 000000000..f319f1158 --- /dev/null +++ b/extensions/wikidata/module/scripts/dialogs/manage-account-dialog.js @@ -0,0 +1,114 @@ +var ManageAccountDialog = {}; + +ManageAccountDialog.firstLogin = true; + +ManageAccountDialog.launch = function(logged_in_username, callback) { + $.post( + "command/core/get-all-preferences", + null, + function (preferences) { + ManageAccountDialog.display(logged_in_username, preferences.wikidata_credentials, callback); + }, + "json" + ); +}; + +ManageAccountDialog.display = function(logged_in_username, saved_credentials, callback) { + var self = this; + var frame = $(DOM.loadHTML("wikidata", "scripts/dialogs/manage-account-dialog.html")); + var elmts = this._elmts = DOM.bind(frame); + ManageAccountDialog.firstLaunch = false; + + this._elmts.dialogHeader.text($.i18n._('wikidata-account')["dialog-header"]); + this._elmts.explainLogIn.html($.i18n._('wikidata-account')["explain-log-in"]); + this._elmts.usernameLabel.text($.i18n._('wikidata-account')["username-label"]); + this._elmts.usernameInput.attr("placeholder", $.i18n._('wikidata-account')["username-placeholder"]); + this._elmts.passwordLabel.text($.i18n._('wikidata-account')["password-label"]); + this._elmts.passwordInput.attr("placeholder", $.i18n._('wikidata-account')["password-placeholder"]); + this._elmts.rememberCredentialsLabel.text($.i18n._('wikidata-account')["remember-credentials-label"]); + this._elmts.dialogHeader.text($.i18n._('wikidata-account')["dialog-header"]); + this._elmts.cancelButton1.text($.i18n._('wikidata-account')["close"]); + this._elmts.cancelButton2.text($.i18n._('wikidata-account')["close"]); + this._elmts.loggedInAs.text($.i18n._('wikidata-account')["logged-in-as"]); + this._elmts.logoutButton.text($.i18n._('wikidata-account')["log-out"]); + this._elmts.loginButton.text($.i18n._('wikidata-account')["log-in"]); + + this._level = DialogSystem.showDialog(frame); + + var dismiss = function() { + DialogSystem.dismissUntil(self._level - 1); + }; + + if (logged_in_username != null) { + elmts.loginArea.hide(); + } else { + elmts.logoutArea.hide(); + } + + elmts.loggedInUsername + .text(logged_in_username) + .attr('href', 'https://www.wikidata.org/wiki/User:'+logged_in_username); + + frame.find('.cancel-button').click(function() { + dismiss(); + callback(null); + }); + + elmts.loginButton.click(function() { + frame.hide(); + $.post( + "command/wikidata/login", + elmts.loginForm.serialize(), + function(data) { + if (data.logged_in) { + dismiss(); + callback(data.username); + } else { + frame.show(); + elmts.invalidCredentials.text("Invalid credentials."); + } + }); + }); + + elmts.logoutButton.click(function() { + $.post( + "command/wikidata/login", + "logout=true", + function(data) { + if (!data.logged_in) { + dismiss(); + callback(null); + } + }); + }); +}; + +ManageAccountDialog.isLoggedIn = function(callback) { + var discardWaiter = function() { }; + if(ManageAccountDialog.firstLogin) { + discardWaiter = DialogSystem.showBusy($.i18n._('wikidata-account')["connecting-to-wikidata"]); + } + $.get( + "command/wikidata/login", + function(data) { + discardWaiter(); + ManageAccountDialog.firstLogin = false; + callback(data.username); + }); +}; + +ManageAccountDialog.ensureLoggedIn = function(callback) { + ManageAccountDialog.isLoggedIn(function(logged_in_username) { + if (logged_in_username == null) { + ManageAccountDialog.launch(null, callback); + } else { + callback(logged_in_username); + } + }); +}; + +ManageAccountDialog.checkAndLaunch = function () { + ManageAccountDialog.isLoggedIn(function(logged_in_username) { + ManageAccountDialog.launch(logged_in_username, function(success) { }); + }); +}; diff --git a/extensions/wikidata/module/scripts/dialogs/perform-edits-dialog.html b/extensions/wikidata/module/scripts/dialogs/perform-edits-dialog.html new file mode 100644 index 000000000..32b2e2e40 --- /dev/null +++ b/extensions/wikidata/module/scripts/dialogs/perform-edits-dialog.html @@ -0,0 +1,17 @@ +
+
+
+

+

+
+
+
+

.

+

+ +
+
+
diff --git a/extensions/wikidata/module/scripts/dialogs/perform-edits-dialog.js b/extensions/wikidata/module/scripts/dialogs/perform-edits-dialog.js new file mode 100644 index 000000000..64bc16a5f --- /dev/null +++ b/extensions/wikidata/module/scripts/dialogs/perform-edits-dialog.js @@ -0,0 +1,115 @@ +var PerformEditsDialog = {}; + +PerformEditsDialog.launch = function(logged_in_username, max_severity) { + var self = this; + var elmts = this._elmts; + var frame = this.frame; + + if (this.missingSchema) { + return; + } + + this._level = DialogSystem.showDialog(frame); + + this._elmts.dialogHeader.text($.i18n._('perform-wikidata-edits')["dialog-header"]); + this._elmts.loggedInAs.text($.i18n._('perform-wikidata-edits')["logged-in-as"]); + this._elmts.editSummaryLabel.text($.i18n._('perform-wikidata-edits')["edit-summary-label"]); + this._elmts.editSummary.attr('placeholder', $.i18n._('perform-wikidata-edits')["edit-summary-placeholder"]); + this._elmts.performEditsButton.text($.i18n._('perform-wikidata-edits')["perform-edits"]); + this._elmts.cancelButton.text($.i18n._('perform-wikidata-edits')["cancel"]); + + var dismiss = function() { + DialogSystem.dismissUntil(self._level - 1); + }; + + elmts.loggedInUsername + .text(logged_in_username) + .attr('href','https://www.wikidata.org/wiki/User:'+logged_in_username); + + frame.find('.cancel-button').click(function() { + dismiss(); + }); + + if (max_severity === 'CRITICAL') { + elmts.performEditsButton.prop("disabled",true).addClass("button-disabled"); + } else { + elmts.performEditsButton.click(function() { + if(elmts.editSummary.val().length == 0) { + elmts.editSummary.focus(); + } else { + Refine.postProcess( + "wikidata", + "perform-wikibase-edits", + {}, + { + summary: elmts.editSummary.val(), + }, + { includeEngine: true, cellsChanged: true, columnStatsChanged: true }, + { onDone: + function() { + dismiss(); + } + }); + } + }); + } +}; + +PerformEditsDialog.updateEditCount = function(edit_count) { + this._elmts.reviewYourEdits.html( + $.i18n._('perform-wikidata-edits')["review-your-edits"] + .replace('{nb_edits}', edit_count)); +} + +PerformEditsDialog._updateWarnings = function(data) { + var warnings = data.warnings; + var mainDiv = this._elmts.warningsArea; + + // clear everything + mainDiv.empty(); + PerformEditsDialog.updateEditCount(data.edit_count); + + var table = $('
').appendTo(mainDiv); + for (var i = 0; i != warnings.length; i++) { + var rendered = WarningsRenderer._renderWarning(warnings[i]); + rendered.appendTo(table); + } +} + +PerformEditsDialog.checkAndLaunch = function () { + var self = this; + this.frame = $(DOM.loadHTML("wikidata", "scripts/dialogs/perform-edits-dialog.html")); + this._elmts = DOM.bind(this.frame); + this.missingSchema = false; + + var onSaved = function() { + ManageAccountDialog.ensureLoggedIn(function(logged_in_username) { + if (logged_in_username) { + var discardWaiter = DialogSystem.showBusy($.i18n._('perform-wikidata-edits')["analyzing-edits"]); + $.post( + "command/wikidata/preview-wikibase-schema?" + $.param({ project: theProject.id }), + { engine: JSON.stringify(ui.browsingEngine.getJSON()) }, + function(data) { + discardWaiter(); + if(data['code'] != 'error') { + PerformEditsDialog._updateWarnings(data); + PerformEditsDialog.launch(logged_in_username, data['max_severity']); + } else { + SchemaAlignmentDialog.launch( + PerformEditsDialog.checkAndLaunch); + } + }, + "json" + ); + } + }); + }; + + + if (SchemaAlignmentDialog.isSetUp() && SchemaAlignmentDialog._hasUnsavedChanges) { + SchemaAlignmentDialog._save(onSaved); + } else { + onSaved(); + } + +}; diff --git a/extensions/wikidata/module/scripts/dialogs/schema-alignment-dialog.html b/extensions/wikidata/module/scripts/dialogs/schema-alignment-dialog.html new file mode 100644 index 000000000..7e05b6ea4 --- /dev/null +++ b/extensions/wikidata/module/scripts/dialogs/schema-alignment-dialog.html @@ -0,0 +1,49 @@ +
+
+
+
+
    +
  • +
  • +
  • +
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
diff --git a/extensions/wikidata/module/scripts/dialogs/schema-alignment-dialog.js b/extensions/wikidata/module/scripts/dialogs/schema-alignment-dialog.js new file mode 100644 index 000000000..7a33ced1d --- /dev/null +++ b/extensions/wikidata/module/scripts/dialogs/schema-alignment-dialog.js @@ -0,0 +1,1192 @@ +/* + +Copyright 2010, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ + +var SchemaAlignment = {}; + +SchemaAlignment._cleanName = function(s) { + return s.replace(/\W/g, " ").replace(/\s+/g, " ").toLowerCase(); +}; + +var SchemaAlignmentDialog = {}; + +/** + * Installs the tabs in the UI the first time the Wikidata + * extension is called. + */ +SchemaAlignmentDialog.setUpTabs = function() { + var self = this; + this._rightPanel = $('#right-panel'); + this._viewPanel = $('#view-panel').addClass('main-view-panel-tab'); + this._toolPanel = $('#tool-panel'); + this._summaryBar = $('#summary-bar') + .addClass('main-view-panel-tab-header') + .addClass('active') + .attr('href', '#view-panel'); + + this._schemaPanel = $('
') + .addClass('main-view-panel-tab') + .appendTo(this._rightPanel); + this._issuesPanel = $('
') + .addClass('main-view-panel-tab') + .appendTo(this._rightPanel); + this._previewPanel = $('
') + .addClass('main-view-panel-tab') + .appendTo(this._rightPanel); + + var schemaButton = $('
') + .addClass('main-view-panel-tab-header') + .attr('href', '#wikidata-schema-panel') + .text($.i18n._('wikidata-schema')["schema-tab-header"]) + .appendTo(this._toolPanel); + var issuesButton = $('
') + .addClass('main-view-panel-tab-header') + .attr('href', '#wikidata-issues-panel') + .text($.i18n._('wikidata-schema')["warnings-tab-header"]+' ') + .appendTo(this._toolPanel); + this.issuesTabCount = $('') + .addClass('schema-alignment-total-warning-count') + .appendTo(issuesButton) + .hide(); + this.issueSpinner = $('') + .attr('src', 'images/large-spinner.gif') + .attr('width', '16px') + .appendTo(issuesButton); + var previewButton = $('
') + .addClass('main-view-panel-tab-header') + .attr('href', '#wikidata-preview-panel') + .text($.i18n._('wikidata-schema')["edits-preview-tab-header"]) + .appendTo(this._toolPanel); + this.previewSpinner = $('') + .attr('src', 'images/large-spinner.gif') + .attr('width', '16px') + .appendTo(previewButton); + + this._unsavedIndicator = $('') + .html(' *') + .attr('title', $.i18n._('wikidata-schema')["unsaved-changes-alt"]) + .hide() + .appendTo(schemaButton); + + $('.main-view-panel-tab-header').click(function(e) { + var targetTab = $(this).attr('href'); + SchemaAlignmentDialog.switchTab(targetTab); + e.preventDefault(); + }); + + /** + * Init the schema tab + */ + var schemaTab = $(DOM.loadHTML("wikidata", "scripts/schema-alignment-tab.html")).appendTo(this._schemaPanel); + var schemaElmts = this._schemaElmts = DOM.bind(schemaTab); + schemaElmts.dialogExplanation.text($.i18n._('wikidata-schema')["dialog-explanation"]); + this._plusButton($.i18n._('wikidata-schema')["add-item-button"], schemaElmts.addItemButton); + schemaElmts.addItemButton.click(function(e) { + self._addItem(); + SchemaAlignmentDialog._hasChanged(); + e.preventDefault(); + }); + schemaElmts.saveButton + .text($.i18n._('wikidata-schema')["save-button"]) + .attr('title', $.i18n._('wikidata-schema')["save-schema-alt"]) + .prop('disabled', true) + .addClass('disabled') + .click(function() { SchemaAlignmentDialog._save(); }); + schemaElmts.discardButton + .text($.i18n._('wikidata-schema')["discard-button"]) + .attr('title', $.i18n._('wikidata-schema')["discard-schema-changes-alt"]) + .prop('disabled', true) + .addClass('disabled') + .click(function() { SchemaAlignmentDialog._discardChanges(); }); + + this._wikibasePrefix = "http://www.wikidata.org/entity/"; // hardcoded for now + + // Init the column area + this.updateColumns(); + + var url = ReconciliationManager.ensureDefaultServicePresent(); + SchemaAlignmentDialog._reconService = ReconciliationManager.getServiceFromUrl(url); + + /** + * Init the issues tab + */ + var issuesTab = $(DOM.loadHTML("wikidata", "scripts/issues-tab.html")).appendTo(this._issuesPanel); + var issuesElmts = this._issuesElmts = DOM.bind(issuesTab); + issuesElmts.invalidSchemaWarningIssues.text($.i18n._('wikidata-schema')["invalid-schema-warning-issues"]); + + /** + * Init the preview tab + */ + var previewTab = $(DOM.loadHTML("wikidata", "scripts/preview-tab.html")).appendTo(this._previewPanel); + var previewElmts = this._previewElmts = DOM.bind(previewTab); + SchemaAlignmentDialog.updateNbEdits(0); + previewElmts.invalidSchemaWarningPreview.text($.i18n._('wikidata-schema')["invalid-schema-warning-preview"]); + + this._previewPanes = $(".schema-alignment-dialog-preview"); + + // Load the existing schema + this._reset(theProject.overlayModels.wikibaseSchema); + // Perform initial preview + this.preview(); +} + +SchemaAlignmentDialog.updateColumns = function() { + var columns = theProject.columnModel.columns; + this._columnArea = $(".schema-alignment-dialog-columns-area"); + this._columnArea.empty(); + for (var i = 0; i < columns.length; i++) { + var column = columns[i]; + var reconConfig = column.reconConfig; + var cell = SchemaAlignmentDialog._createDraggableColumn(column.name, + reconConfig && reconConfig.identifierSpace === this._wikibasePrefix && column.reconStats); + this._columnArea.append(cell); + } + + $('.wbs-reconciled-column').draggable({ + helper: "clone", + cursor: "crosshair", + snap: ".wbs-item-input input, .wbs-target-input input", + zIndex: 100, + }); + $('.wbs-unreconciled-column').draggable({ + helper: "clone", + cursor: "crosshair", + snap: ".wbs-target-input input", + zIndex: 100, + }); +} + +SchemaAlignmentDialog.switchTab = function(targetTab) { + $('.main-view-panel-tab').hide(); + $('.main-view-panel-tab-header').removeClass('active'); + $('.main-view-panel-tab-header[href="'+targetTab+'"]').addClass('active'); + $(targetTab).show(); + resizeAll(); + var panelHeight = this._viewPanel.height(); + this._schemaPanel.height(panelHeight); + this._issuesPanel.height(panelHeight); + this._previewPanel.height(panelHeight); + // Resize the inside of the schema panel + var headerHeight = this._schemaElmts.schemaHeader.outerHeight(); + this._schemaElmts.canvas.height(panelHeight - headerHeight - 10); +} + +SchemaAlignmentDialog.isSetUp = function() { + return $('#wikidata-schema-panel').length !== 0; +} + +SchemaAlignmentDialog.launch = function(onDone) { + this._onDone = onDone; + this._hasUnsavedChanges = false; + + if (!SchemaAlignmentDialog.isSetUp()) { + SchemaAlignmentDialog.setUpTabs(); + } + SchemaAlignmentDialog.switchTab('#wikidata-schema-panel'); + + // this._createDialog(); +} + + +var beforeUnload = function(e) { + if (SchemaAlignmentDialog.isSetUp() && SchemaAlignmentDialog._hasUnsavedChanges === true) { + return (e = $.i18n._('wikidata-schema')["unsaved-warning"]); + } +}; + +$(window).bind('beforeunload', beforeUnload); + +SchemaAlignmentDialog._reset = function(schema) { + this._originalSchema = schema || { itemDocuments: [] }; + this._schema = cloneDeep(this._originalSchema); // this is what can be munched on + + $('#schema-alignment-statements-container').empty(); + + if (this._schema && this._schema.itemDocuments) { + for(var i = 0; i != this._schema.itemDocuments.length; i++) { + this._addItem(this._schema.itemDocuments[i]); + } + } + + if (!this._schema.itemDocuments.length) { + // this._addItem(); + } +}; + +SchemaAlignmentDialog._save = function(onDone) { + var self = this; + var schema = this.getJSON(); + + Refine.postProcess( + "wikidata", + "save-wikibase-schema", + {}, + { schema: JSON.stringify(schema) }, + {}, + { + onDone: function() { + theProject.overlayModels.wikibaseSchema = schema; + + $('.invalid-schema-warning').hide(); + self._changesCleared(); + + if (onDone) onDone(); + }, + onError: function(e) { + alert($.i18n._('wikidata-schema')["incomplete-schema-could-not-be-saved"]); + }, + } + ); +}; + +SchemaAlignmentDialog._discardChanges = function() { + this._reset(theProject.overlayModels.wikibaseSchema); + this._changesCleared(); +} + +SchemaAlignmentDialog._changesCleared = function() { + this._hasUnsavedChanges = false; + this._unsavedIndicator.hide(); + this._schemaElmts.saveButton + .prop('disabled', true) + .addClass('disabled'); + this._schemaElmts.discardButton + .prop('disabled', true) + .addClass('disabled'); +} + +SchemaAlignmentDialog._createDraggableColumn = function(name, reconciled) { + var cell = $("
").addClass('wbs-draggable-column').text(name); + if (reconciled) { + cell.addClass('wbs-reconciled-column'); + } else { + cell.addClass('wbs-unreconciled-column'); + } + return cell; +} + +SchemaAlignmentDialog._plusButton = function(label, element) { + var plus = $('').html('+ ').appendTo(element); + var span = $('').text(label) + .appendTo(element); +} + +SchemaAlignmentDialog._makeDeleteButton = function (noText) { + var button = $('
').addClass('wbs-remove').append( + $('').addClass('wbs-icon') + ); + if(noText === undefined) { + button.append( + $('').text($.i18n._('wikidata-schema')["remove"])); + } + return button; +} + +/**************/ +/*** ITEMS ****/ +/**************/ + +SchemaAlignmentDialog._addItem = function(json) { + var subject = null; + var statementGroups = null; + var nameDescs = null; + if (json) { + subject = json.subject; + statementGroups = json.statementGroups; + nameDescs = json.nameDescs; + } + + var item = $('
').addClass('wbs-item'); + $('#schema-alignment-statements-container').append(item); + var deleteToolbar = $('
').addClass('wbs-toolbar') + .attr('style', 'margin-top: 10px') + .appendTo(item); + var deleteButton = SchemaAlignmentDialog._makeDeleteButton() + .appendTo(deleteToolbar) + .click(function(e) { + item.remove(); + SchemaAlignmentDialog._hasChanged(); + e.preventDefault(); + }); + var inputContainer = $('
').addClass('wbs-item-input').appendTo(item); + SchemaAlignmentDialog._initField(inputContainer, "wikibase-item", subject); + var right = $('
').addClass('wbs-item-contents').appendTo(item); + + // Terms + $('').addClass('wbs-namedesc-header') + .text($.i18n._('wikidata-schema')["terms-header"]).appendTo(right); + $('
').addClass('wbs-namedesc-container') + .attr('data-emptyplaceholder', $.i18n._('wikidata-schema')['empty-terms']) + .appendTo(right); + var termToolbar = $('
').addClass('wbs-toolbar').appendTo(right); + var addNamedescButton = $('').addClass('wbs-add-namedesc') + .click(function(e) { + SchemaAlignmentDialog._addNameDesc(item, null); + e.preventDefault(); + }).appendTo(termToolbar); + SchemaAlignmentDialog._plusButton( + $.i18n._('wikidata-schema')["add-term"], addNamedescButton); + + // Clear the float + $('
').attr('style', 'clear: right').appendTo(right); + + // Statements + $('
').addClass('wbs-statements-header') + .text($.i18n._('wikidata-schema')['statements-header']).appendTo(right); + $('
').addClass('wbs-statement-group-container') + .attr('data-emptyplaceholder', $.i18n._('wikidata-schema')['empty-statements']) + .appendTo(right); + var statementToolbar = $('
').addClass('wbs-toolbar').appendTo(right); + var addStatementButton = $('').addClass('wbs-add-statement-group') + .click(function(e) { + SchemaAlignmentDialog._addStatementGroup(item, null); + e.preventDefault(); + }).appendTo(statementToolbar); + + SchemaAlignmentDialog._plusButton( + $.i18n._('wikidata-schema')["add-statement"], addStatementButton); + + if (statementGroups) { + for(var i = 0; i != statementGroups.length; i++) { + SchemaAlignmentDialog._addStatementGroup(item, statementGroups[i]); + } + } + + if (nameDescs) { + for(var i = 0; i != nameDescs.length; i++) { + SchemaAlignmentDialog._addNameDesc(item, nameDescs[i]); + } + } +} + +SchemaAlignmentDialog._itemToJSON = function (item) { + var statementGroupLst = new Array(); + item.find('.wbs-statement-group').each(function () { + statementGroupLst.push(SchemaAlignmentDialog._statementGroupToJSON($(this))); + }); + var nameDescLst = new Array(); + item.find('.wbs-namedesc').each(function () { + nameDescLst.push(SchemaAlignmentDialog._nameDescToJSON($(this))); + }); + var inputContainer = item.find(".wbs-item-input").first(); + return {subject: SchemaAlignmentDialog._inputContainerToJSON(inputContainer), + statementGroups: statementGroupLst, + nameDescs: nameDescLst}; +}; + +/************************** + * NAMES AND DESCRIPTIONS * + **************************/ + +SchemaAlignmentDialog._addNameDesc = function(item, json) { + var type = 'ALIAS'; + var value = null; + if (json) { + type = json.name_type; + value = json.value; + } + + var container = item.find('.wbs-namedesc-container').first(); + var namedesc = $('
').addClass('wbs-namedesc').appendTo(container); + var type_container = $('
').addClass('wbs-namedesc-type').appendTo(namedesc); + var type_input = $('').appendTo(type_container); + $('') + .attr('value', 'LABEL') + .text($.i18n._('wikidata-schema')["label"]) + .appendTo(type_input); + $('') + .attr('value', 'DESCRIPTION') + .text($.i18n._('wikidata-schema')["description"]) + .appendTo(type_input); + $('') + .attr('value', 'ALIAS') + .text($.i18n._('wikidata-schema')["alias"]) + .appendTo(type_input); + type_input.val(type); + type_input.on('change', function(e) { + SchemaAlignmentDialog._hasChanged(); + }); + + var toolbar = $('
').addClass('wbs-toolbar').appendTo(namedesc); + SchemaAlignmentDialog._makeDeleteButton().click(function(e) { + namedesc.remove(); + SchemaAlignmentDialog._hasChanged(); + e.preventDefault(); + }).appendTo(toolbar); + + var right = $('
').addClass('wbs-right').appendTo(namedesc); + var value_container = $('
').addClass('wbs-namedesc-value').appendTo(namedesc); + SchemaAlignmentDialog._initField(value_container, "monolingualtext", value); + +} + +SchemaAlignmentDialog._nameDescToJSON = function (namedesc) { + var type = namedesc.find('select').first().val(); + var value = namedesc.find('.wbs-namedesc-value').first().data("jsonValue"); + return { + type: "wbnamedescexpr", + name_type: type, + value: value, + }; +} + + +/******************** + * STATEMENT GROUPS * + ********************/ + +SchemaAlignmentDialog._addStatementGroup = function(item, json) { + var property = null; + var statements = null; + if (json) { + property = json.property; + statements = json.statements; + } + + var container = item.find('.wbs-statement-group-container').first(); + var statementGroup = $('
').addClass('wbs-statement-group'); + var inputContainer = $('
').addClass('wbs-prop-input').appendTo(statementGroup); + var right = $('
').addClass('wbs-right').appendTo(statementGroup); + var statementContainer = $('
').addClass('wbs-statement-container').appendTo(right); + SchemaAlignmentDialog._initPropertyField(inputContainer, statementContainer, property); + var toolbar = $('
').addClass('wbs-toolbar').appendTo(right); + var addValueButton = $('').addClass('wbs-add-statement').click(function(e) { + var datatype = inputContainer.data("jsonValue").datatype; + SchemaAlignmentDialog._addStatement(statementContainer, datatype, null); + e.preventDefault(); + }).appendTo(toolbar).hide(); + SchemaAlignmentDialog._plusButton($.i18n._('wikidata-schema')["add-value"], addValueButton); + var removeButton = SchemaAlignmentDialog._makeDeleteButton() + .addClass('wbs-remove-statement-group') + .appendTo(toolbar) + .click(function(e) { + statementGroup.remove(); + e.preventDefault(); + }); + + container.append(statementGroup); + + if (statements) { + for (var i = 0; i != statements.length; i++) { + SchemaAlignmentDialog._addStatement(statementContainer, property.datatype, statements[i]); + addValueButton.show(); + removeButton.hide(); + } + } else { + inputContainer.find('input').focus(); + } + +} + +SchemaAlignmentDialog._statementGroupToJSON = function (statementGroup) { + var lst = new Array(); + statementGroup.find('.wbs-statement-container').first().children('.wbs-statement').each(function () { + lst.push(SchemaAlignmentDialog._statementToJSON($(this))); + }); + var inputContainer = statementGroup.find(".wbs-prop-input").first(); + return {property: SchemaAlignmentDialog._inputContainerToJSON(inputContainer), + statements: lst}; +}; + +/************** + * STATEMENTS * + **************/ + +SchemaAlignmentDialog._addStatement = function(container, datatype, json) { + var qualifiers = null; + var references = null; + var value = null; + if (json) { + qualifiers = json.qualifiers; + references = json.references; + value = json.value; + } + + var statement = $('
').addClass('wbs-statement'); + var inputContainer = $('
').addClass('wbs-target-input').appendTo(statement); + SchemaAlignmentDialog._initField(inputContainer, datatype, value); + + // If we are in a mainsnak... + // (see https://www.mediawiki.org/wiki/Wikibase/DataModel#Snaks) + if (container.parents('.wbs-statement').length == 0) { + // add delete button + var toolbar1 = $('
').addClass('wbs-toolbar').appendTo(statement); + SchemaAlignmentDialog._makeDeleteButton().click(function(e) { + SchemaAlignmentDialog._removeStatement(statement); + e.preventDefault(); + }).appendTo(toolbar1); + + // add rank + var rank = $('
').addClass('wbs-rank-selector-icon').prependTo(inputContainer); + + // add qualifiers... + var right = $('
').addClass('wbs-right').appendTo(statement); + var qualifierContainer = $('
').addClass('wbs-qualifier-container').appendTo(right); + var toolbar2 = $('
').addClass('wbs-toolbar').appendTo(right); + var addQualifierButton = $('').addClass('wbs-add-qualifier') + .click(function(e) { + SchemaAlignmentDialog._addQualifier(qualifierContainer, null); + e.preventDefault(); + }).appendTo(toolbar2); + SchemaAlignmentDialog._plusButton($.i18n._('wikidata-schema')["add-qualifier"], addQualifierButton); + + if (qualifiers) { + for (var i = 0; i != qualifiers.length; i++) { + SchemaAlignmentDialog._addQualifier(qualifierContainer, qualifiers[i]); + } + } + + // and references + $('
').attr('style', 'clear: right').appendTo(statement); + var referencesToggleContainer = $('
').addClass('wbs-references-toggle').appendTo(statement); + var triangle = $('
').addClass('triangle-icon').addClass('pointing-right').appendTo(referencesToggleContainer); + var referencesToggle = $('').appendTo(referencesToggleContainer); + right = $('
').addClass('wbs-right').appendTo(statement); + var referenceContainer = $('
').addClass('wbs-reference-container').appendTo(right); + referencesToggle.click(function(e) { + triangle.toggleClass('pointing-down'); + triangle.toggleClass('pointing-right'); + referenceContainer.toggle(100); + e.preventDefault(); + }); + referenceContainer.hide(); + var right2 = $('
').addClass('wbs-right').appendTo(right); + var toolbar3 = $('
').addClass('wbs-toolbar').appendTo(right2); + var addReferenceButton = $('').addClass('wbs-add-reference') + .click(function(e) { + referenceContainer.show(); + SchemaAlignmentDialog._addReference(referenceContainer, null); + SchemaAlignmentDialog._updateReferencesNumber(referenceContainer); + e.preventDefault(); + }).appendTo(toolbar3); + SchemaAlignmentDialog._plusButton($.i18n._('wikidata-schema')["add-reference"], addReferenceButton); + if (references) { + for (var i = 0; i != references.length; i++) { + SchemaAlignmentDialog._addReference(referenceContainer, references[i]); + } + } + SchemaAlignmentDialog._updateReferencesNumber(referenceContainer); + } + container.append(statement); +} + +SchemaAlignmentDialog._statementToJSON = function (statement) { + var inputContainer = statement.find(".wbs-target-input").first(); + var qualifiersList = new Array(); + var referencesList = new Array(); + statement.find('.wbs-qualifier-container').first().children().each(function () { + qualifiersList.push(SchemaAlignmentDialog._qualifierToJSON($(this))); + }); + statement.find('.wbs-reference-container').first().children().each(function () { + referencesList.push(SchemaAlignmentDialog._referenceToJSON($(this))); + }); + return { + value:SchemaAlignmentDialog._inputContainerToJSON(inputContainer), + qualifiers: qualifiersList, + references: referencesList, + }; +}; + +/************** + * QUALIFIERS * + **************/ + +SchemaAlignmentDialog._addQualifier = function(container, json) { + var property = null; + var value = null; + if (json) { + property = json.prop; + value = json.value; + } + + var qualifier = $('
').addClass('wbs-qualifier').appendTo(container); + var toolbar1 = $('
').addClass('wbs-toolbar').appendTo(qualifier); + var inputContainer = $('
').addClass('wbs-prop-input').appendTo(qualifier); + var right = $('
').addClass('wbs-right').appendTo(qualifier); + var deleteButton = SchemaAlignmentDialog._makeDeleteButton() + .addClass('wbs-remove-statement-group') + .appendTo(toolbar1).click(function(e) { + qualifier.remove(); + SchemaAlignmentDialog._hasChanged(); + e.preventDefault(); + }); + var statementContainer = $('
').addClass('wbs-statement-container').appendTo(right); + SchemaAlignmentDialog._initPropertyField(inputContainer, statementContainer, property); + if (value && property) { + SchemaAlignmentDialog._addStatement(statementContainer, property.datatype, {value:value}); + } +} + +SchemaAlignmentDialog._qualifierToJSON = function(elem) { + var prop = elem.find(".wbs-prop-input").first(); + var target = elem.find(".wbs-target-input").first(); + return { + prop: SchemaAlignmentDialog._inputContainerToJSON(prop), + value: SchemaAlignmentDialog._inputContainerToJSON(target), + }; +} + +/************** + * REFERENCES * + **************/ + +SchemaAlignmentDialog._addReference = function(container, json) { + var snaks = null; + if (json) { + snaks = json.snaks; + } + + var reference = $('
').addClass('wbs-reference').appendTo(container); + var referenceHeader = $('
').addClass('wbs-reference-header').appendTo(reference); + var toolbarRef = $('
').addClass('wbs-toolbar').appendTo(referenceHeader); + SchemaAlignmentDialog._makeDeleteButton().click(function(e) { + reference.remove(); + SchemaAlignmentDialog._updateReferencesNumber(container); + SchemaAlignmentDialog._hasChanged(); + e.preventDefault(); + }).appendTo(toolbarRef); + var right = $('
').addClass('wbs-right').appendTo(reference); + var qualifierContainer = $('
').addClass('wbs-qualifier-container').appendTo(right); + var toolbar2 = $('
').addClass('wbs-toolbar').appendTo(right); + var addSnakButton = $('').addClass('wbs-add-qualifier') + .click(function(e) { + SchemaAlignmentDialog._addQualifier(qualifierContainer, null); + e.preventDefault(); + }).appendTo(toolbar2); + SchemaAlignmentDialog._plusButton($.i18n._('wikidata-schema')['add-reference-snak'], addSnakButton); + + if (snaks) { + for (var i = 0; i != snaks.length; i++) { + SchemaAlignmentDialog._addQualifier(qualifierContainer, snaks[i]); + } + } else { + SchemaAlignmentDialog._addQualifier(qualifierContainer, null); + } +} + +SchemaAlignmentDialog._referenceToJSON = function(reference) { + var snaks = reference.find('.wbs-qualifier-container').first().children(); + var snaksList = new Array(); + snaks.each(function () { + snaksList.push(SchemaAlignmentDialog._qualifierToJSON($(this))); + }); + return {snaks:snaksList}; +} + +SchemaAlignmentDialog._updateReferencesNumber = function(container) { + var childrenCount = container.children().length; + var statement = container.parents('.wbs-statement'); + var a = statement.find('.wbs-references-toggle a').first(); + a.html(childrenCount+$.i18n._('wikidata-schema')["nb-references"]); +} + +/************************ + * FIELD INITIALIZATION * + ************************/ + +SchemaAlignmentDialog._getPropertyType = function(pid, callback) { + $.ajax({ + url:'https://www.wikidata.org/w/api.php', + data: { + action: "wbgetentities", + format: "json", + ids: pid, + props: "datatype", + }, + dataType: "jsonp", + success: function(data) { + callback(data.entities[pid].datatype); + }}); +} + +SchemaAlignmentDialog._initPropertyField = function(inputContainer, targetContainer, initialValue) { + var input = $('').appendTo(inputContainer); + input.attr("placeholder", $.i18n._('wikidata-schema')["property-placeholder"]); + + if (this._reconService !== null) { + endpoint = this._reconService.suggest.property; + var suggestConfig = $.extend({}, endpoint); + suggestConfig.key = null; + suggestConfig.query_param_name = "prefix"; + + input.suggestP(suggestConfig).bind("fb-select", function(evt, data) { + // Fetch the type of this property and add the appropriate target value type + var statementGroup = inputContainer.parents(".wbs-statement-group, .wbs-qualifier").first(); + SchemaAlignmentDialog._getPropertyType(data.id, function(datatype) { + inputContainer.data("jsonValue", { + type : "wbpropconstant", + pid : data.id, + label: data.name, + datatype: datatype, + }); + SchemaAlignmentDialog._addStatement(targetContainer, datatype, null); + var addValueButtons = targetContainer.parent().find('.wbs-add-statement'); + var removeGroupButton = targetContainer.parent().find('.wbs-remove-statement-group'); + removeGroupButton.hide(); + addValueButtons.show(); + }); + SchemaAlignmentDialog._hasChanged(); + }).bind("fb-textchange", function(evt, data) { + inputContainer.data("jsonValue", null); + targetContainer.find('.wbs-statement').remove(); + var addValueButtons = targetContainer.parent().find('.wbs-add-statement'); + var removeGroupButton = targetContainer.parent().find('.wbs-remove-statement-group'); + addValueButtons.hide(); + removeGroupButton.show(); + }); + // adds tweaks to display the validation status more clearly, like in Wikidata + fixSuggestInput(input); + } + + // Init with the provided initial value. + if (initialValue) { + if (initialValue.type === "wbpropconstant") { + input.val(initialValue.label); + input.addClass('wbs-validated-input'); + } + inputContainer.data("jsonValue", initialValue); + } + +} + +SchemaAlignmentDialog._initField = function(inputContainer, mode, initialValue, changedCallback) { + var input = $('').appendTo(inputContainer); + + if (! changedCallback) { + changedCallback = SchemaAlignmentDialog._hasChanged; + } + + if (this._reconService !== null && (mode === "wikibase-item" || mode === "unit")) { + if (mode === "wikibase-item") { + input.attr("placeholder", $.i18n._('wikidata-schema')["item-or-reconciled-column"]); + } else { + input.attr("placeholder", $.i18n._('wikidata-schema')["unit"]); + } + var endpoint = null; + endpoint = this._reconService.suggest.entity; + var suggestConfig = $.extend({}, endpoint); + suggestConfig.key = null; + suggestConfig.query_param_name = "prefix"; + + input.suggestP(suggestConfig).bind("fb-select", function(evt, data) { + inputContainer.data("jsonValue", { + type : "wbitemconstant", + qid : data.id, + label: data.name, + }); + changedCallback(); + }); + // adds tweaks to display the validation status more clearly, like in Wikidata + fixSuggestInput(input); + + } else if (this._reconService !== null && mode === "wikibase-property") { + var endpoint = null; + endpoint = this._reconService.suggest.property; + var suggestConfig = $.extend({}, endpoint); + suggestConfig.key = null; + suggestConfig.query_param_name = "prefix"; + + input.suggestP(suggestConfig).bind("fb-select", function(evt, data) { + inputContainer.data("jsonValue", { + type : "wbpropconstant", + pid : data.id, + label: data.name, + datatype: "not-important", + }); + changedCallback(); + }); + // adds tweaks to display the validation status more clearly, like in Wikidata + fixSuggestInput(input); + + } else if (mode === "time") { + input.attr("placeholder", "YYYY(-MM(-DD))..."); + var propagateValue = function(val) { + // TODO add validation here + inputContainer.data("jsonValue", { + type: "wbdateconstant", + value: val, + }); + }; + propagateValue(""); + input.change(function() { + propagateValue($(this).val()); + changedCallback(); + }); + + SchemaAlignmentDialog.setupStringInputValidation(input, /^\d{4}(-[0-1]\d(-[0-3]\d(T[0-2]\d(:[0-5]\d(:[0-5]\dZ)?)?)?)?)?$/); + } else if (mode === "globe-coordinate") { + input.attr("placeholder", "lat,lon"); + var propagateValue = function(val) { + // TODO add validation here + inputContainer.data("jsonValue", { + type: "wblocationconstant", + value: val, + }); + }; + propagateValue(""); + input.change(function() { + propagateValue($(this).val()); + changedCallback(); + }); + + SchemaAlignmentDialog.setupStringInputValidation(input, /^[\-+]?\d+(\.\d*)?[,\/][\-+]?\d+(\.\d*)?([,\/]\d+(\.\d*)?)?$/); + } else if (mode === "language") { + input.attr("placeholder", "lang"); + input.addClass("wbs-language-input"); + input.langsuggest().bind("fb-select", function(evt, data) { + inputContainer.data("jsonValue", { + type: "wblanguageconstant", + id: data.id, + label: data.name, + }); + changedCallback(); + }); + fixSuggestInput(input); + + } else if (mode === "monolingualtext") { + input.remove(); + var inputContainerLanguage = $('
') + .addClass('wbs-monolingual-container') + .width('30%') + .appendTo(inputContainer); + var inputContainerValue = $('
') + .addClass('wbs-monolingual-container') + .width('70%') + .appendTo(inputContainer); + + var langValue = null; + var strValue = null; + if (initialValue) { + langValue = initialValue.language; + strValue = initialValue.value; + } + + var propagateValue = function() { + inputContainer.data("jsonValue", { + type: "wbmonolingualexpr", + language: inputContainerLanguage.data("jsonValue"), + value: inputContainerValue.data("jsonValue"), + }); + changedCallback(); + } + + SchemaAlignmentDialog._initField(inputContainerLanguage, "language", langValue, propagateValue); + SchemaAlignmentDialog._initField(inputContainerValue, "string", strValue, propagateValue); + + } else if (mode === "quantity") { + input.remove(); + var inputContainerAmount = $('
') + .addClass('wbs-quantity-container') + .width('60%') + .appendTo(inputContainer); + var inputContainerUnit = $('
') + .addClass('wbs-quantity-container') + .width('40%') + .appendTo(inputContainer); + + var amountValue = null; + var unitValue = null; + if (initialValue) { + amountValue = initialValue.amount; + unitValue = initialValue.unit; + } + + var propagateValue = function() { + inputContainer.data("jsonValue", { + type: "wbquantityexpr", + amount: inputContainerAmount.data("jsonValue"), + unit: inputContainerUnit.data("jsonValue"), + }); + changedCallback(); + } + + SchemaAlignmentDialog._initField(inputContainerAmount, "amount", amountValue, propagateValue); + SchemaAlignmentDialog._initField(inputContainerUnit, "unit", unitValue, propagateValue); + + } else { + var propagateValue = function(val) { + inputContainer.data("jsonValue", { + type: "wbstringconstant", + value: val, + }); + }; + propagateValue(""); + input.change(function() { + propagateValue($(this).val()); + changedCallback(); + }); + if (mode === "amount") { + input.attr("placeholder", $.i18n._('wikidata-schema')["amount"]); + SchemaAlignmentDialog.setupStringInputValidation(input, /^[\-+]?\d+(\.\d*)?(E[\-+]\d+)?$/); + } else if (mode === "url") { + input.attr("placeholder", $.i18n._('wikidata-schema')["full-url"]); + SchemaAlignmentDialog.setupStringInputValidation(input, /^https?:\/\/.+$/); + } else if (mode === "tabular-data") { + input.attr("placeholder", $.i18n._('wikidata-schema')["tabular-data-with-prefix"]); + SchemaAlignmentDialog.setupStringInputValidation(input, /^Data:.+$/); + } else if (mode === "commonsMedia") { + input.attr("placeholder", $.i18n._('wikidata-schema')["commons-media"]); + } else if (mode === "math") { + input.attr("placeholder", $.i18n._('wikidata-schema')["math-expression"]); + } else if (mode === "geo-shape") { + input.attr("placeholder", $.i18n._('wikidata-schema')["geoshape-with-prefix"]); + SchemaAlignmentDialog.setupStringInputValidation(input, /^Data:.+$/); + } else { + SchemaAlignmentDialog.setupStringInputValidation(input, /^.+$/); + } + if (mode !== "external-id" && + mode !== "url" && + mode !== "string" && + mode !== "amount" && + mode !== "tabular-data" && + mode !== "commonsMedia" && + mode !== "geo-shape" && + mode !== "math") { + alert($.i18n._('wikidata-schema')["datatype-not-supported-yet"]); + } + } + + var acceptDraggableColumn = function(column) { + input.hide(); + input.val(""); + var columnDiv = $('
').appendTo(inputContainer); + column.appendTo(columnDiv); + var origText = column.text(); + column.text(""); + column.append($('
').addClass('wbs-restricted-column-name').text(origText)); + var deleteButton = SchemaAlignmentDialog._makeDeleteButton(true).appendTo(column); + deleteButton.attr('alt', $.i18n._('wikidata-schema')["remove-column"]); + deleteButton.click(function (e) { + columnDiv.remove(); + input.show(); + inputContainer.data("jsonValue", null); + changedCallback(); + e.preventDefault(); + }); + }; + + // Make it droppable + var acceptClass = ".wbs-draggable-column"; + var wbVariableType = "wbstringvariable"; + if (mode === "wikibase-item" || mode === "unit") { + acceptClass = ".wbs-reconciled-column"; + wbVariableType = "wbitemvariable"; + } else if (mode === "time") { + wbVariableType = "wbdatevariable"; + } else if (mode === "globe-coordinate") { + wbVariableType = "wblocationvariable"; + } else if (mode === "monolingualtext" || mode === "quantity") { + wbVariableType = null; // not droppable directly + } else if (mode === "language") { + wbVariableType = "wblanguagevariable"; + } + + if (wbVariableType) { + inputContainer.droppable({ + accept: acceptClass, + }).on("drop", function (evt, ui) { + var column = ui.draggable.clone(); + acceptDraggableColumn(column); + inputContainer.data("jsonValue", { + type : wbVariableType, + columnName: ui.draggable.text(), + }); + changedCallback(); + return true; + }).on("dropactivate", function(evt, ui) { + input.addClass("wbs-accepting-input"); + }).on("dropdeactivate", function(evt, ui) { + input.removeClass("wbs-accepting-input"); + }); + } + + // Init with the provided initial value. + if (initialValue) { + if (initialValue.type === "wbitemconstant" || initialValue.type === "wbpropconstant") { + input.val(initialValue.label); + input.addClass("wbs-validated-input"); + } else if (initialValue.type == "wbitemvariable") { + var cell = SchemaAlignmentDialog._createDraggableColumn(initialValue.columnName, true); + acceptDraggableColumn(cell); + } else if (initialValue.type === "wbstringconstant" || + initialValue.type === "wbdateconstant" || + initialValue.type === "wblocationconstant") { + input.val(initialValue.value); + } else if (initialValue.type === "wblanguageconstant") { + input.val(initialValue.id); + input.addClass("wbs-validated-input"); + } else if (initialValue.type === "wbstringvariable" || + initialValue.type === "wbdatevariable" || + initialValue.type === "wblocationvariable" || + initialValue.type === "wblanguagevariable") { + var cell = SchemaAlignmentDialog._createDraggableColumn(initialValue.columnName, false); + acceptDraggableColumn(cell); + } + inputContainer.data("jsonValue", initialValue); + } +} + +SchemaAlignmentDialog.setupStringInputValidation = function(input, regex) { + input.focus(function() { + input.removeClass('wbs-unvalidated-input'); + }).blur(function() { + var currentValue = input.val(); + if (regex.test(currentValue)) { + input.addClass('wbs-validated-input'); + } else { + input.addClass('wbs-unvalidated-input'); + } + }); +} + +SchemaAlignmentDialog._inputContainerToJSON = function (inputContainer) { + var data = inputContainer.data(); + if (data) { + return data.jsonValue; + } else { + return null; + } +}; + +SchemaAlignmentDialog._removeStatement = function(statement) { + var statementGroup = statement.parents('.wbs-statement-group, .wbs-qualifier').first(); + statement.remove(); + var remainingStatements = statementGroup.find('.wbs-statement').length; + if (remainingStatements === 0) { + statementGroup.remove(); + } + SchemaAlignmentDialog._hasChanged(); +} + +SchemaAlignmentDialog.getJSON = function() { + var list = new Array(); + $('#schema-alignment-statements-container .wbs-item').each(function () { + list.push(SchemaAlignmentDialog._itemToJSON($(this))); + }); + return { + 'itemDocuments': list, + 'wikibasePrefix': this._wikibasePrefix, + }; +}; + +SchemaAlignmentDialog._hasChanged = function() { + SchemaAlignmentDialog._hasUnsavedChanges = true; + SchemaAlignmentDialog.preview(); + SchemaAlignmentDialog._unsavedIndicator.show(); + SchemaAlignmentDialog._schemaElmts.saveButton + .prop('disabled', false) + .removeClass('disabled'); + SchemaAlignmentDialog._schemaElmts.discardButton + .prop('disabled', false) + .removeClass('disabled'); +} + +SchemaAlignmentDialog.updateNbEdits = function(nb_edits) { + this._previewElmts.previewExplanation.text( + $.i18n._('wikidata-schema')["preview-explanation"].replace('{nb_edits}',nb_edits)); +} + +SchemaAlignmentDialog.preview = function() { + var self = this; + + $('.invalid-schema-warning').hide(); + this._previewPanes.empty(); + this.updateNbEdits(0); + this.issueSpinner.show(); + this.previewSpinner.show(); + var schema = this.getJSON(); + $.post( + "command/wikidata/preview-wikibase-schema?" + $.param({ project: theProject.id }), + { schema: JSON.stringify(schema), engine: JSON.stringify(ui.browsingEngine.getJSON()) }, + function(data) { + self.issueSpinner.hide(); + self.previewSpinner.hide(); + if ("edits_preview" in data) { + var previewContainer = self._previewPanes[0]; + EditRenderer.renderEdits(data.edits_preview, previewContainer); + self.updateNbEdits(data["edit_count"]); + } + + if (data.warnings) { + self._updateWarnings(data.warnings, data.nb_warnings); + } else { + self._updateWarnings([], 0); + } + + if ("code" in data && data.code === "error") { + $('.invalid-schema-warning').show(); + } + }, + "json" + ); +}; + +Refine.registerUpdateFunction(function(options) { + // Inject tabs in any project where the schema has been defined + if(theProject.overlayModels.wikibaseSchema && !SchemaAlignmentDialog.isSetUp()) { + SchemaAlignmentDialog.setUpTabs(); + } + if (SchemaAlignmentDialog.isSetUp() && (options.everythingChanged || options.modelsChanged || + options.rowsChanged || options.rowMetadataChanged || options.cellsChanged || options.engineChanged)) { + if (!SchemaAlignmentDialog._hasUnsavedChanges) { + SchemaAlignmentDialog._discardChanges(); + } + SchemaAlignmentDialog.updateColumns(); + SchemaAlignmentDialog.preview(); + } +}); + +/************************* + * WARNINGS RENDERING * + *************************/ + +SchemaAlignmentDialog._updateWarnings = function(warnings, totalCount) { + var mainDiv = $('#wikidata-issues-panel'); + var countsElem = this.issuesTabCount; + + // clear everything + mainDiv.empty(); + countsElem.hide(); + + var table = $('
').appendTo(mainDiv); + for (var i = 0; i != warnings.length; i++) { + var rendered = WarningsRenderer._renderWarning(warnings[i]); + rendered.appendTo(table); + } + + // update the counts + if (totalCount) { + countsElem.text(totalCount); + countsElem.show(); + } +} + diff --git a/extensions/wikidata/module/scripts/issues-tab.html b/extensions/wikidata/module/scripts/issues-tab.html new file mode 100644 index 000000000..35d752b9d --- /dev/null +++ b/extensions/wikidata/module/scripts/issues-tab.html @@ -0,0 +1,5 @@ +
+
+
+
+ diff --git a/extensions/wikidata/module/scripts/jquery.uls.data.js b/extensions/wikidata/module/scripts/jquery.uls.data.js new file mode 100644 index 000000000..9806f4272 --- /dev/null +++ b/extensions/wikidata/module/scripts/jquery.uls.data.js @@ -0,0 +1,11 @@ +/** + * Source: https://github.com/wikimedia/jquery.uls + * GPL-v2.0 + */ +// Please do not edit. This file is generated from data/langdb.yaml by ulsdata2json.php +( function ( $ ) { + 'use strict'; + $.uls = $.uls || {}; + //noinspection JSHint + $.uls.data = {"languages":{"aa":["Latn",["AF"],"Qafár af"],"ab":["Cyrl",["EU"],"Аҧсшәа"],"abs":["Latn",["AS"],"Bahasa Ambon"],"ace":["Latn",["AS","PA"],"Acèh"],"acf":["Latn",["AM"],"kwéyòl"],"ady":["Cyrl",["EU","ME"],"Адыгабзэ"],"ady-cyrl":["ady"],"ady-latn":["Latn",["EU","ME"],"Adygabze"],"aeb":["aeb-arab"],"aeb-arab":["Arab",["AF"],"تونسي"],"aeb-latn":["Latn",["AF"],"Tûnsî"],"af":["Latn",["AF"],"Afrikaans"],"ahr":["Deva",["AS"],"अहिराणी"],"ais":["Latn",["AS"],"Sakizaya"],"ak":["Latn",["AF"],"Akan"],"akz":["Latn",["AM"],"Albaamo innaaɬiilka"],"aln":["Latn",["EU"],"Gegë"],"am":["Ethi",["AF"],"አማርኛ"],"ami":["Latn",["AS"],"Pangcah"],"an":["Latn",["EU"],"aragonés"],"ang":["Latn",["EU"],"Ænglisc"],"anp":["Deva",["AS"],"अङ्गिका"],"ar":["Arab",["ME"],"العربية"],"arc":["Syrc",["ME"],"ܐܪܡܝܐ"],"arn":["Latn",["AM"],"mapudungun"],"aro":["Latn",["AM"],"Araona"],"arq":["Arab",["AF"],"جازايرية"],"ary":["Latn",["ME"],"Maġribi"],"arz":["Arab",["ME"],"مصرى"],"as":["Beng",["AS"],"অসমীয়া"],"ase":["Sgnw",["AM"],"American sign language"],"ast":["Latn",["EU"],"asturianu"],"atj":["Latn",["AM"],"atikamekw"],"av":["Cyrl",["EU"],"авар"],"avk":["Latn",["WW"],"Kotava"],"ay":["Latn",["AM"],"Aymar aru"],"az":["az-latn"],"az-arab":["Arab",["AS","ME"],"تۆرکجه"],"az-latn":["Latn",["EU","ME"],"azərbaycanca"],"az-cyrl":["Cyrl",["EU","ME"],"азәрбајҹанҹа"],"azb":["az-arab"],"azj":["az-latn"],"ba":["Cyrl",["EU"],"башҡортса"],"ban":["Bali",["AS"],"ᬩᬲᬩᬮᬶ"],"bar":["Latn",["EU"],"Boarisch"],"bat-smg":["sgs"],"bbc-latn":["Latn",["AS"],"Batak Toba"],"bbc-batk":["Batk",["AS"],"ᯅᯖᯂ᯲ ᯖᯬᯅ"],"bbc":["bbc-latn"],"bcc":["Arab",["AS","ME"],"جهلسری بلوچی"],"bcl":["Latn",["AS"],"Bikol Central"],"be-tarask":["Cyrl",["EU"],"беларуская (тарашкевіца)"],"be-x-old":["be-tarask"],"be":["Cyrl",["EU"],"беларуская"],"bew":["Latn",["AS"],"Bahasa Betawi"],"bfa":["Latn",["AF"],"Bari"],"bft":["Arab",["AS"],"بلتی"],"bfq":["Taml",["AS"],"படகா"],"bg":["Cyrl",["EU"],"български"],"bgn":["Arab",["AS","ME"],"روچ کپتین بلوچی"],"bh":["bho"],"bho":["Deva",["AS"],"भोजपुरी"],"bi":["Latn",["PA"],"Bislama"],"bjn":["Latn",["AS"],"Bahasa Banjar"],"bm":["Latn",["AF"],"bamanankan"],"bn":["Beng",["AS"],"বাংলা"],"bo":["Tibt",["AS"],"བོད་ཡིག"],"bpy":["Beng",["AS"],"বিষ্ণুপ্রিয়া মণিপুরী"],"bqi":["Arab",["AS","ME"],"بختیاری"],"br":["Latn",["EU"],"brezhoneg"],"brh":["Latn",["ME","AS"],"Bráhuí"],"brx":["Deva",["AS"],"बड़ो"],"bs":["Latn",["EU"],"bosanski"],"bto":["Latn",["AS"],"Iriga Bicolano"],"bug":["Bugi",["AS"],"ᨅᨔ ᨕᨘᨁᨗ"],"bxr":["Cyrl",["AS"],"буряад"],"byn":["Ethi",["AF"],"ብሊን"],"ca":["Latn",["EU"],"català"],"cbk-zam":["Latn",["AS"],"Chavacano de Zamboanga"],"cdo":["Latn",["AS"],"Mìng-dĕ̤ng-ngṳ̄"],"ce":["Cyrl",["EU"],"нохчийн"],"ceb":["Latn",["AS"],"Cebuano"],"ch":["Latn",["PA"],"Chamoru"],"chm":["mhr"],"cho":["Latn",["AM"],"Choctaw"],"chr":["Cher",["AM"],"ᏣᎳᎩ"],"chy":["Latn",["AM"],"Tsetsêhestâhese"],"ciw":["Latn",["AM"],"Ojibwemowin"],"cjy":["cjy-hant"],"cjy-hans":["Hans",["AS"],"晋语(简化字)"],"cjy-hant":["Hant",["AS"],"晉語"],"ckb":["Arab",["ME"],"کوردی"],"cnh":["Latn",["AS"],"Lai holh"],"co":["Latn",["EU"],"corsu"],"cop":["Copt",["AF","ME"],"ϯⲙⲉⲧⲣⲉⲙⲛ̀ⲭⲏⲙⲓ"],"cps":["Latn",["AS"],"Capiceño"],"cr":["Cans",["AM"],"ᓀᐦᐃᔭᐍᐏᐣ"],"cr-cans":["cr"],"cr-latn":["Latn",["AM"],"Nēhiyawēwin"],"crh":["Latn",["EU"],"qırımtatarca"],"crh-cyrl":["Cyrl",["EU"],"къырымтатарджа"],"crh-latn":["crh"],"cs":["Latn",["EU"],"čeština"],"csb":["Latn",["EU"],"kaszëbsczi"],"cu":["Cyrl",["EU"],"словѣньскъ \/ ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ"],"cv":["Cyrl",["EU"],"Чӑвашла"],"cy":["Latn",["EU"],"Cymraeg"],"da":["Latn",["EU"],"dansk"],"dag":["Latn",["AF"],"dagbanli"],"de-at":["Latn",["EU"],"Österreichisches Deutsch"],"de-ch":["Latn",["EU"],"Schweizer Hochdeutsch"],"de-formal":["Latn",["EU"],"Deutsch (Sie-Form)"],"de":["Latn",["EU"],"Deutsch"],"din":["Latn",["AF"],"Thuɔŋjäŋ"],"diq":["Latn",["EU","AS"],"Zazaki"],"doi":["Deva",["AS"],"डोगरी"],"dsb":["Latn",["EU"],"dolnoserbski"],"dtp":["Latn",["AS"],"Dusun Bundu-liwan"],"dty":["Deva",["AS"],"डोटेली"],"dv":["Thaa",["AS"],"ދިވެހިބަސް"],"dz":["Tibt",["AS"],"ཇོང་ཁ"],"ee":["Latn",["AF"],"eʋegbe"],"egl":["Latn",["EU"],"Emiliàn"],"el":["Grek",["EU"],"Ελληνικά"],"eml":["Latn",["EU"],"emiliàn e rumagnòl"],"en-ca":["Latn",["AM"],"Canadian English"],"en-gb":["Latn",["EU","AS","PA"],"British English"],"en":["Latn",["EU","AM","AF","ME","AS","PA","WW"],"English"],"eo":["Latn",["WW"],"Esperanto"],"es-419":["Latn",["AM"],"español de America Latina"],"es-formal":["Latn",["EU","AM","AF","WW"],"español (formal)"],"es":["Latn",["EU","AM","AF","WW"],"español"],"es-ni":["Latn",["AM"],"español nicaragüense"],"esu":["Latn",["AM"],"Yup'ik"],"et":["Latn",["EU"],"eesti"],"eu":["Latn",["EU"],"euskara"],"ext":["Latn",["EU"],"estremeñu"],"fa":["Arab",["AS","ME"],"فارسی"],"fax":["Latn",["EU"],"Fala"],"ff":["Latn",["AF"],"Fulfulde"],"fi":["Latn",["EU"],"suomi"],"fil":["tl"],"fit":["Latn",["EU"],"meänkieli"],"fiu-vro":["vro"],"fj":["Latn",["PA"],"Na Vosa Vakaviti"],"fo":["Latn",["EU"],"føroyskt"],"fr":["Latn",["EU","AM","WW"],"français"],"frc":["Latn",["AM"],"français cadien"],"frp":["Latn",["EU"],"arpetan"],"frr":["Latn",["EU"],"Nordfriisk"],"fur":["Latn",["EU"],"furlan"],"fy":["Latn",["EU"],"Frysk"],"ga":["Latn",["EU"],"Gaeilge"],"gaa":["Latn",["AF"],"Ga"],"gag":["Latn",["EU"],"Gagauz"],"gah":["Latn",["AS"],"Alekano"],"gan-hans":["Hans",["AS"],"赣语(简体)"],"gan-hant":["gan"],"gan":["Hant",["AS"],"贛語"],"gbz":["Latn",["AS"],"Dari-e Mazdeyasnā"],"gcf":["Latn",["AM"],"Guadeloupean Creole French"],"gd":["Latn",["EU"],"Gàidhlig"],"gl":["Latn",["EU"],"galego"],"glk":["Arab",["AS","ME"],"گیلکی"],"gn":["Latn",["AM"],"Avañe'ẽ"],"gom":["gom-deva"],"gom-deva":["Deva",["AS"],"गोंयची कोंकणी"],"gom-latn":["Latn",["AS"],"Gõychi Konknni"],"got":["Goth",["EU"],"𐌲𐌿𐍄𐌹𐍃𐌺"],"grc":["Grek",["EU"],"Ἀρχαία ἑλληνικὴ"],"gsw":["Latn",["EU"],"Alemannisch"],"gu":["Gujr",["AS"],"ગુજરાતી"],"guc":["Latn",["AM"],"Wayúu"],"gum":["Latn",["AM"],"Namtrik"],"gur":["Latn",["AF"],"Gurenɛ"],"gv":["Latn",["EU"],"Gaelg"],"ha-arab":["Arab",["AF"],"هَوُسَ"],"ha-latn":["Latn",["AF"],"Hausa"],"ha":["ha-latn"],"hak":["Latn",["AS"],"Hak-kâ-fa"],"haw":["Latn",["AM","PA"],"Hawai`i"],"he":["Hebr",["ME"],"עברית"],"hak-hans":["Hans",["AS"],"客家语(简体)"],"hak-hant":["Hant",["AS"],"客家語(繁體)"],"hi":["Deva",["AS"],"हिन्दी"],"hif":["Latn",["PA","AS"],"Fiji Hindi"],"hif-deva":["Deva",["AS"],"फ़ीजी हिन्दी"],"hif-latn":["hif"],"hil":["Latn",["AS"],"Ilonggo"],"hne":["Deva",["AS"],"छत्तीसगढ़ी"],"ho":["Latn",["PA"],"Hiri Motu"],"hoc":["Wara",["AS"],"𑢹𑣉𑣉"],"hr":["Latn",["EU"],"hrvatski"],"hrx":["Latn",["AM"],"Hunsrik"],"hsb":["Latn",["EU"],"hornjoserbsce"],"hsn":["Hans",["AS"],"湘语"],"ht":["Latn",["AM"],"Kreyòl ayisyen"],"hu-formal":["Latn",["EU"],"Magyar (magázó)"],"hu":["Latn",["EU"],"magyar"],"hy":["Armn",["EU","ME"],"Հայերեն"],"hz":["Latn",["AF"],"Otsiherero"],"ia":["Latn",["WW"],"interlingua"],"id":["Latn",["AS"],"Bahasa Indonesia"],"ie":["Latn",["WW"],"Interlingue"],"ig":["Latn",["AF"],"Igbo"],"ii":["Yiii",["AS"],"ꆇꉙ"],"ik":["Latn",["AM"],"Iñupiak"],"ike-cans":["Cans",["AM"],"ᐃᓄᒃᑎᑐᑦ"],"ike-latn":["Latn",["AM"],"inuktitut"],"ilo":["Latn",["AS"],"Ilokano"],"inh":["Cyrl",["EU"],"ГӀалгӀай"],"io":["Latn",["WW"],"Ido"],"is":["Latn",["EU"],"íslenska"],"it":["Latn",["EU"],"italiano"],"iu":["ike-cans"],"ja":["Jpan",["AS"],"日本語"],"jam":["Latn",["AM"],"Patois"],"jbo":["Latn",["WW"],"lojban"],"jdt":["jdt-cyrl"],"jdt-cyrl":["Cyrl",["EU","AS"],"жугьури"],"jut":["Latn",["EU"],"jysk"],"jv":["Latn",["AS","PA"],"Basa Jawa"],"jv-java":["Java",["AS","PA"],"ꦧꦱꦗꦮ"],"ka":["Geor",["EU"],"ქართული"],"kaa":["Latn",["AS"],"Qaraqalpaqsha"],"kab":["Latn",["AF","EU"],"Taqbaylit"],"kac":["Latn",["AS"],"Jinghpaw"],"kbd-cyrl":["kbd"],"kbd-latn":["Latn",["EU"],"Qabardjajəbza"],"kbd":["Cyrl",["EU","ME"],"Адыгэбзэ"],"kbp":["Latn",["AF"],"Kabɩyɛ"],"kea":["Latn",["AF"],"Kabuverdianu"],"kg":["Latn",["AF"],"Kongo"],"kgp":["Latn",["AM"],"Kaingáng"],"khw":["Arab",["ME","AS"],"کھوار"],"ki":["Latn",["AF"],"Gĩkũyũ"],"kiu":["Latn",["EU","ME"],"Kırmancki"],"kj":["Latn",["AF"],"Kwanyama"],"kjh":["Cyrl",["AS"],"хакас"],"kk":["kk-cyrl"],"kk-arab":["Arab",["EU","AS"],"قازاقشا (تٶتە)"],"kk-cn":["kk-arab"],"kk-cyrl":["Cyrl",["EU","AS"],"қазақша"],"kk-kz":["kk-cyrl"],"kk-latn":["Latn",["EU","AS","ME"],"qazaqşa"],"kk-tr":["kk-latn"],"kl":["Latn",["AM","EU"],"kalaallisut"],"km":["Khmr",["AS"],"ភាសាខ្មែរ"],"kn":["Knda",["AS"],"ಕನ್ನಡ"],"knn":["Deva",["AS"],"महाराष्ट्रीय कोंकणी"],"ko-kp":["Kore",["AS"],"한국어 (조선)"],"ko":["Kore",["AS"],"한국어"],"koi":["Cyrl",["EU"],"Перем Коми"],"kr":["Latn",["AF"],"Kanuri"],"krc":["Cyrl",["EU"],"къарачай-малкъар"],"kri":["Latn",["AF"],"Krio"],"krj":["Latn",["ME","EU"],"Kinaray-a"],"krl":["Latn",["EU"],"Karjala"],"ks-arab":["Arab",["AS"],"کٲشُر"],"ks-deva":["Deva",["AS"],"कॉशुर"],"ks":["ks-arab"],"ksf":["Latn",["AF"],"Bafia"],"ksh":["Latn",["EU"],"Ripoarisch"],"ku":["ku-latn"],"ku-arab":["Arab",["EU","ME"],"كوردي"],"ku-latn":["Latn",["EU","ME"],"Kurdî"],"kv":["Cyrl",["EU"],"коми"],"kw":["Latn",["EU"],"kernowek"],"ky":["Cyrl",["AS"],"Кыргызча"],"la":["Latn",["EU"],"Latina"],"lad":["lad-latn"],"lad-latn":["Latn",["ME","EU","AM"],"Ladino"],"lad-hebr":["Hebr",["ME","EU","AM"],"לאדינו"],"lag":["Latn",["AF"],"Kilaangi"],"lb":["Latn",["EU"],"Lëtzebuergesch"],"lbe":["Cyrl",["EU"],"лакку"],"lez":["Cyrl",["EU"],"лезги"],"lfn":["Latn",["WW"],"Lingua Franca Nova"],"lg":["Latn",["AF"],"Luganda"],"li":["Latn",["EU"],"Limburgs"],"lij":["Latn",["EU"],"Ligure"],"liv":["Latn",["EU"],"Līvõ kēļ"],"lki":["Arab",["AS","ME"],"لەکی"],"lkt":["Latn",["AM"],"Lakȟótiyapi"],"lld":["Latn",["EU"],"Ladin"],"lmo":["Latn",["EU"],"lumbaart"],"ln":["Latn",["AF"],"lingála"],"lo":["Laoo",["AS"],"ລາວ"],"loz":["Latn",["AF"],"Silozi"],"lt":["Latn",["EU"],"lietuvių"],"lrc":["Arab",["AS","ME"],"لۊری شومالی"],"ltg":["Latn",["EU"],"latgaļu"],"lud":["Latn",["EU"],"lüüdi"],"lus":["Latn",["AS"],"Mizo ţawng"],"lut":["Latn",["AM"],"dxʷləšucid"],"luz":["Arab",["ME"],"لئری دوٙمینی"],"lv":["Latn",["EU"],"latviešu"],"lzh":["Hant",["AS"],"文言"],"lzz":["Latn",["EU","ME"],"Lazuri"],"mai":["Deva",["AS"],"मैथिली"],"map-bms":["Latn",["AS"],"Basa Banyumasan"],"mdf":["Cyrl",["EU"],"мокшень"],"mfe":["Latn",["AM"],"Morisyen"],"mg":["Latn",["AF"],"Malagasy"],"mh":["Latn",["PA"],"Ebon"],"mhr":["Cyrl",["EU"],"олык марий"],"mi":["Latn",["PA"],"Māori"],"mic":["Latn",["AM"],"Mi'kmaq"],"min":["Latn",["AS"],"Baso Minangkabau"],"miq":["Latn",["AM"],"Mískitu"],"mk":["Cyrl",["EU"],"македонски"],"ml":["Mlym",["AS","ME"],"മലയാളം"],"mn":["Cyrl",["AS"],"монгол"],"mnc":["Mong",["AS"],"ᠮᠠᠨᠵᡠ ᡤᡳᠰᡠᠨ"],"mni":["Beng",["AS"],"মেইতেই লোন্"],"mnw":["Mymr",["AS"],"ဘာသာ မန်"],"mo":["Cyrl",["EU"],"молдовеняскэ"],"mr":["Deva",["AS","ME"],"मराठी"],"mrj":["Cyrl",["EU"],"кырык мары"],"ms":["Latn",["AS"],"Bahasa Melayu"],"mt":["Latn",["EU"],"Malti"],"mui":["Latn",["AS"],"Musi"],"mus":["Latn",["AM"],"Mvskoke"],"mwl":["Latn",["EU"],"Mirandés"],"mwv":["Latn",["AS"],"Behase Mentawei"],"mww":["mww-latn"],"mww-latn":["Latn",["AS"],"Hmoob Dawb"],"my":["Mymr",["AS"],"မြန်မာဘာသာ"],"myv":["Cyrl",["EU"],"эрзянь"],"mzn":["Arab",["ME","AS"],"مازِرونی"],"na":["Latn",["PA"],"Dorerin Naoero"],"nah":["Latn",["AM"],"Nāhuatl"],"nan":["Latn",["AS"],"Bân-lâm-gú"],"nap":["Latn",["EU"],"Napulitano"],"nb":["Latn",["EU"],"norsk (bokmål)"],"nds-nl":["Latn",["EU"],"Nedersaksisch"],"nds":["Latn",["EU"],"Plattdüütsch"],"ne":["Deva",["AS"],"नेपाली"],"new":["Deva",["AS"],"नेपाल भाषा"],"ng":["Latn",["AF"],"Oshiwambo"],"niu":["Latn",["PA"],"ko e vagahau Niuē"],"njo":["Latn",["AS"],"Ao"],"nl-informal":["Latn",["EU","AM"],"Nederlands (informeel)"],"nl":["Latn",["EU","AM"],"Nederlands"],"nn":["Latn",["EU"],"norsk (nynorsk)"],"no":["Latn",["EU"],"norsk"],"nod":["Thai",["AS"],"คำเมือง"],"nov":["Latn",["WW"],"Novial"],"nqo":["Nkoo",["AF"],"ߒߞߏ"],"nrm":["Latn",["EU"],"Nouormand"],"nso":["Latn",["AF"],"Sesotho sa Leboa"],"nv":["Latn",["AM"],"Diné bizaad"],"ny":["Latn",["AF"],"Chi-Chewa"],"nys":["Latn",["PA"],"Nyungar"],"oc":["Latn",["EU"],"occitan"],"olo":["Latn",["AS","EU"],"Livvinkarjala"],"om":["Latn",["AF"],"Oromoo"],"or":["Orya",["AS"],"ଓଡ଼ିଆ"],"os":["Cyrl",["EU"],"Ирон"],"ota":["Arab",["AS","EU"],"لسان عثمانى"],"ovd":["Latn",["EU"],"övdalsk"],"pa":["pa-guru"],"pa-guru":["Guru",["AS"],"ਪੰਜਾਬੀ"],"pag":["Latn",["AS"],"Pangasinan"],"pam":["Latn",["AS"],"Kapampangan"],"pap":["Latn",["AM"],"Papiamentu"],"pbb":["Latn",["AM"],"Nasa Yuwe"],"pcd":["Latn",["EU"],"Picard"],"pdc":["Latn",["EU","AM"],"Deitsch"],"pdt":["Latn",["EU","AM"],"Plautdietsch"],"pfl":["Latn",["EU"],"Pälzisch"],"pi":["Deva",["AS"],"पालि"],"pih":["Latn",["PA"],"Norfuk \/ Pitkern"],"pis":["Latn",["PA"],"Pijin"],"pko":["Latn",["AF"],"Pökoot"],"pl":["Latn",["EU"],"polski"],"pms":["Latn",["EU"],"Piemontèis"],"pnb":["Arab",["AS","ME"],"پنجابی"],"pnt":["Grek",["EU"],"Ποντιακά"],"ppl":["Latn",["AM"],"Nawat"],"prg":["Latn",["EU"],"Prūsiskan"],"prs":["Arab",["AS","ME"],"دری"],"ps":["Arab",["AS","ME"],"پښتو"],"pt-br":["Latn",["AM"],"português do Brasil"],"pt":["Latn",["EU","AM","AS","PA","AF","WW"],"português"],"qu":["Latn",["AM"],"Runa Simi"],"qug":["Latn",["AM"],"Runa shimi"],"rap":["Latn",["AM"],"arero rapa nui"],"rcf":["Latn",["AF"],"Kreol Réyoné"],"rgn":["Latn",["EU"],"Rumagnôl"],"rif":["Latn",["AF"],"Tarifit"],"rki":["Mymr",["AS"],"ရခိုင်"],"rm":["Latn",["EU"],"rumantsch"],"rmf":["Latn",["EU"],"kaalengo tšimb"],"rmy":["Latn",["EU"],"Romani"],"rn":["Latn",["AF"],"Kirundi"],"ro":["Latn",["EU"],"română"],"roa-rup":["rup"],"roa-tara":["Latn",["EU"],"tarandíne"],"rtm":["Latn",["PA"],"Faeag Rotuma"],"ru":["Cyrl",["EU","AS","ME"],"русский"],"rue":["Cyrl",["EU"],"русиньскый"],"rup":["Latn",["EU"],"armãneashti"],"ruq":["Cyrl",["EU"],"Влахесте"],"ruq-cyrl":["ruq"],"ruq-grek":["Grek",["EU"],"Megleno-Romanian (Greek script)"],"ruq-latn":["Latn",["EU"],"Vlăheşte"],"rut":["Cyrl",["EU"],"мыхаӀбишды"],"rw":["Latn",["AF"],"Kinyarwanda"],"rwr":["Deva",["AS"],"मारवाड़ी"],"ryu":["Kana",["AS"],"ʔucināguci"],"sa":["Deva",["AS"],"संस्कृतम्"],"sah":["Cyrl",["EU","AS"],"саха тыла"],"sat":["Latn",["AS"],"Santali"],"saz":["Saur",["AS"],"ꢱꣃꢬꢵꢯ꣄ꢡ꣄ꢬꢵ"],"sc":["Latn",["EU"],"sardu"],"scn":["Latn",["EU"],"sicilianu"],"sco":["Latn",["EU"],"Scots"],"sd":["Arab",["AS"],"سنڌي"],"sdc":["Latn",["EU"],"Sassaresu"],"sdh":["Arab",["ME"],"کوردی خوارگ"],"se":["Latn",["EU"],"sámegiella"],"ses":["Latn",["AF"],"Koyraboro Senni"],"sei":["Latn",["AM"],"Cmique Itom"],"sg":["Latn",["AF"],"Sängö"],"sgs":["Latn",["EU"],"žemaitėška"],"sh":["Latn",["EU"],"srpskohrvatski"],"shi-latn":["Latn",["AF"],"Tašlḥiyt"],"shi-tfng":["Tfng",["AF"],"ⵜⴰⵛⵍⵃⵉⵜ"],"shi":["shi-latn"],"shn":["Mymr",["AS"],"လိၵ်ႈတႆး"],"si":["Sinh",["AS"],"සිංහල"],"simple":["Latn",["WW"],"Simple English"],"sjo":["Mong",["AS"],"ᠰᡞᠪᡝ ᡤᡞᠰᡠᠨ"],"sk":["Latn",["EU"],"slovenčina"],"sl":["Latn",["EU"],"slovenščina"],"sli":["Latn",["EU"],"Schläsch"],"slr":["Latn",["AS"],"Salırça"],"sly":["Latn",["AS"],"Bahasa Selayar"],"skr-arab":["Arab",["AS"],"سرائیکی"],"skr":["skr-arab"],"syc":["Syrc",["ME"],"ܣܘܪܝܝܐ"],"sm":["Latn",["PA"],"Gagana Samoa"],"sma":["Latn",["EU"],"åarjelsaemien"],"smj":["Latn",["EU"],"julevsámegiella"],"smn":["Latn",["EU"],"anarâškielâ"],"sms":["Latn",["EU"],"sää´mǩiõll"],"sn":["Latn",["AF"],"chiShona"],"so":["Latn",["AF"],"Soomaaliga"],"son":["Latn",["AF"],"soŋay"],"sq":["Latn",["EU"],"shqip"],"sr":["sr-cyrl"],"sr-ec":["sr-cyrl"],"sr-cyrl":["Cyrl",["EU"],"српски"],"sr-el":["sr-latn"],"sr-latn":["Latn",["EU"],"srpski"],"srn":["Latn",["AM","EU"],"Sranantongo"],"ss":["Latn",["AF"],"SiSwati"],"st":["Latn",["AF"],"Sesotho"],"stq":["Latn",["EU"],"Seeltersk"],"sty":["Cyrl",["EU","AS"],"себертатар"],"su":["Latn",["AS"],"Basa Sunda"],"sv":["Latn",["EU"],"svenska"],"sw":["Latn",["AF"],"Kiswahili"],"swb":["Latn",["AF"],"Shikomoro"],"sxu":["Latn",["EU"],"Säggssch"],"szl":["Latn",["EU"],"ślůnski"],"ta":["Taml",["AS"],"தமிழ்"],"tay":["Latn",["AS"],"Tayal"],"tcy":["Knda",["AS"],"ತುಳು"],"te":["Telu",["AS"],"తెలుగు"],"tet":["Latn",["AS","PA"],"tetun"],"tg-cyrl":["Cyrl",["AS"],"тоҷикӣ"],"tg-latn":["Latn",["AS"],"tojikī"],"tg":["tg-cyrl"],"th":["Thai",["AS"],"ไทย"],"ti":["Ethi",["AF"],"ትግርኛ"],"tig":["Ethi",["AF"],"ትግረ"],"tk":["Latn",["AS"],"Türkmençe"],"tkr":["Cyrl",["AS"],"ЦӀаӀхна миз"],"tl":["Latn",["AS"],"Tagalog"],"tly":["Cyrl",["EU","AS","ME"],"толышә зывон"],"tmr":["Hebr",["ME","EU","AM"],"ארמית בבלית"],"tn":["Latn",["AF"],"Setswana"],"to":["Latn",["PA"],"lea faka-Tonga"],"tokipona":["Latn",["WW"],"Toki Pona"],"tpi":["Latn",["PA","AS"],"Tok Pisin"],"tr":["Latn",["EU","ME"],"Türkçe"],"trp":["Latn",["AS"],"Kokborok (Tripuri)"],"tru":["Latn",["AS"],"Ṫuroyo"],"trv":["Latn",["AS"],"Sediq Taroko"],"ts":["Latn",["AF"],"Xitsonga"],"tsd":["Grek",["EU"],"Τσακωνικά"],"tt":["Cyrl",["EU"],"татарча"],"tt-cyrl":["tt"],"tt-latn":["Latn",["EU"],"tatarça"],"ttt":["Cyrl",["AS"],"Tati"],"tum":["Latn",["AF"],"chiTumbuka"],"tw":["Latn",["AF"],"Twi"],"twd":["Latn",["EU"],"Tweants"],"ty":["Latn",["PA"],"reo tahiti"],"tyv":["Cyrl",["AS"],"тыва дыл"],"tzl":["Latn",["WW"],"Talossan"],"tzm":["Tfng",["AF"],"ⵜⴰⵎⴰⵣⵉⵖⵜ"],"udm":["Cyrl",["EU"],"удмурт"],"ug":["ug-arab"],"ug-arab":["Arab",["AS"],"ئۇيغۇرچە"],"ug-latn":["Latn",["AS"],"uyghurche"],"ug-cyrl":["Cyrl",["AS"],"уйғурчә"],"uk":["Cyrl",["EU"],"українська"],"ur":["Arab",["AS","ME"],"اردو"],"uz":["Latn",["AS"],"oʻzbekcha"],"ve":["Latn",["AF"],"Tshivenda"],"vec":["Latn",["EU"],"vèneto"],"vep":["Latn",["EU"],"vepsän kel’"],"vi":["Latn",["AS"],"Tiếng Việt"],"vls":["Latn",["EU"],"West-Vlams"],"vmf":["Latn",["EU"],"Mainfränkisch"],"vo":["Latn",["WW"],"Volapük"],"vot":["Latn",["EU"],"Vaďďa"],"vro":["Latn",["EU"],"Võro"],"wa":["Latn",["EU"],"walon"],"war":["Latn",["AS"],"Winaray"],"wls":["Latn",["PA"],"Faka'uvea"],"wo":["Latn",["AF"],"Wolof"],"wuu":["Hans",["AS"],"吴语"],"xal":["Cyrl",["EU"],"хальмг"],"xh":["Latn",["AF"],"isiXhosa"],"xmf":["Geor",["EU"],"მარგალური"],"xsy":["Latn",["AS"],"SaiSiyat"],"ydd":["Hebr",["AS","EU"],"Eastern Yiddish"],"yi":["Hebr",["ME","EU","AM"],"ייִדיש"],"yo":["Latn",["AF"],"Yorùbá"],"yrk":["Cyrl",["AS"],"Ненэцяʼ вада"],"yrl":["Latn",["AM"],"ñe'engatú"],"yua":["Latn",["AM"],"Maaya T'aan"],"yue":["Hant",["AS"],"粵語"],"za":["Latn",["AS"],"Vahcuengh"],"zea":["Latn",["EU"],"Zeêuws"],"zgh":["Tfng",["AF"],"ⵜⴰⵎⴰⵣⵉⵖⵜ ⵜⴰⵏⴰⵡⴰⵢⵜ"],"zh":["Hans",["AS"],"中文"],"zh-classical":["lzh"],"zh-cn":["Hans",["AS"],"中文(中国大陆)"],"zh-hans":["Hans",["AS"],"中文(简体)"],"zh-hant":["Hant",["AS"],"中文(繁體)"],"zh-hk":["Hant",["AS"],"中文(香港)"],"zh-min-nan":["nan"],"zh-mo":["Hant",["AS"],"中文(澳門)"],"zh-my":["Hans",["AS"],"中文(马来西亚)"],"zh-sg":["Hans",["AS"],"中文(新加坡)"],"zh-tw":["Hant",["AS"],"中文(台灣)"],"zh-yue":["yue"],"zu":["Latn",["AF"],"isiZulu"]},"scriptgroups":{"Latin":["Latn","Goth"],"Greek":["Grek"],"WestCaucasian":["Armn","Geor"],"Arabic":["Arab"],"MiddleEastern":["Hebr","Syrc"],"African":["Ethi","Nkoo","Tfng","Copt"],"SouthAsian":["Beng","Deva","Gujr","Guru","Knda","Mlym","Orya","Saur","Sinh","Taml","Telu","Tibt","Thaa","Wara"],"Cyrillic":["Cyrl"],"CJK":["Hans","Hant","Kana","Kore","Jpan","Yiii"],"SouthEastAsian":["Bali","Batk","Bugi","Java","Khmr","Laoo","Mymr","Thai"],"Mongolian":["Mong"],"SignWriting":["Sgnw"],"NativeAmerican":["Cher","Cans"],"Special":["Zyyy"]},"rtlscripts":["Arab","Hebr","Syrc","Nkoo","Thaa"],"regiongroups":{"WW":1,"SP":1,"AM":2,"EU":3,"ME":3,"AF":3,"AS":4,"PA":4},"territories":{"AC":["en"],"AD":["ca","es","fr"],"AE":["ar","ml","ps","fa"],"AF":["fa","ps","uz","tk","bgn","ug-arab","kk-arab","kk-cyrl"],"AG":["en","pt"],"AI":["en"],"AL":["sq","el","mk"],"AM":["hy","ku-latn","az-latn"],"AO":["pt","ln"],"AR":["es","en","cy","gn"],"AS":["sm","en"],"AT":["de","bar","en","fr","it","hr","sl","hu"],"AU":["en","zh-hant","zh","it"],"AW":["nl","pap","en"],"AX":["sv"],"AZ":["az-latn","az-cyrl","tly","ku-latn","ttt","tkr"],"BA":["bs","en","hr","sr-cyrl","sr-latn"],"BB":["en"],"BD":["bn","en","my","mni"],"BE":["en","nl","fr","de","vls","wa"],"BF":["fr"],"BG":["bg","en","ru","tr","de"],"BH":["ar","ml"],"BI":["rn","fr","sw","en"],"BJ":["fr","yo"],"BL":["fr"],"BM":["en"],"BN":["ms","zh-hant","zh","en"],"BO":["es","qu","ay","gn","aro"],"BQ":["pap","nl"],"BR":["pt","en","de","it","ja","es","ko","kgp","yrl"],"BS":["en"],"BT":["dz","ne","en"],"BW":["en","tn","af"],"BY":["be","ru"],"BZ":["en","es"],"CA":["en","fr","it","de","pdt","cr","yi","ike-cans","atj"],"CC":["ms","en"],"CD":["sw","fr","ln","kg","rw"],"CF":["fr","sg","ln"],"CG":["fr","ln"],"CH":["de","gsw","en","fr","it","lmo","pt","rm"],"CI":["fr"],"CK":["en"],"CL":["es","en","arn"],"CM":["fr","en","ff","ar","ksf","ha-arab","ha-latn"],"CN":["zh","wuu","yue","hsn","hak","nan","gan","ii","ug-arab","za","mn","bo","ko","kk-arab","kk-cyrl","ky","en","ru","vi","uz","lzh"],"CO":["es","guc"],"CR":["es"],"CU":["es"],"CV":["kea","pt"],"CW":["pap","nl","es"],"CX":["en"],"CY":["el","en","tr","fr","hy","ar"],"CZ":["cs","en","sk","de","pl"],"DE":["de","en","fr","bar","nds","nl","it","es","ru","vmf","tr","gsw","da","hr","ku-latn","el","ksh","pl","hsb","frr","dsb","stq","pfl"],"DG":["en"],"DJ":["aa","so","ar","fr"],"DK":["da","en","de","sv","fo","kl","jut"],"DM":["en"],"DO":["es","en"],"DZ":["arq","ar","fr","kab","en"],"EA":["es"],"EC":["es","qu","qug"],"EE":["et","ru","en","fi","vro"],"EG":["ar","arz","en","el"],"EH":["ar"],"ER":["ti","en","tig","ar","aa","byn"],"ES":["es","en","ca","gl","eu","ast","ext"],"ET":["en","am","om","so","ti","aa"],"FI":["fi","en","sv","de","ru","et","rmf","se","smn","sms"],"FJ":["en","hi","hif","fj","rtm"],"FK":["en"],"FM":["en"],"FO":["fo"],"FR":["fr","en","es","de","oc","it","pt","pcd","gsw","br","co","ca","nl","eu","frp","ia"],"GA":["fr"],"GB":["en","fr","de","sco","pa-guru","cy","bn","zh-hant","zh","el","it","ks-arab","gd","yi","ml","ga","kw"],"GD":["en"],"GE":["ka","xmf","ru","hy","ab","os","ku-latn"],"GF":["fr","zh-hant","zh"],"GG":["en"],"GH":["ak","en","ee","gur","gaa","ha-latn"],"GI":["en","es"],"GL":["kl","da"],"GM":["en"],"GN":["fr","ff","nqo"],"GP":["fr"],"GQ":["es","fr","pt"],"GR":["el","en","fr","de","pnt","mk","tr","bg","sq","tsd"],"GT":["es"],"GU":["en","ch"],"GW":["pt"],"GY":["en"],"HK":["zh-hant","zh","yue","en"],"HN":["es","en"],"HR":["hr","en","it"],"HT":["ht","fr"],"HU":["hu","en","de","fr","ro","hr","sk","sl"],"IC":["es"],"ID":["id","jv","su","ms","min","bew","ban","bug","bjn","ace","bbc-latn","zh-hant","zh","sly","mwv"],"IE":["en","ga","fr"],"IL":["he","en","ar","ru","ro","yi","pl","lad-latn","hu","am","ti","ml"],"IM":["en","gv"],"IN":["hi","en","bn","te","mr","ta","ur","gu","kn","ml","or","pa-guru","bho","as","mai","hne","ne","sat","ks-arab","gom-deva","sd","doi","tcy","brx","mni","hoc","saz","bfq","njo","bo","bpy","bft","sa","dv","dz"],"IO":["en"],"IQ":["ar","en","ckb","az-arab","az-latn","fa","lrc"],"IR":["fa","az-arab","az-latn","mzn","glk","ckb","sdh","tk","lrc","ar","bqi","luz","lki","bgn","hy","ps","ka","gbz","kk-arab","kk-cyrl"],"IS":["is","da"],"IT":["it","en","fr","sc","de","vec","nap","lij","scn","sl","sdc","fur","egl","ca","el","lmo","pms","hr","rgn"],"JE":["en"],"JM":["en","jam"],"JO":["ar","en"],"JP":["ja","ryu","ko"],"KE":["sw","en","ki","so","pko","om","ar","pa-guru","gu"],"KG":["ky","ru"],"KH":["km"],"KI":["en"],"KM":["ar","fr"],"KN":["en"],"KP":["ko"],"KR":["ko"],"KW":["ar"],"KY":["en"],"KZ":["ru","kk-cyrl","en","de","ug-cyrl","ug-arab"],"LA":["lo"],"LB":["ar","en","hy","ku-arab","ku-latn","fr"],"LC":["en"],"LI":["de","gsw"],"LK":["si","ta","en"],"LR":["en"],"LS":["st","en","zu","ss","xh"],"LT":["lt","ru","en","de","sgs"],"LU":["fr","lb","de","en","pt"],"LV":["lv","en","ru","ltg"],"LY":["ar"],"MA":["ary","ar","zgh","fr","en","tzm","shi-latn","rif","es"],"MC":["fr"],"MD":["ro","uk","bg","gag","ru"],"ME":["sr-latn","sr-cyrl","sq"],"MF":["fr"],"MG":["mg","fr","en"],"MH":["en","mh"],"MK":["mk","sq","tr"],"ML":["bm","fr","ses","ar"],"MM":["my","shn","kac","mnw"],"MN":["mn","kk-arab","kk-cyrl","zh","ru","ug-cyrl","ug-arab"],"MO":["zh-hant","zh","pt","en"],"MP":["en","ch"],"MQ":["fr"],"MR":["ar","fr","ff","wo"],"MS":["en"],"MT":["mt","en","it","fr"],"MU":["mfe","en","bho","ur","fr","ta"],"MV":["dv"],"MW":["en","ny","tum","zu"],"MX":["es","en","yua","sei"],"MY":["ms","en","zh-hant","zh","ta","jv","dtp","ml","bug","bjn"],"MZ":["pt","ts","ny","sw","zu"],"NA":["af","kj","ng","hz","en","de","tn"],"NC":["fr"],"NE":["ha-latn","fr","ar"],"NF":["en"],"NG":["en","ha-latn","ig","yo","ha-arab","ar"],"NI":["es"],"NL":["nl","en","de","fr","nds","li","fy","id","zea","rif","tr"],"NO":["nb","nn","se"],"NP":["ne","mai","bho","new","en","dty","hi","bo","bn"],"NR":["en","na"],"NU":["en","niu"],"NZ":["en","mi"],"OM":["ar","fa"],"PA":["es","en","zh-hant","zh"],"PE":["es","qu","ay"],"PF":["fr","ty","zh-hant","zh"],"PG":["tpi","en","ho"],"PH":["en","tl","es","ceb","ilo","hil","war","pam","pag","zh-hant","zh","cps","krj","bto"],"PK":["ur","pa-guru","en","ps","sd","skr-arab","brh","fa","bgn","tg-cyrl","bft","khw","ks-arab"],"PL":["pl","en","de","ru","szl","be","uk","csb","sli","lt"],"PM":["fr","en"],"PN":["en"],"PR":["es","en"],"PS":["ar"],"PT":["pt","en","fr","es","gl"],"PW":["en"],"PY":["gn","es","de"],"QA":["ar","fa","ml"],"RE":["fr","rcf","ta"],"RO":["ro","en","fr","es","hu","de","tr","sr-latn","sr-cyrl","bg","el","pl"],"RS":["sr-cyrl","sr-latn","sq","hu","ro","hr","sk","uk"],"RU":["ru","tt","ba","cv","hy","ce","av","udm","mhr","sah","os","kbd","myv","mdf","kv","lez","krc","inh","tyv","az-cyrl","az-latn","ady","krl","lbe","koi","mrj","fi","sr-latn","sr-cyrl","vep","mn","vot","cu"],"RW":["rw","en","fr"],"SA":["ar"],"SB":["en"],"SC":["fr","en"],"SD":["ar","en","ha-arab","ha-latn"],"SE":["sv","en","fi","fit","se","yi","smj","sma","ia"],"SG":["en","zh","ms","ta","ml","pa-guru"],"SH":["en"],"SI":["sl","hr","en","de","hu","it"],"SJ":["nb","ru"],"SK":["sk","cs","en","de","hu","uk","pl"],"SL":["kri","en"],"SM":["it","eo"],"SN":["wo","fr","ff"],"SO":["so","ar","sw","om"],"SR":["nl","srn","zh-hant","zh"],"SS":["ar","en"],"ST":["pt"],"SV":["es"],"SX":["en","es","nl"],"SY":["ar","ku-latn","fr","hy"],"SZ":["en","ss","zu","ts"],"TA":["en"],"TC":["en"],"TD":["fr","ar"],"TF":["fr"],"TG":["fr","ee"],"TH":["th","en","nod","zh-hant","zh","mnw","shn"],"TJ":["tg-cyrl","ru","fa","ar"],"TK":["en"],"TL":["pt","tet"],"TM":["tk","ru","uz","ku-latn"],"TN":["aeb-arab","ar","fr"],"TO":["to","en"],"TR":["tr","en","ku-latn","kbd","az-latn","az-arab","ar","bg","ady","kiu","hy","ka","sr-latn","sr-cyrl","lzz","sq","ab","el","tru","uz","ky","kk-cyrl"],"TT":["en","es"],"TV":["en"],"TW":["zh-hant","zh","trv"],"TZ":["sw","en","lag"],"UA":["uk","ru","pl","yi","rue","be","crh","ro","bg","tr","hu","el"],"UG":["sw","lg","en","rw","hi"],"UM":["en"],"US":["en","es","zh-hant","zh","fr","de","tl","it","vi","ko","ru","nv","yi","pdc","haw","frc","chr","esu","cho","lkt","ik","mus"],"UY":["es"],"UZ":["uz","ru","kaa","tr"],"VA":["it","la"],"VC":["en"],"VE":["es"],"VG":["en"],"VI":["en"],"VN":["vi","zh-hant","zh"],"VU":["bi","en","fr"],"WF":["wls","fr"],"WS":["sm","en"],"XK":["sq","aln","sr-cyrl","sr-latn"],"YE":["ar","en"],"YT":["swb","fr","sw"],"ZA":["en","zu","xh","af","nso","tn","st","ts","ss","ve","hi","sw"],"ZM":["en","ny","loz"],"ZW":["sn","en","ny","ve","tn"]}}; +} ( jQuery ) ); diff --git a/extensions/wikidata/module/scripts/langsuggest.js b/extensions/wikidata/module/scripts/langsuggest.js new file mode 100644 index 000000000..b8a1061ba --- /dev/null +++ b/extensions/wikidata/module/scripts/langsuggest.js @@ -0,0 +1,78 @@ + +/******************** + * LANGUAGE SUGGEST * + ********************/ + +// This list was manually copied from https://www.wikidata.org/w/api.php?action=paraminfo&modules=wbsetlabel on 2017-10-06 +// I don't think it is worth making every OpenRefine client perform this query at every startup, because it typically does +// not change very often. +// See https://stackoverflow.com/questions/46507037/how-to-get-all-allowed-languages-for-wikidata/46562061#46562061 +WIKIDATA_LANGUAGES = [ "aa", "ab", "ace", "ady", "ady-cyrl", "aeb", "aeb-arab", "aeb-latn", "af", "ak", "aln", "als", "am", "an", "ang", "anp", "ar", "arc", "arn", "arq", "ary", "arz", +"as", "ase", "ast", "atj", "av", "avk", "awa", "ay", "az", "azb", "ba", "ban", "bar", "bat-smg", "bbc", "bbc-latn", "bcc", "bcl", "be", "be-tarask", "be-x-old", "bg", "bgn", "bh", "bho", +"bi", "bjn", "bm", "bn", "bo", "bpy", "bqi", "br", "brh", "bs", "bto", "bug", "bxr", "ca", "cbk-zam", "cdo", "ce", "ceb", "ch", "cho", "chr", "chy", "ckb", "co", "cps", "cr", "crh", +"crh-cyrl", "crh-latn", "cs", "csb", "cu", "cv", "cy", "da", "de", "de-at", "de-ch", "de-formal", "din", "diq", "dsb", "dtp", "dty", "dv", "dz", "ee", "egl", "el", "eml", "en", "en-ca", +"en-gb", "eo", "es", "et", "eu", "ext", "fa", "ff", "fi", "fit", "fiu-vro", "fj", "fo", "fr", "frc", "frp", "frr", "fur", "fy", "ga", "gag", "gan", "gan-hans", "gan-hant", "gd", "gl", +"glk", "gn", "gom", "gom-deva", "gom-latn", "gor", "got", "grc", "gsw", "gu", "gv", "ha", "hak", "haw", "he", "hi", "hif", "hif-latn", "hil", "ho", "hr", "hrx", "hsb", "ht", "hu", "hy", +"hz", "ia", "id", "ie", "ig", "ii", "ik", "ike-cans", "ike-latn", "ilo", "inh", "io", "is", "it", "iu", "ja", "jam", "jbo", "jut", "jv", "ka", "kaa", "kab", "kbd", "kbd-cyrl", "kbp", +"kea", "kg", "khw", "ki", "kiu", "kj", "kk", "kk-arab", "kk-cn", "kk-cyrl", "kk-kz", "kk-latn", "kk-tr", "kl", "km", "kn", "ko", "ko-kp", "koi", "kr", "krc", "kri", "krj", "krl", "ks", +"ks-arab", "ks-deva", "ksh", "ku", "ku-arab", "ku-latn", "kv", "kw", "ky", "la", "lad", "lb", "lbe", "lez", "lfn", "lg", "li", "lij", "liv", "lki", "lmo", "ln", "lo", "loz", "lrc", "lt", +"ltg", "lus", "luz", "lv", "lzh", "lzz", "mai", "map-bms", "mdf", "mg", "mh", "mhr", "mi", "min", "mk", "ml", "mn", "mo", "mr", "mrj", "ms", "mt", "mus", "mwl", "my", "myv", "mzn", "na", +"nah", "nan", "nap", "nb", "nds", "nds-nl", "ne", "new", "ng", "niu", "nl", "nl-informal", "nn", "no", "nod", "nov", "nrm", "nso", "nv", "ny", "nys", "oc", "olo", "om", "or", "os", "ota", +"pa", "pag", "pam", "pap", "pcd", "pdc", "pdt", "pfl", "pi", "pih", "pl", "pms", "pnb", "pnt", "prg", "ps", "pt", "pt-br", "qu", "qug", "rgn", "rif", "rm", "rmy", "rn", "ro", "roa-rup", +"roa-tara", "ru", "rue", "rup", "ruq", "ruq-cyrl", "ruq-latn", "rw", "rwr", "sa", "sah", "sat", "sc", "scn", "sco", "sd", "sdc", "sdh", "se", "sei", "ses", "sg", "sgs", "sh", "shi", +"shi-latn", "shi-tfng", "shn", "si", "simple", "sje", "sk", "skr", "skr-arab", "sl", "sli", "sm", "sma", "smj", "sn", "so", "sq", "sr", "sr-ec", "sr-el", "srn", "srq", "ss", "st", "stq", +"su", "sv", "sw", "szl", "ta", "tay", "tcy", "te", "tet", "tg", "tg-cyrl", "tg-latn", "th", "ti", "tk", "tl", "tly", "tn", "to", "tokipona", "tpi", "tr", "tru", "ts", "tt", "tt-cyrl", +"tt-latn", "tum", "tw", "ty", "tyv", "tzm", "udm", "ug", "ug-arab", "ug-latn", "uk", "ur", "uz", "uz-cyrl", "uz-latn", "ve", "vec", "vep", "vi", "vls", "vmf", "vo", "vot", "vro", "wa", +"war", "wo", "wuu", "xal", "xh", "xmf", "yi", "yo", "yue", "za", "zea", "zh", "zh-classical", "zh-cn", "zh-hans", "zh-hant", "zh-hk", "zh-min-nan", "zh-mo", "zh-my", "zh-sg", "zh-tw", +"zh-yue", "zu" ] + +$.suggest("langsuggest", { + _init: function() { + this.api_url = "https://www.wikidata.org/w/api.php"; + this._status.SELECT = "Select a language from the list:"; + }, + + request: function(val, cursor) { + var self = this; + var ajax_options = { + url: self.api_url, + data: { action: "languagesearch", + search: val, + format: "json", }, + success: function(data) { + self.response(self.convertResults(data)); + }, + dataType: "jsonp", + }; + $.ajax(ajax_options); + }, + + convertResults: function(data) { + var array = []; + for (var key in data.languagesearch) { + if (data.languagesearch.hasOwnProperty(key) && WIKIDATA_LANGUAGES.indexOf(key) != -1) { + array.push({ id: key, name: key, search_name: data.languagesearch[key] }); + } + } + return array; + }, + + create_item: function(data, response_data) { + var css = this.options.css; + var li = $("
  • ").addClass(css.item); + var type = $("
    ").addClass("fbs-item-type").text(data.id); + var native_name = this.get_native_name(data.id); + var full_name = native_name ? native_name : data.search_name; + var label = $("