diff options
author | Barak Korren <[email protected]> | 2013-04-02 20:38:07 +0300 |
---|---|---|
committer | Barak Korren <[email protected]> | 2013-04-02 20:38:07 +0300 |
commit | 58a2577d48790c79adfd44bcfd662c980ce6cfe4 (patch) | |
tree | 523d814ea0b7b6f617fe515b186099c6e83fed72 /lib/dijit/_editor/plugins/ViewSource.js.uncompressed.js | |
parent | e470a273cf09562fb2f9c0c899002303f19c8d16 (diff) | |
parent | cc332603431102a682feda22b9cf0093a29f0176 (diff) |
Merge branch 'master' of https://github.com/gothfox/Tiny-Tiny-RSS.git
Diffstat (limited to 'lib/dijit/_editor/plugins/ViewSource.js.uncompressed.js')
-rw-r--r-- | lib/dijit/_editor/plugins/ViewSource.js.uncompressed.js | 577 |
1 files changed, 0 insertions, 577 deletions
diff --git a/lib/dijit/_editor/plugins/ViewSource.js.uncompressed.js b/lib/dijit/_editor/plugins/ViewSource.js.uncompressed.js deleted file mode 100644 index e70e05c22..000000000 --- a/lib/dijit/_editor/plugins/ViewSource.js.uncompressed.js +++ /dev/null @@ -1,577 +0,0 @@ -define("dijit/_editor/plugins/ViewSource", [ - "dojo/_base/array", // array.forEach - "dojo/_base/declare", // declare - "dojo/dom-attr", // domAttr.set - "dojo/dom-construct", // domConstruct.create domConstruct.place - "dojo/dom-geometry", // domGeometry.setMarginBox domGeometry.position - "dojo/dom-style", // domStyle.set - "dojo/_base/event", // event.stop - "dojo/i18n", // i18n.getLocalization - "dojo/keys", // keys.F12 - "dojo/_base/lang", // lang.hitch - "dojo/on", // on() - "dojo/sniff", // has("ie") has("webkit") - "dojo/_base/window", // win.body win.global - "dojo/window", // winUtils.getBox - "../../focus", // focus.focus() - "../_Plugin", - "../../form/ToggleButton", - "../..", // dijit._scopeName - "../../registry", // registry.getEnclosingWidget() - "dojo/aspect", // Aspect commands for adice - "dojo/i18n!../nls/commands" -], function(array, declare, domAttr, domConstruct, domGeometry, domStyle, event, i18n, keys, lang, on, has, win, - winUtils, focus, _Plugin, ToggleButton, dijit, registry, aspect){ - -// module: -// dijit/_editor/plugins/ViewSource - - -var ViewSource = declare("dijit._editor.plugins.ViewSource",_Plugin, { - // summary: - // This plugin provides a simple view source capability. When view - // source mode is enabled, it disables all other buttons/plugins on the RTE. - // It also binds to the hotkey: CTRL-SHIFT-F11 for toggling ViewSource mode. - - // stripScripts: [public] Boolean - // Boolean flag used to indicate if script tags should be stripped from the document. - // Defaults to true. - stripScripts: true, - - // stripComments: [public] Boolean - // Boolean flag used to indicate if comment tags should be stripped from the document. - // Defaults to true. - stripComments: true, - - // stripComments: [public] Boolean - // Boolean flag used to indicate if iframe tags should be stripped from the document. - // Defaults to true. - stripIFrames: true, - - // readOnly: [const] Boolean - // Boolean flag used to indicate if the source view should be readonly or not. - // Cannot be changed after initialization of the plugin. - // Defaults to false. - readOnly: false, - - // _fsPlugin: [private] Object - // Reference to a registered fullscreen plugin so that viewSource knows - // how to scale. - _fsPlugin: null, - - toggle: function(){ - // summary: - // Function to allow programmatic toggling of the view. - - // For Webkit, we have to focus a very particular way. - // when swapping views, otherwise focus doesn't shift right - // but can't focus this way all the time, only for VS changes. - // If we did it all the time, buttons like bold, italic, etc - // break. - if(has("webkit")){this._vsFocused = true;} - this.button.set("checked", !this.button.get("checked")); - - }, - - _initButton: function(){ - // summary: - // Over-ride for creation of the resize button. - var strings = i18n.getLocalization("dijit._editor", "commands"), - editor = this.editor; - this.button = new ToggleButton({ - label: strings["viewSource"], - ownerDocument: editor.ownerDocument, - dir: editor.dir, - lang: editor.lang, - showLabel: false, - iconClass: this.iconClassPrefix + " " + this.iconClassPrefix + "ViewSource", - tabIndex: "-1", - onChange: lang.hitch(this, "_showSource") - }); - - // IE 7 has a horrible bug with zoom, so we have to create this node - // to cross-check later. Sigh. - if(has("ie") == 7){ - this._ieFixNode = domConstruct.create("div", { - style: { - opacity: "0", - zIndex: "-1000", - position: "absolute", - top: "-1000px" - } - }, editor.ownerDocumentBody); - } - // Make sure readonly mode doesn't make the wrong cursor appear over the button. - this.button.set("readOnly", false); - }, - - - setEditor: function(/*dijit/Editor*/ editor){ - // summary: - // Tell the plugin which Editor it is associated with. - // editor: Object - // The editor object to attach the print capability to. - this.editor = editor; - this._initButton(); - - this.editor.addKeyHandler(keys.F12, true, true, lang.hitch(this, function(e){ - // Move the focus before switching - // It'll focus back. Hiding a focused - // node causes issues. - this.button.focus(); - this.toggle(); - event.stop(e); - - // Call the focus shift outside of the handler. - setTimeout(lang.hitch(this, function(){ - // We over-ride focus, so we just need to call. - this.editor.focus(); - }), 100); - })); - }, - - _showSource: function(source){ - // summary: - // Function to toggle between the source and RTE views. - // source: boolean - // Boolean value indicating if it should be in source mode or not. - // tags: - // private - var ed = this.editor; - var edPlugins = ed._plugins; - var html; - this._sourceShown = source; - var self = this; - try{ - if(!this.sourceArea){ - this._createSourceView(); - } - if(source){ - // Update the QueryCommandEnabled function to disable everything but - // the source view mode. Have to over-ride a function, then kick all - // plugins to check their state. - ed._sourceQueryCommandEnabled = ed.queryCommandEnabled; - ed.queryCommandEnabled = function(cmd){ - return cmd.toLowerCase() === "viewsource"; - }; - this.editor.onDisplayChanged(); - html = ed.get("value"); - html = this._filter(html); - ed.set("value", html); - array.forEach(edPlugins, function(p){ - // Turn off any plugins not controlled by queryCommandenabled. - if(p && !(p instanceof ViewSource) && p.isInstanceOf(_Plugin)){ - p.set("disabled", true) - } - }); - - // We actually do need to trap this plugin and adjust how we - // display the textarea. - if(this._fsPlugin){ - this._fsPlugin._getAltViewNode = function(){ - return self.sourceArea; - }; - } - - this.sourceArea.value = html; - - // Since neither iframe nor textarea have margin, border, or padding, - // just set sizes equal - this.sourceArea.style.height = ed.iframe.style.height; - this.sourceArea.style.width = ed.iframe.style.width; - domStyle.set(ed.iframe, "display", "none"); - domStyle.set(this.sourceArea, { - display: "block" - }); - - var resizer = function(){ - // function to handle resize events. - // Will check current VP and only resize if - // different. - var vp = winUtils.getBox(ed.ownerDocument); - - if("_prevW" in this && "_prevH" in this){ - // No actual size change, ignore. - if(vp.w === this._prevW && vp.h === this._prevH){ - return; - }else{ - this._prevW = vp.w; - this._prevH = vp.h; - } - }else{ - this._prevW = vp.w; - this._prevH = vp.h; - } - if(this._resizer){ - clearTimeout(this._resizer); - delete this._resizer; - } - // Timeout it to help avoid spamming resize on IE. - // Works for all browsers. - this._resizer = setTimeout(lang.hitch(this, function(){ - delete this._resizer; - this._resize(); - }), 10); - }; - this._resizeHandle = on(window, "resize", lang.hitch(this, resizer)); - - //Call this on a delay once to deal with IE glitchiness on initial size. - setTimeout(lang.hitch(this, this._resize), 100); - - //Trigger a check for command enablement/disablement. - this.editor.onNormalizedDisplayChanged(); - - this.editor.__oldGetValue = this.editor.getValue; - this.editor.getValue = lang.hitch(this, function(){ - var txt = this.sourceArea.value; - txt = this._filter(txt); - return txt; - }); - - this._setListener = aspect.after(this.editor, "setValue", lang.hitch(this, function(htmlTxt){ - htmlTxt = htmlTxt || ""; - htmlTxt = this._filter(htmlTxt); - this.sourceArea.value = htmlTxt; - }), true); - }else{ - // First check that we were in source view before doing anything. - // corner case for being called with a value of false and we hadn't - // actually been in source display mode. - if(!ed._sourceQueryCommandEnabled){ - return; - } - - // Remove the set listener. - this._setListener.remove(); - delete this._setListener; - - this._resizeHandle.remove(); - delete this._resizeHandle; - - if(this.editor.__oldGetValue){ - this.editor.getValue = this.editor.__oldGetValue; - delete this.editor.__oldGetValue; - } - - // Restore all the plugin buttons state. - ed.queryCommandEnabled = ed._sourceQueryCommandEnabled; - if(!this._readOnly){ - html = this.sourceArea.value; - html = this._filter(html); - ed.beginEditing(); - ed.set("value", html); - ed.endEditing(); - } - - array.forEach(edPlugins, function(p){ - // Turn back on any plugins we turned off. - if(p && p.isInstanceOf(_Plugin)){ - p.set("disabled", false); - } - }); - - domStyle.set(this.sourceArea, "display", "none"); - domStyle.set(ed.iframe, "display", "block"); - delete ed._sourceQueryCommandEnabled; - - //Trigger a check for command enablement/disablement. - this.editor.onDisplayChanged(); - } - // Call a delayed resize to wait for some things to display in header/footer. - setTimeout(lang.hitch(this, function(){ - // Make resize calls. - var parent = ed.domNode.parentNode; - if(parent){ - var container = registry.getEnclosingWidget(parent); - if(container && container.resize){ - container.resize(); - } - } - ed.resize(); - }), 300); - }catch(e){ - console.log(e); - } - }, - - updateState: function(){ - // summary: - // Over-ride for button state control for disabled to work. - this.button.set("disabled", this.get("disabled")); - }, - - _resize: function(){ - // summary: - // Internal function to resize the source view - // tags: - // private - var ed = this.editor; - var tbH = ed.getHeaderHeight(); - var fH = ed.getFooterHeight(); - var eb = domGeometry.position(ed.domNode); - - // Styles are now applied to the internal source container, so we have - // to subtract them off. - var containerPadding = domGeometry.getPadBorderExtents(ed.iframe.parentNode); - var containerMargin = domGeometry.getMarginExtents(ed.iframe.parentNode); - - var extents = domGeometry.getPadBorderExtents(ed.domNode); - var edb = { - w: eb.w - extents.w, - h: eb.h - (tbH + extents.h + fH) - }; - - // Fullscreen gets odd, so we need to check for the FS plugin and - // adapt. - if(this._fsPlugin && this._fsPlugin.isFullscreen){ - //Okay, probably in FS, adjust. - var vp = winUtils.getBox(ed.ownerDocument); - edb.w = (vp.w - extents.w); - edb.h = (vp.h - (tbH + extents.h + fH)); - } - - if(has("ie")){ - // IE is always off by 2px, so we have to adjust here - // Note that IE ZOOM is broken here. I can't get - //it to scale right. - edb.h -= 2; - } - - // IE has a horrible zoom bug. So, we have to try and account for - // it and fix up the scaling. - if(this._ieFixNode){ - var _ie7zoom = -this._ieFixNode.offsetTop / 1000; - edb.w = Math.floor((edb.w + 0.9) / _ie7zoom); - edb.h = Math.floor((edb.h + 0.9) / _ie7zoom); - } - - domGeometry.setMarginBox(this.sourceArea, { - w: edb.w - (containerPadding.w + containerMargin.w), - h: edb.h - (containerPadding.h + containerMargin.h) - }); - - // Scale the parent container too in this case. - domGeometry.setMarginBox(ed.iframe.parentNode, { - h: edb.h - }); - }, - - _createSourceView: function(){ - // summary: - // Internal function for creating the source view area. - // tags: - // private - var ed = this.editor; - var edPlugins = ed._plugins; - this.sourceArea = domConstruct.create("textarea"); - if(this.readOnly){ - domAttr.set(this.sourceArea, "readOnly", true); - this._readOnly = true; - } - domStyle.set(this.sourceArea, { - padding: "0px", - margin: "0px", - borderWidth: "0px", - borderStyle: "none" - }); - domConstruct.place(this.sourceArea, ed.iframe, "before"); - - if(has("ie") && ed.iframe.parentNode.lastChild !== ed.iframe){ - // There's some weirdo div in IE used for focus control - // But is messed up scaling the textarea if we don't config - // it some so it doesn't have a varying height. - domStyle.set(ed.iframe.parentNode.lastChild,{ - width: "0px", - height: "0px", - padding: "0px", - margin: "0px", - borderWidth: "0px", - borderStyle: "none" - }); - } - - // We also need to take over editor focus a bit here, so that focus calls to - // focus the editor will focus to the right node when VS is active. - ed._viewsource_oldFocus = ed.focus; - var self = this; - ed.focus = function(){ - if(self._sourceShown){ - self.setSourceAreaCaret(); - }else{ - try{ - if(this._vsFocused){ - delete this._vsFocused; - // Must focus edit node in this case (webkit only) or - // focus doesn't shift right, but in normal - // cases we focus with the regular function. - focus.focus(ed.editNode); - }else{ - ed._viewsource_oldFocus(); - } - }catch(e){ - console.log(e); - } - } - }; - - var i, p; - for(i = 0; i < edPlugins.length; i++){ - // We actually do need to trap this plugin and adjust how we - // display the textarea. - p = edPlugins[i]; - if(p && (p.declaredClass === "dijit._editor.plugins.FullScreen" || - p.declaredClass === (dijit._scopeName + - "._editor.plugins.FullScreen"))){ - this._fsPlugin = p; - break; - } - } - if(this._fsPlugin){ - // Found, we need to over-ride the alt-view node function - // on FullScreen with our own, chain up to parent call when appropriate. - this._fsPlugin._viewsource_getAltViewNode = this._fsPlugin._getAltViewNode; - this._fsPlugin._getAltViewNode = function(){ - return self._sourceShown?self.sourceArea:this._viewsource_getAltViewNode(); - }; - } - - // Listen to the source area for key events as well, as we need to be able to hotkey toggle - // it from there too. - this.connect(this.sourceArea, "onkeydown", lang.hitch(this, function(e){ - if(this._sourceShown && e.keyCode == keys.F12 && e.ctrlKey && e.shiftKey){ - this.button.focus(); - this.button.set("checked", false); - setTimeout(lang.hitch(this, function(){ed.focus();}), 100); - event.stop(e); - } - })); - }, - - _stripScripts: function(html){ - // summary: - // Strips out script tags from the HTML used in editor. - // html: String - // The HTML to filter - // tags: - // private - if(html){ - // Look for closed and unclosed (malformed) script attacks. - html = html.replace(/<\s*script[^>]*>((.|\s)*?)<\\?\/\s*script\s*>/ig, ""); - html = html.replace(/<\s*script\b([^<>]|\s)*>?/ig, ""); - html = html.replace(/<[^>]*=(\s|)*[("|')]javascript:[^$1][(\s|.)]*[$1][^>]*>/ig, ""); - } - return html; - }, - - _stripComments: function(html){ - // summary: - // Strips out comments from the HTML used in editor. - // html: String - // The HTML to filter - // tags: - // private - if(html){ - html = html.replace(/<!--(.|\s){1,}?-->/g, ""); - } - return html; - }, - - _stripIFrames: function(html){ - // summary: - // Strips out iframe tags from the content, to avoid iframe script - // style injection attacks. - // html: String - // The HTML to filter - // tags: - // private - if(html){ - html = html.replace(/<\s*iframe[^>]*>((.|\s)*?)<\\?\/\s*iframe\s*>/ig, ""); - } - return html; - }, - - _filter: function(html){ - // summary: - // Internal function to perform some filtering on the HTML. - // html: String - // The HTML to filter - // tags: - // private - if(html){ - if(this.stripScripts){ - html = this._stripScripts(html); - } - if(this.stripComments){ - html = this._stripComments(html); - } - if(this.stripIFrames){ - html = this._stripIFrames(html); - } - } - return html; - }, - - setSourceAreaCaret: function(){ - // summary: - // Internal function to set the caret in the sourceArea - // to 0x0 - var global = win.global; - var elem = this.sourceArea; - focus.focus(elem); - if(this._sourceShown && !this.readOnly){ - if(has("ie")){ - if(this.sourceArea.createTextRange){ - var range = elem.createTextRange(); - range.collapse(true); - range.moveStart("character", -99999); // move to 0 - range.moveStart("character", 0); // delta from 0 is the correct position - range.moveEnd("character", 0); - range.select(); - } - }else if(global.getSelection){ - if(elem.setSelectionRange){ - elem.setSelectionRange(0,0); - } - } - } - }, - - destroy: function(){ - // summary: - // Over-ride to remove the node used to correct for IE's - // zoom bug. - if(this._ieFixNode){ - domConstruct.destroy(this._ieFixNode); - } - if(this._resizer){ - clearTimeout(this._resizer); - delete this._resizer; - } - if(this._resizeHandle){ - this._resizeHandle.remove(); - delete this._resizeHandle; - } - if(this._setListener){ - this._setListener.remove(); - delete this._setListener; - } - this.inherited(arguments); - } -}); - -// Register this plugin. -// For back-compat accept "viewsource" (all lowercase) too, remove in 2.0 -_Plugin.registry["viewSource"] = _Plugin.registry["viewsource"] = function(args){ - return new ViewSource({ - readOnly: ("readOnly" in args)?args.readOnly:false, - stripComments: ("stripComments" in args)?args.stripComments:true, - stripScripts: ("stripScripts" in args)?args.stripScripts:true, - stripIFrames: ("stripIFrames" in args)?args.stripIFrames:true - }); -}; - - - - -return ViewSource; -}); |