UNPKG

dojox

Version:

Dojo eXtensions, a rollup of many useful sub-projects and varying states of maturity – from very stable and robust, to alpha and experimental. See individual projects contain README files for details.

100 lines (93 loc) 3.89 kB
define([ "dojo/_base/declare", "dojo/_base/array", "dojo/dom-construct", "./common", "dojo/_base/window" ], function(declare, array, domConstruct, common, win){ // module: // dojox/mobile/ListItem return declare(null, { // summary: // Support for control over text direction for mobile ListItem widget, using Unicode Control Characters to control text direction. // description: // Implementation for text direction support for Label and RightText. // Text direction is also applied to ListItem's embedded nodes, containing text. // Complicated embedded nodes (like tables) are not supported. // This class should not be used directly. // Mobile ListItem widget loads this module when user sets "has: {'dojo-bidi': true }" in data-dojo-config. _applyAttributes: function(){ if(!this.textDir && this.getParent() && this.getParent().get("textDir")){ this.textDir = this.getParent().get("textDir"); } this.inherited( arguments); if(this.textDir){ this._applyTextDirToTextElements(); } }, _setRightTextAttr: function(text){ if(!this.templateString && !this.rightTextNode){ // When using a template, let the template create the element. this.rightTextNode = domConstruct.create("div", {className:"mblListItemRightText"}, this.labelNode, "before"); } if(this.rightTextNode){ // when using a template it may not contain a rightTextNode this.rightText = text; this.rightTextNode.innerHTML = this._cv ? this._cv(text) : text; if(this.textDir){ this.rightTextNode.innerHTML = common.enforceTextDirWithUcc(this.rightTextNode.innerHTML, this.textDir); } } }, _setLabelAttr: function(/*String*/text){ this.inherited("_setLabelAttr",arguments); this.labelNode.innerHTML = common.enforceTextDirWithUcc(this.labelNode.innerHTML, this.textDir); }, _applyTextDirToTextElements: function(){ // summary: // Wrap child text nodes in directional UCC marks if(this.labelNode.innerHTML){ this.labelNode.innerHTML = common.removeUCCFromText(this.labelNode.innerHTML); this.labelNode.innerHTML = common.enforceTextDirWithUcc(this.labelNode.innerHTML, this.textDir); this.labelNode.style.cssText = "text-align: start"; return; } var nEncount = 0; array.forEach(this.domNode.childNodes, function(node){ var textNode; if(nEncount === 0){ /* Replace content of directional text node, if found */ if(node.nodeType === 3 && (node.nodeValue === common.MARK.RLE || node.nodeValue === common.MARK.LRE)){ node.nodeValue = (node.nodeValue === common.MARK.RLE) ? common.MARK.LRE : common.MARK.RLE; nEncount = 2; return; } var currentNode = (node.nodeType === 1 && node.childNodes.length === 1) ? node.firstChild : node; if(currentNode.nodeType === 3 && currentNode.nodeValue){ /* Insert directional text node */ if(currentNode.nodeValue.search(/[.\S]/) != -1){ nEncount = 1; textNode = win.doc.createTextNode((this.getTextDir(currentNode.nodeValue).toLowerCase() === 'rtl') ? common.MARK.RLE : common.MARK.LRE); domConstruct.place(textNode, node, "before"); } } } /* Insert PDF text node, prevent further processing */ else if(nEncount === 1 && node.nodeName.toLowerCase() === "div"){ nEncount = 2; textNode = win.doc.createTextNode(common.MARK.PDF); domConstruct.place(textNode, node, "before"); } }, this); }, _setTextDirAttr: function(textDir){ if(textDir && this.textDir !== textDir){ this.textDir = textDir; this._applyTextDirToTextElements(); if(this.rightTextNode){ this.rightTextNode.innerHTML = common.removeUCCFromText(this.rightTextNode.innerHTML); this.rightTextNode.innerHTML = common.enforceTextDirWithUcc(this.rightTextNode.innerHTML, this.textDir); } } } }); });