Esanders has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/343040 )
Change subject: Add tool to change directionality of document view ...................................................................... Add tool to change directionality of document view This is apparently useful for editors of bidi documents, especially in source mode. Toggling the viewed direction does not affect the document model in any way. Bug: T153356 Change-Id: I1e3d89e8250b75d0b6992cf4664e84de66d99bc0 --- M build/modules.json M demos/ve/desktop.html M demos/ve/mobile.html M i18n/en.json M i18n/qqq.json M src/ce/ve.ce.Document.js M src/init/sa/ve.init.sa.Target.js M src/ui/actions/ve.ui.ContentAction.js A src/ui/tools/ve.ui.ChangeDirectionalityTool.js M src/ui/ve.ui.CommandHelpRegistry.js M src/ui/ve.ui.CommandRegistry.js M src/ui/ve.ui.TriggerRegistry.js M tests/index.html 13 files changed, 144 insertions(+), 6 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor refs/changes/40/343040/1 diff --git a/build/modules.json b/build/modules.json index 4eca486..62a8dfe 100644 --- a/build/modules.json +++ b/build/modules.json @@ -532,6 +532,7 @@ "src/ui/widgets/ve.ui.NoFocusButtonWidget.js", "src/ui/widgets/ve.ui.WhitespacePreservingTextInputWidget.js", "src/ui/tools/ve.ui.AnnotationTool.js", + "src/ui/tools/ve.ui.ChangeDirectionalityTool.js", "src/ui/tools/ve.ui.ClearAnnotationTool.js", "src/ui/tools/ve.ui.WindowTool.js", "src/ui/tools/ve.ui.FragmentWindowTool.js", diff --git a/demos/ve/desktop.html b/demos/ve/desktop.html index f90c840..684a76f 100644 --- a/demos/ve/desktop.html +++ b/demos/ve/desktop.html @@ -470,6 +470,7 @@ <script src="../../src/ui/widgets/ve.ui.NoFocusButtonWidget.js"></script> <script src="../../src/ui/widgets/ve.ui.WhitespacePreservingTextInputWidget.js"></script> <script src="../../src/ui/tools/ve.ui.AnnotationTool.js"></script> + <script src="../../src/ui/tools/ve.ui.ChangeDirectionalityTool.js"></script> <script src="../../src/ui/tools/ve.ui.ClearAnnotationTool.js"></script> <script src="../../src/ui/tools/ve.ui.WindowTool.js"></script> <script src="../../src/ui/tools/ve.ui.FragmentWindowTool.js"></script> diff --git a/demos/ve/mobile.html b/demos/ve/mobile.html index 116eaab..f5da8a3 100644 --- a/demos/ve/mobile.html +++ b/demos/ve/mobile.html @@ -470,6 +470,7 @@ <script src="../../src/ui/widgets/ve.ui.NoFocusButtonWidget.js"></script> <script src="../../src/ui/widgets/ve.ui.WhitespacePreservingTextInputWidget.js"></script> <script src="../../src/ui/tools/ve.ui.AnnotationTool.js"></script> + <script src="../../src/ui/tools/ve.ui.ChangeDirectionalityTool.js"></script> <script src="../../src/ui/tools/ve.ui.ClearAnnotationTool.js"></script> <script src="../../src/ui/tools/ve.ui.WindowTool.js"></script> <script src="../../src/ui/tools/ve.ui.FragmentWindowTool.js"></script> diff --git a/i18n/en.json b/i18n/en.json index aaef04d..86073e8 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -43,6 +43,9 @@ "visualeditor-changedesc-set": "$1 set to $2", "visualeditor-changedesc-unknown": "$1 changed", "visualeditor-changedesc-unset": "$1 unset from $2", + "visualeditor-changedir": "Change directionality", + "visualeditor-changedir-tool-ltr": "View as left-to-right", + "visualeditor-changedir-tool-rtl": "View as right-to-left", "visualeditor-clearbutton-tooltip": "Clear styling", "visualeditor-clipboard-copy": "Copy", "visualeditor-clipboard-cut": "Cut", diff --git a/i18n/qqq.json b/i18n/qqq.json index f693ab6..4717906 100644 --- a/i18n/qqq.json +++ b/i18n/qqq.json @@ -51,6 +51,9 @@ "visualeditor-changedesc-set": "Fallback description of an attribute value being set for visual diffing, if no specific i18n exists for that kind of change.\n\nValues:\n* $1 – Attribute name, like 'lang' or 'dir'\n* $2 – New attribute value, like 'fa' or 'auto'", "visualeditor-changedesc-unknown": "Fallback description of an attribute value change for visual diffing which can't be otherwise described, if no specific i18n exists for that kind of change.\n\nValues:\n* $1 – Attribute name, like 'lang' or 'dir'", "visualeditor-changedesc-unset": "Fallback description of an attribute value being unset for visual diffing, if no specific i18n exists for that kind of change.\n\nValues:\n* $1 – Attribute name, like 'lang' or 'dir'\n* $2 – Previous attribute value, like 'ar' or 'rtl'", + "visualeditor-changedir": "Label for tool to change directionality", + "visualeditor-changedir-tool-ltr": "Label for tool to change rendered directionality to LTR", + "visualeditor-changedir-tool-rtl": "Label for tool to change rendered directionality to RTL", "visualeditor-clearbutton-tooltip": "Tooltip text for the clear styling button. This clears \"styling\" like bold or italics from the current selection, but not \"formatting\" like being a list, a heading or a table.", "visualeditor-clipboard-copy": "Label for copy command.\n{{Identical|Copy}}", "visualeditor-clipboard-cut": "Label for cut command.\n{{Identical|Cut}}", diff --git a/src/ce/ve.ce.Document.js b/src/ce/ve.ce.Document.js index 7278b95..6897325 100644 --- a/src/ce/ve.ce.Document.js +++ b/src/ce/ve.ce.Document.js @@ -18,10 +18,11 @@ // Parent constructor ve.ce.Document.super.call( this, new ve.ce.DocumentNode( model.getDocumentNode(), surface ) ); - this.getDocumentNode().$element.prop( { - lang: model.getLang(), - dir: model.getDir() - } ); + this.lang = null; + this.dir = null; + + this.setLang( model.getLang() ); + this.setDir( model.getDir() ); // Properties this.model = model; @@ -34,6 +35,44 @@ /* Methods */ /** + * Set the document view language + * + * @param {string} lang Language code + */ +ve.ce.Document.prototype.setLang = function ( lang ) { + this.getDocumentNode().$element.prop( 'lang', lang ); + this.lang = lang; +}; + +/** + * Set the document view directionality + * + * @param {string} dir Directionality (ltr/rtl) + */ +ve.ce.Document.prototype.setDir = function ( dir ) { + this.getDocumentNode().$element.prop( 'dir', dir ); + this.dir = dir; +}; + +/** + * Get the document view language + * + * @return {string} Language code + */ +ve.ce.Document.prototype.getLang = function () { + return this.lang; +}; + +/** + * Get the document view directionality + * + * @return {string} Directionality (ltr/rtl) + */ +ve.ce.Document.prototype.getDir = function () { + return this.dir; +}; + +/** * Get a slug at an offset. * * @method diff --git a/src/init/sa/ve.init.sa.Target.js b/src/init/sa/ve.init.sa.Target.js index 6eee832..fca8bec 100644 --- a/src/init/sa/ve.init.sa.Target.js +++ b/src/init/sa/ve.init.sa.Target.js @@ -52,7 +52,7 @@ icon: 'menu', indicator: null, title: OO.ui.deferMsg( 'visualeditor-pagemenu-tooltip' ), - include: [ 'findAndReplace', 'commandHelp' ] + include: [ 'findAndReplace', 'changeDirectionality', 'commandHelp' ] } ]; diff --git a/src/ui/actions/ve.ui.ContentAction.js b/src/ui/actions/ve.ui.ContentAction.js index 1747835..ccc458e 100644 --- a/src/ui/actions/ve.ui.ContentAction.js +++ b/src/ui/actions/ve.ui.ContentAction.js @@ -32,7 +32,7 @@ * @static * @property */ -ve.ui.ContentAction.static.methods = [ 'insert', 'remove', 'select', 'pasteSpecial', 'selectAll' ]; +ve.ui.ContentAction.static.methods = [ 'insert', 'remove', 'select', 'pasteSpecial', 'selectAll', 'changeDirectionality' ]; /* Methods */ @@ -100,6 +100,19 @@ return false; }; +/** + * Change directionality + * + * @method + * @return {boolean} Action was executed + */ +ve.ui.ContentAction.prototype.changeDirectionality = function () { + var documentView = this.surface.getView().getDocument(); + documentView.setDir( documentView.getDir() === 'ltr' ? 'rtl' : 'ltr' ); + this.surface.getModel().emit( 'contextChange' ); + return true; +}; + /* Registration */ ve.ui.actionFactory.register( ve.ui.ContentAction ); diff --git a/src/ui/tools/ve.ui.ChangeDirectionalityTool.js b/src/ui/tools/ve.ui.ChangeDirectionalityTool.js new file mode 100644 index 0000000..7972402 --- /dev/null +++ b/src/ui/tools/ve.ui.ChangeDirectionalityTool.js @@ -0,0 +1,67 @@ +/*! + * VisualEditor UserInterface ChangeDirectionalityTool class. + * + * @copyright 2011-2017 VisualEditor Team and others; see http://ve.mit-license.org + */ + +/** + * UserInterface change view directionality tool. + * + * @class + * @extends ve.ui.Tool + * @constructor + * @param {OO.ui.ToolGroup} toolGroup + * @param {Object} [config] Configuration options + */ +ve.ui.ChangeDirectionalityTool = function VeUiChangeDirectionalityTool() { + // Parent constructor + ve.ui.ChangeDirectionalityTool.super.apply( this, arguments ); + + this.modelDir = null; + + this.setDisabled( false ); +}; + +/* Inheritance */ + +OO.inheritClass( ve.ui.ChangeDirectionalityTool, ve.ui.Tool ); + +/* Static Properties */ + +ve.ui.ChangeDirectionalityTool.static.name = 'changeDirectionality'; + +ve.ui.ChangeDirectionalityTool.static.icon = 'textDirRTL'; + +ve.ui.ChangeDirectionalityTool.static.title = + OO.ui.deferMsg( 'visualeditor-changedir-rtl' ); + +ve.ui.ChangeDirectionalityTool.static.commandName = 'changeDirectionality'; + +ve.ui.ChangeDirectionalityTool.static.deactivateOnSelect = false; + +/* Methods */ + +/** + * @inheritdoc + */ +ve.ui.ChangeDirectionalityTool.prototype.onUpdateState = function ( fragment ) { + var viewDir = this.toolbar.getSurface().getView().getDocument().getDir(), + modelDir = fragment.getDocument().getDir(); + + // Parent method + ve.ui.ChangeDirectionalityTool.super.prototype.onUpdateState.apply( this, arguments ); + + if ( modelDir !== this.modelDir ) { + // Icons used here textDirLTR, textDirRTL + this.setIcon( 'textDir' + ( modelDir === 'ltr' ? 'RTL' : 'LTR' ) ); + // Messages used here: visualeditor-changedir-tool-ltr, visualeditor-changedir-tool-rtl + this.setTitle( ve.msg( 'visualeditor-changedir-tool-' + ( modelDir === 'ltr' ? 'rtl' : 'ltr' ) ) ); + this.modelDir = modelDir; + } + + this.setActive( viewDir !== modelDir ); +}; + +/* Registration */ + +ve.ui.toolFactory.register( ve.ui.ChangeDirectionalityTool ); diff --git a/src/ui/ve.ui.CommandHelpRegistry.js b/src/ui/ve.ui.CommandHelpRegistry.js index 2a86a9a..58ad06e 100644 --- a/src/ui/ve.ui.CommandHelpRegistry.js +++ b/src/ui/ve.ui.CommandHelpRegistry.js @@ -151,4 +151,5 @@ ve.ui.commandHelpRegistry.register( 'other', 'findNext', { trigger: 'findNext', label: OO.ui.deferMsg( 'visualeditor-find-and-replace-next-button' ) } ); ve.ui.commandHelpRegistry.register( 'other', 'findPrevious', { trigger: 'findPrevious', label: OO.ui.deferMsg( 'visualeditor-find-and-replace-previous-button' ) } ); ve.ui.commandHelpRegistry.register( 'other', 'selectAll', { trigger: 'selectAll', label: OO.ui.deferMsg( 'visualeditor-content-select-all' ) } ); +ve.ui.commandHelpRegistry.register( 'other', 'changeDirectionality', { trigger: 'changeDirectionality', label: OO.ui.deferMsg( 'visualeditor-changedir' ) } ); ve.ui.commandHelpRegistry.register( 'other', 'commandHelp', { trigger: 'commandHelp', label: OO.ui.deferMsg( 'visualeditor-dialog-command-help-title' ) } ); diff --git a/src/ui/ve.ui.CommandRegistry.js b/src/ui/ve.ui.CommandRegistry.js index 77d1727..759d693 100644 --- a/src/ui/ve.ui.CommandRegistry.js +++ b/src/ui/ve.ui.CommandRegistry.js @@ -190,6 +190,11 @@ ); ve.ui.commandRegistry.register( new ve.ui.Command( + 'changeDirectionality', 'content', 'changeDirectionality' + ) +); +ve.ui.commandRegistry.register( + new ve.ui.Command( 'language', 'window', 'open', { args: [ 'language' ], supportedSelections: [ 'linear' ] } ) diff --git a/src/ui/ve.ui.TriggerRegistry.js b/src/ui/ve.ui.TriggerRegistry.js index 5415059..f5cb521 100644 --- a/src/ui/ve.ui.TriggerRegistry.js +++ b/src/ui/ve.ui.TriggerRegistry.js @@ -207,6 +207,9 @@ 'findAndReplace', { mac: new ve.ui.Trigger( 'cmd+f' ), pc: new ve.ui.Trigger( 'ctrl+f' ) } ); ve.ui.triggerRegistry.register( + 'changeDirectionality', { mac: new ve.ui.Trigger( 'cmd+shift+x' ), pc: new ve.ui.Trigger( 'ctrl+shift+x' ) } +); +ve.ui.triggerRegistry.register( 'findNext', { mac: new ve.ui.Trigger( 'cmd+g' ), pc: [ diff --git a/tests/index.html b/tests/index.html index 6f99cb9..ec9c3fe 100644 --- a/tests/index.html +++ b/tests/index.html @@ -389,6 +389,7 @@ <script src="../src/ui/widgets/ve.ui.NoFocusButtonWidget.js"></script> <script src="../src/ui/widgets/ve.ui.WhitespacePreservingTextInputWidget.js"></script> <script src="../src/ui/tools/ve.ui.AnnotationTool.js"></script> + <script src="../src/ui/tools/ve.ui.ChangeDirectionalityTool.js"></script> <script src="../src/ui/tools/ve.ui.ClearAnnotationTool.js"></script> <script src="../src/ui/tools/ve.ui.WindowTool.js"></script> <script src="../src/ui/tools/ve.ui.FragmentWindowTool.js"></script> -- To view, visit https://gerrit.wikimedia.org/r/343040 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I1e3d89e8250b75d0b6992cf4664e84de66d99bc0 Gerrit-PatchSet: 1 Gerrit-Project: VisualEditor/VisualEditor Gerrit-Branch: master Gerrit-Owner: Esanders <esand...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits