ajwillia-ms pushed a commit to branch master. http://git.enlightenment.org/website/www.git/commit/?id=cb5e7a34145f3e78765638e8d20e55c9e7d517bd
commit cb5e7a34145f3e78765638e8d20e55c9e7d517bd Author: Andy Williams <a...@andywilliams.me> Date: Wed Oct 25 11:34:20 2017 +0100 Update to latest markdown plugin --- public_html/lib/plugins/markdownextra/action.php | 10 +- .../lib/meltdown-tweaks/meltdown-tweaks.css | 12 +- .../lib/meltdown-tweaks/meltdown-tweaks.js | 14 +- .../plugins/markdownextra/lib/meltdown/README.md | 131 +- .../markdownextra/lib/meltdown/css/meltdown.css | 340 +++-- .../lib/meltdown/fonts/meltdown.dev.svg | 0 .../markdownextra/lib/meltdown/fonts/meltdown.eot | Bin .../markdownextra/lib/meltdown/fonts/meltdown.svg | 0 .../markdownextra/lib/meltdown/fonts/meltdown.ttf | Bin .../markdownextra/lib/meltdown/fonts/meltdown.woff | Bin .../lib/meltdown/js/jquery.meltdown.js | 1371 ++++++++++++++------ .../meltdown/js/lib/element_resize_detection.js | 81 ++ .../lib/meltdown/js/lib/js-markdown-extra.js | 0 13 files changed, 1451 insertions(+), 508 deletions(-) diff --git a/public_html/lib/plugins/markdownextra/action.php b/public_html/lib/plugins/markdownextra/action.php index 28a8d20c..3e84a548 100644 --- a/public_html/lib/plugins/markdownextra/action.php +++ b/public_html/lib/plugins/markdownextra/action.php @@ -63,11 +63,11 @@ class action_plugin_markdownextra extends DokuWiki_Action_Plugin { $event->data['script'][] = array( 'type' => 'text/javascript', '_data' => '', - 'src' => $meltdownBase.'js/jquery.meltdown.js'); + 'src' => $meltdownBase.'js/lib/js-markdown-extra.js'); $event->data['script'][] = array( 'type' => 'text/javascript', '_data' => '', - 'src' => $meltdownBase.'js/lib/js-markdown-extra.js'); + 'src' => $meltdownBase.'js/lib/element_resize_detection.js'); $event->data['script'][] = array( 'type' => 'text/javascript', '_data' => '', @@ -75,7 +75,11 @@ class action_plugin_markdownextra extends DokuWiki_Action_Plugin { $event->data['script'][] = array( 'type' => 'text/javascript', '_data' => '', + 'src' => $meltdownBase.'js/jquery.meltdown.js'); + $event->data['script'][] = array( + 'type' => 'text/javascript', + '_data' => '', 'src' => $meltdownTweaksBase.'meltdown-tweaks.js'); } } -} \ No newline at end of file +} diff --git a/public_html/lib/plugins/markdownextra/lib/meltdown-tweaks/meltdown-tweaks.css b/public_html/lib/plugins/markdownextra/lib/meltdown-tweaks/meltdown-tweaks.css index 95989956..795c7cb2 100644 --- a/public_html/lib/plugins/markdownextra/lib/meltdown-tweaks/meltdown-tweaks.css +++ b/public_html/lib/plugins/markdownextra/lib/meltdown-tweaks/meltdown-tweaks.css @@ -21,4 +21,14 @@ /* For CSS3 browsers: allow user to resize the preview: */ .meltdown_preview { resize: vertical; } /* Cosmetic fixes due to editor and preview being reversed: */ -.meltdown_wrap textarea { margin-bottom: 5px !important; } +.meltdown_wrap { + width: 100% !important; +} + +.meltdown_wrap textarea { + padding: 0; +} + +.meltdown_bar, .meltdown_bar .meltdown_control span { + box-sizing: content-box; +} diff --git a/public_html/lib/plugins/markdownextra/lib/meltdown-tweaks/meltdown-tweaks.js b/public_html/lib/plugins/markdownextra/lib/meltdown-tweaks/meltdown-tweaks.js index aba910fc..f81ecc85 100644 --- a/public_html/lib/plugins/markdownextra/lib/meltdown-tweaks/meltdown-tweaks.js +++ b/public_html/lib/plugins/markdownextra/lib/meltdown-tweaks/meltdown-tweaks.js @@ -1,18 +1,12 @@ jQuery(document).ready(function($) { - // Disabling default DukuWiki toolbar (but allow users to renable it if needed): - $("#tool__bar").addClass("markdownextra_disabledtools").append($("<div\>", { - id: "markdownextra_tool__bar_overlay", - "class": "markdownextra_disabledtools_overlay", - text: "[ Activate DukuWiki toolbar ]", - click: function() { - $(this).fadeOut(200); - }})); + // Disabling default DukuWiki toolbar + $("#tool__bar").hide(); // Activate Meltdown on the textarea: $("#wiki__text").meltdown(); - + // Put preview after the editor: $(".meltdown_wrap").append($(".meltdown_preview-wrap")); // Open the preview (There is no init option for this...): $(".meltdown_control-preview").click(); -}); \ No newline at end of file +}); diff --git a/public_html/lib/plugins/markdownextra/lib/meltdown/README.md b/public_html/lib/plugins/markdownextra/lib/meltdown/README.md old mode 100755 new mode 100644 index a1bfaaf9..1af02902 --- a/public_html/lib/plugins/markdownextra/lib/meltdown/README.md +++ b/public_html/lib/plugins/markdownextra/lib/meltdown/README.md @@ -1,32 +1,125 @@ Meltdown (Markdown Extra Live Toolbox) ====================================== -A JQuery plugin that adds Markdown Extra live previews, and a toolbar for common markdown actions. **Check out the [project page](http://iphands.github.com/Meltdown/) for a live demo** +A JQuery plugin that adds Markdown Extra live previews, and a toolbar for common markdown editions. **Check out the [project page](http://iphands.github.com/Meltdown/) for a live demo.** + +It also features a fullscreen and a side-by-side mode (vertically split screen). The editor and the preview can be resized with your mouse (in browsers supporting the CSS `resize` property). + + +## Usage + +### Simple, standard, awesome -##Usage -###Simple, standard, awesome ~~~ -jQuery('some_selector').meltdown(); +jQuery('texterea').meltdown(); ~~~ -###Advanced, changing the preview slider timeout and adding an example widget, still awesome + +### Advanced, fullscreen with preview on the side, still awesome + ~~~ -jQuery('some_selector').meltdown({ - previewTimeout: 4000, - examples['test'] = { - label: "Test", - altText: "A test example/opt", - markdown: "this is a test" - } +jQuery('#my_textarea').meltdown({ + fullscreen: true, + openPreview: true, + sidebyside: true }); ~~~ -##Libraries that Meltdown uses -* [jQuery](http://jquery.com/) -* [jQuery UI](http://jqueryui.com/) [1] -* [js-markdown-extra](https://github.com/tanakahisateru/js-markdown-extra "Github link to js-markdown-extra") -* [rangyinputs](http://code.google.com/p/rangyinputs/ "Google code link to rangyinputs") [1] -[1] jQuery UI and rangyinputs are optional. For now Meltdown will still function without these plugins. +## Options + +Option | Default | Description +------ | ------- | ----------- +`fullscreen` | `false` | Set to `true` to go in fullscreen mode. +`openPreview` | `false` | Set to `true` to open the preview area. +`previewHeight` | `"editorHeight"` | With `"editorHeight"` the preview will have the same height as the textarea. With `"auto"` its height will adapt to its content. Also accepts any CSS height value (like `"300px"`). +`previewCollapses` | `true` | If set to `false`, the editor will expand over the preview when the preview is toggled. +`sidebyside` | `false` | Set to `true` to go in side-by-side editing mode. +`autoScrollPreview` | `true` | Keeps the preview area scrolled at the bottom when you are typing text. Set to `false` to disable. +`parser` | `window.Markdown` | `window.Markdown` is the parser function from [js-markdown-extra](https://github.com/tanakahisateru/js-markdown-extra "Github link to js-markdown-extra"). `false` will directly parse the text as HTML. A parser function takes a text string as input and returns an HTML formatted string. _(More infos in the Parser section below.)_ + +Note: the default options can be changed in: `jQuery.meltdown.defaults` + + +## API + +Calling a method: + +~~~ +$("#my_textarea").meltdown("methodName", arg1, arg2); +~~~ + +Note: methods are chainnable. + + +### Methods + +### `update([force])` + +Update the preview with the content of the editor. Set `force` to `true` to force the the update even if the content of the editor is the same as the last update. + +### `updateWith(text, [force])` + +Update the preview with the given `text`. The `text`will be parsed before being rendered. Set `force` to `true` to force the the update even if the `text` is the same as the last update. + +#### `isPreviewOpen()` + +Returns `true` if the preview is open. Otherwise `false`. + +#### `togglePreview([open])` + +If `open` is `true`, open the preview, if `false` close it. If `undefined` or not given, toggle preview. + +#### `isFullscreen()` + +Returns `true` if meltdown is in fullscreen. Otherwise `false`. + +#### `toggleFullscreen([full])` + +If `full` is `true`, go fullscreen, if `false` leave fullscreen. If `undefined` or not given, toggle fullscreen. + +#### `isSidebyside()` + +Returns `true` if meltdown is in side-by-side. Otherwise `false`. + +#### `toggleSidebyside([sidebyside])` + +If `sidebyside` is `true`, go side-by-side, if `false` leave side-by-side. If `undefined` or not given, toggle side-by-side. + + +## Parser + +By default, uses the [js-markdown-extra](https://github.com/tanakahisateru/js-markdown-extra "Github link to js-markdown-extra") parser. You can change it to any parser you want (even a non Markdown parser). + + +## Requirements + +* A modern browser: any recent version of Firefox, Chrome, IE 9+, Safari or Opera. _Note: works in IE 8 but with some disabled features._ +* jQuery 1.9.1+ _Note: works with jQuery 1.7.2+, but with some disabled features._ + +## Changelog + +* **v0.2** (??-APR-2014) + + * Fullscreen mode + * Side-by-side mode + * Editor and preview can be resized with the mouse + * Customizable parser + * Debounced preview updates (while typing) + * Renamed and added init options + * Added API to control meltdown from JavaScript (Now the parser must be loaded before jquery.meltdown.js) + * Dropped IE 6-7 support + * Removed jQuery-ui dependency + +* **v0.1** + + +## Libraries used + +* [js-markdown-extra](https://github.com/tanakahisateru/js-markdown-extra "Github link to js-markdown-extra"): provides the markdown extra parser. +* [Rangyinputs](http://code.google.com/p/rangyinputs/ "Google code link to rangyinputs"): manipulation of text selections. +* [element_resize_detection](http://www.backalleycoder.com/2013/03/18/cross-browser-event-based-element-resize-detection/): detects `resize` events on any DOM element. + + +## License -##License Copyright (c) 2013 Ian Page Hands and Mark Caron. Licensed under the GPLv3 license. diff --git a/public_html/lib/plugins/markdownextra/lib/meltdown/css/meltdown.css b/public_html/lib/plugins/markdownextra/lib/meltdown/css/meltdown.css old mode 100755 new mode 100644 index fd3eb144..4e255f58 --- a/public_html/lib/plugins/markdownextra/lib/meltdown/css/meltdown.css +++ b/public_html/lib/plugins/markdownextra/lib/meltdown/css/meltdown.css @@ -1,14 +1,41 @@ +/* Prevent text selection while mouse dragging. + (See: http://blog.herdhound.com/2012/02/prevent-text-selection-during-mousemove.html) */ +.unselectable * { +-webkit-user-select: none; +-khtml-user-select: none; +-moz-user-select: none; +-o-user-select: none; +user-select: none; +} + + /* Meltdown Wrap =======================================================================*/ .meltdown_wrap { position: relative; margin-bottom: 10px; - padding: 5px; + padding: 0 5px; background: #c8c8c8; -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; + overflow: hidden; +} + +/* Fix for conflict with Bootstrap 3 / normalize.css */ +.meltdown_wrap, .meltdown_wrap * { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +/* Allow the margins to collapse with the other childrens of .meltdown_wrap: */ +.meltdown_topmargin { + margin-bottom: 5px; +} +.meltdown_bottommargin { + margin-top: 5px; } /* Meltdown Font Icons @@ -104,6 +131,65 @@ you can use the generic selector below, but it's slower: content: "\2b"; } + +/* Meltdown Editor +=======================================================================*/ + +.meltdown_editor-wrap { +} + +.meltdown_editor-deco { + border: 1px solid #a8a8a8; + padding: 5px; + background: #fff; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +.meltdown_editor-deco.focus { + border-color: #5c8cd0; +} + +.meltdown_editor { + display: block; /* Removes the bottom space. */ + margin: 0; + border: 0; + width: 100%; + resize: vertical; + min-height: 15px; +} + +.meltdown_editor { + outline: none; +} + + +/* Resize handle +=======================================================================*/ + + +.sidebyside .meltdown_preview-wrap2 { + position: relative; + padding-left: 8px; +} +.meltdown_resizehandle { + text-align: center; + margin: -2px 0 -5px; + font-size: 12px; +} +.meltdown_resizehandle > span:before { + content: "•"; + color: #686868; +} + +.meltdown_resizehandle-horiz { + cursor: auto; +} +.meltdown_resizehandle-vert { + cursor: row-resize; +} + + /* Meltdown Toolbar =======================================================================*/ @@ -132,18 +218,14 @@ ul.meltdown_controls { padding: 0 !important; list-style: none; } -li.meltdown_control, -li.meltdown_controlgroup { +li.meltdown_controlbutton { position: relative; float: left; margin: 0 0 0 5px; padding: 0; } - .meltdown_controls li.meltdown_control-preview { float: right; margin-right: 5px; } - .meltdown_controls li.meltdown_control-table, - .meltdown_controls li.meltdown_controlgroup-kitchenSink { padding-left: 5px; border-left: 1px solid #ccc; } -li.meltdown_control span, -li.meltdown_controlgroup > span { +.meltdown_controls li.meltdown_control-preview { float: right; margin-right: 5px; } +li.meltdown_controlbutton > span { float: left; padding: 6px; line-height: 1em; @@ -157,42 +239,50 @@ li.meltdown_controlgroup > span { font-size: 12px; cursor: pointer; } -li.meltdown_control:hover span, -li.meltdown_control:focus span { +.meltdown_controls li.meltdown_controlsep > span { + min-width: 1px; + width: 1px; + background-color: #ccc; + padding-right: 0; + padding-left: 0; + cursor: auto; +} +li.meltdown_controlbutton:hover > span, +li.meltdown_controlbutton:focus > span { color: #06c; } -.meltdown_controls li.meltdown_control-bold span, -.meltdown_controls li.meltdown_control-italics span, -.meltdown_controls li.meltdown_control-ul span, -.meltdown_controls li.meltdown_control-ol span, -.meltdown_controls li.meltdown_control-hr span, -.meltdown_controls li.meltdown_control-table span, -.meltdown_controls li.meltdown_control-preview span, -.meltdown_controls li.meltdown_control-link span, -.meltdown_controls li.meltdown_control-img span, -.meltdown_controls li.meltdown_control-blockquote span, -.meltdown_controls li.meltdown_control-codeblock span, -.meltdown_controls li.meltdown_control-code span, -.meltdown_controls li.meltdown_control-footnote span, +.meltdown_controls li.meltdown_control-bold > span, +.meltdown_controls li.meltdown_control-italics > span, +.meltdown_controls li.meltdown_control-ul > span, +.meltdown_controls li.meltdown_control-ol > span, +.meltdown_controls li.meltdown_control-hr > span, +.meltdown_controls li.meltdown_control-table > span, +.meltdown_controls li.meltdown_control-preview > span, +.meltdown_controls li.meltdown_control-link > span, +.meltdown_controls li.meltdown_control-img > span, +.meltdown_controls li.meltdown_control-blockquote > span, +.meltdown_controls li.meltdown_control-codeblock > span, +.meltdown_controls li.meltdown_control-code > span, +.meltdown_controls li.meltdown_control-footnote > span, .meltdown_controls li.meltdown_controlgroup-kitchenSink > span { height: 12px; position: relative; text-indent: -9000em; width: 12px; } -.meltdown_controls li.meltdown_control-bold span:before, -.meltdown_controls li.meltdown_control-italics span:before, -.meltdown_controls li.meltdown_control-ul span:before, -.meltdown_controls li.meltdown_control-ol span:before, -.meltdown_controls li.meltdown_control-hr span:before, -.meltdown_controls li.meltdown_control-table span:before, -.meltdown_controls li.meltdown_control-preview span:before, -.meltdown_controls li.meltdown_control-link span:before, -.meltdown_controls li.meltdown_control-img span:before, -.meltdown_controls li.meltdown_control-blockquote span:before, -.meltdown_controls li.meltdown_control-codeblock span:before, -.meltdown_controls li.meltdown_control-code span:before, -.meltdown_controls li.meltdown_control-footnote span:before, +.meltdown_controls li.meltdown_control-bold > span:before, +.meltdown_controls li.meltdown_control-italics > span:before, +.meltdown_controls li.meltdown_control-ul > span:before, +.meltdown_controls li.meltdown_control-ol > span:before, +.meltdown_controls li.meltdown_control-hr > span:before, +.meltdown_controls li.meltdown_control-table > span:before, +.meltdown_controls li.meltdown_control-preview > span:before, +.meltdown_controls li.meltdown_control-link > span:before, +.meltdown_controls li.meltdown_control-img > span:before, +.meltdown_controls li.meltdown_control-blockquote > span:before, +.meltdown_controls li.meltdown_control-codeblock > span:before, +.meltdown_controls li.meltdown_control-code > span:before, +.meltdown_controls li.meltdown_control-footnote > span:before, .meltdown_controls li.meltdown_controlgroup-kitchenSink > span:before { position: absolute; left: 4px; @@ -207,57 +297,57 @@ li.meltdown_control:focus span { text-indent: 0; } /* Resize and reposition Bold */ -.meltdown_controls li.meltdown_control-bold span:before { +.meltdown_controls li.meltdown_control-bold > span:before { content: "\62"; font-size: 12px; left: 7px; top: 7px; } /* Resize and reposition Italics */ -.meltdown_controls li.meltdown_control-italics span:before { +.meltdown_controls li.meltdown_control-italics > span:before { content: "\69"; font-size: 12px; left: 8px; top: 7px; } -.meltdown_controls li.meltdown_control-ul span:before { +.meltdown_controls li.meltdown_control-ul > span:before { content: "\2a"; } -.meltdown_controls li.meltdown_control-ol span:before { +.meltdown_controls li.meltdown_control-ol > span:before { content: "\31"; } -.meltdown_controls li.meltdown_control-table span:before { +.meltdown_controls li.meltdown_control-table > span:before { content: "\74"; } -.meltdown_controls li.meltdown_control-preview span:before { +.meltdown_controls li.meltdown_control-preview > span:before { content: "\73"; } - .meltdown_controls li.meltdown_preview-showing span:before { - content: "\68"; /* Toggle to Closed Eye */ - color: #06c; - } +.meltdown_wrap.openpreview .meltdown_controls li.meltdown_control-preview > span:before { + content: "\68"; /* Toggle to Closed Eye */ + color: #06c; +} .meltdown_controls li.meltdown_controlgroup-kitchenSink > span:before { content: "\2b"; } -.meltdown_controls li.meltdown_control-link span:before { +.meltdown_controls li.meltdown_control-link > span:before { content: "\6c"; } -.meltdown_controls li.meltdown_control-img span:before { +.meltdown_controls li.meltdown_control-img > span:before { content: "\70"; } -.meltdown_controls li.meltdown_control-blockquote span:before { +.meltdown_controls li.meltdown_control-blockquote > span:before { content: "\22"; } -.meltdown_controls li.meltdown_control-codeblock span:before { +.meltdown_controls li.meltdown_control-codeblock > span:before { content: "\5b"; } -.meltdown_controls li.meltdown_control-code span:before { +.meltdown_controls li.meltdown_control-code > span:before { content: "\3c"; } -.meltdown_controls li.meltdown_control-footnote span:before { +.meltdown_controls li.meltdown_control-footnote > span:before { content: "\66"; } -.meltdown_controls li.meltdown_control-hr span:before { +.meltdown_controls li.meltdown_control-hr > span:before { content: "\5f"; } @@ -281,12 +371,12 @@ li.meltdown_controlgroup ul { -webkit-border-radius: 3px; border-radius: 3px; } - .meltdown_controls li.meltdown_controlgroup-kitchenSink > ul { - width: 120px; - } - li.meltdown_controlgroup-open > span { - color: #06c; - } +.meltdown_controls li.meltdown_controlgroup-kitchenSink > ul { + width: 120px; +} +li.meltdown_controlgroup-open > span { + color: #06c; +} .meltdown_controls li.meltdown_controlgroup i.meltdown-icon-caret-down { } @@ -296,11 +386,26 @@ li.meltdown_controlgroup li { } .meltdown_controls li.meltdown_controlgroup-kitchenSink li { float: left; margin-left: 5px; } li.meltdown_controlgroup li span { display: block; float: none; } - + +.meltdown_controlbutton.disabled > span, +li.meltdown_controlbutton.disabled:hover > span, +li.meltdown_controlbutton.disabled:focus > span { + color: grey; + cursor: not-allowed; +} + +.meltdown_controlbutton.overflowedControl { + display: none; +} + /* Meltdown Preview =======================================================================*/ +.meltdown_preview-wrap { + overflow: hidden; /* Prevent resizeHandle's negative margins from adding extra pixels to the height. */ +} + .meltdown_preview-header { display: block; padding: 2px 5px; @@ -325,11 +430,14 @@ li.meltdown_controlgroup li span { display: block; float: none; } -moz-border-radius-topright: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; } + .meltdown_preview { border: 1px solid #a8a8a8; border-top: 0; - margin-bottom: 3px; padding: 5px; overflow: auto; background: #fff; @@ -339,19 +447,101 @@ li.meltdown_controlgroup li span { display: block; float: none; } -moz-border-radius-bottomleft: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; + resize: vertical; + min-height: 15px; } - .meltdownvisible .meltdown_preview { - - } -.meltdown_wrap textarea { - margin: 0 !important; - padding: 5px; - border: 1px solid #a8a8a8; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + + +/* HeightsManaged +=======================================================================*/ + +.meltdown_wrap.heightsManaged { + resize: vertical; +} + +.meltdown_wrap.heightsManaged .meltdown_editor { + resize: none; +} + +.meltdown_wrap.heightsManaged .meltdown_preview { + resize: none; +} + + +/* Sidebyside +=======================================================================*/ + +.meltdown_wrap.sidebyside .meltdown_editor-wrap, +.meltdown_wrap.sidebyside .meltdown_preview-wrap { + display: table-cell; + vertical-align: top; +} + +.sidebyside .meltdown_resizehandle { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 10px; + margin: 0; +} +.sidebyside .meltdown_resizehandle > span { + position: absolute; + top: 50%; + left: 2px; + margin-top: -4px; +} + +.sidebyside .meltdown_resizehandle-vert { + cursor: auto; +} +.sidebyside .meltdown_resizehandle-horiz { + cursor: col-resize; +} + + +/* Fullscreen +=======================================================================*/ + +.meltdown_wrap.fullscreen { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + width: auto !important; + height: auto !important; + margin: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + z-index: 1000; + resize: none; +} + + +/* element_resize_detection.js + Source: http://www.backalleycoder.com/2013/03/18/cross-browser-event-based-element-resize-detection/ +=======================================================================*/ + +.resize-triggers { + visibility: hidden; +} +.resize-triggers, .resize-triggers > div, .contract-trigger:before { + content: " "; + display: block; + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + overflow: hidden; +} +.resize-triggers > div { + background: #eee; + overflow: auto; +} +.contract-trigger:before { + width: 200%; + height: 200%; } - .meltdown_wrap textarea:focus { - outline: none; - border-color: #5c8cd0; - } \ No newline at end of file diff --git a/public_html/lib/plugins/markdownextra/lib/meltdown/fonts/meltdown.dev.svg b/public_html/lib/plugins/markdownextra/lib/meltdown/fonts/meltdown.dev.svg old mode 100755 new mode 100644 diff --git a/public_html/lib/plugins/markdownextra/lib/meltdown/fonts/meltdown.eot b/public_html/lib/plugins/markdownextra/lib/meltdown/fonts/meltdown.eot old mode 100755 new mode 100644 diff --git a/public_html/lib/plugins/markdownextra/lib/meltdown/fonts/meltdown.svg b/public_html/lib/plugins/markdownextra/lib/meltdown/fonts/meltdown.svg old mode 100755 new mode 100644 diff --git a/public_html/lib/plugins/markdownextra/lib/meltdown/fonts/meltdown.ttf b/public_html/lib/plugins/markdownextra/lib/meltdown/fonts/meltdown.ttf old mode 100755 new mode 100644 diff --git a/public_html/lib/plugins/markdownextra/lib/meltdown/fonts/meltdown.woff b/public_html/lib/plugins/markdownextra/lib/meltdown/fonts/meltdown.woff old mode 100755 new mode 100644 diff --git a/public_html/lib/plugins/markdownextra/lib/meltdown/js/jquery.meltdown.js b/public_html/lib/plugins/markdownextra/lib/meltdown/js/jquery.meltdown.js old mode 100755 new mode 100644 index 9d9f1b04..da699df2 --- a/public_html/lib/plugins/markdownextra/lib/meltdown/js/jquery.meltdown.js +++ b/public_html/lib/plugins/markdownextra/lib/meltdown/js/jquery.meltdown.js @@ -1,405 +1,976 @@ -/*global jQuery, console, Markdown*/ +/*global jQuery, addResizeListener*/ /* * Meltdown (Markup Extra Live Toolbox) - * Version: 0.1 (13-FEB-2013) - * Requires: jQuery v1.7.2 or later + * Version: 0.2 (??-APR-2014) + * Requires: jQuery v1.7.2 or later (1.9.1 recommended) */ -(function (jQuery) { - 'use strict'; - - var ver, name, dbg; - ver = '0.1'; - name = 'meltdown'; - dbg = true; - - function debug(msg) { - if ((typeof console !== 'undefined') && (dbg === true)) { - console.log(msg); - } - } - - function update(previewArea, input) { - var mde = Markdown; - previewArea.height(input.outerHeight()); - previewArea.html(mde(input.val())); - } - - function addEventHandler(thees, example, control) { - control.click(function (e) { - var text, selection, before, placeholder, after, lineStart, lineEnd, charBefore, charAfter; - before = example.before || ""; - placeholder = example.placeholder || ""; - after = example.after || ""; - if (typeof thees.surroundSelectedText !== 'undefined') { - text = thees.val(); - selection = thees.getSelection(); - if (example.lineSelect) { - lineStart = text.lastIndexOf('\n', selection.start) + 1; - lineEnd = text.indexOf('\n', selection.end); - if(lineEnd === -1) { - lineEnd = text.length; - } - thees.setSelection(lineStart, lineEnd); - selection = thees.getSelection(); - } - if(selection.length > 0) { - placeholder = selection.text; - } - if (example.isBlock) { - for (var i = 0; i < 2; i++) { - charBefore = text.charAt(selection.start - 1 - i); - charAfter = text.charAt(selection.end + i); - if (charBefore !== "\n" && charBefore !== "") { - before = "\n" + before; - } - if (charAfter !== "\n" && charAfter !== "") { - after = after + "\n"; - } - } - } - if (selection.text !== placeholder) { - thees.replaceSelectedText(placeholder, "select"); - } - thees.surroundSelectedText(before, after, "select"); - } else { - debug('Failed to load surroundSelectedText'); - thees.val(before + placeholder + after + "\n\n" + thees.val()); - } - e.preventDefault(); - thees.focus(); - thees.keyup(); - }); - } - - function buildControls(opts, thees, controls) { - var controlList, example, control, tuple, t, groupClass, group, outer, tmpThis; - controlList = []; - - for (example in opts.examples) { - if (opts.examples.hasOwnProperty(example)) { - example = opts.examples[example]; - - control = jQuery('<li><span>' + example.label + '</span></li>'); - control.addClass(name + '_control'); - if (typeof example.styleClass !== 'undefined') { - control.addClass(example.styleClass); - } - - control.children(":first").attr('title', example.altText); - addEventHandler(thees, example, control); - - tuple = {}; - tuple.example = example; - tuple.control = control; - controlList.push(tuple); - } - } - - function addClickHandler(outer) { - outer.on('click', function () { - var element = jQuery(this); - element.siblings('li').removeClass(name + '_controlgroup-open').children('ul').hide(); - element.toggleClass(name + '_controlgroup-open').children('ul').toggle(); - }); - } - - for (t in controlList) { - if (controlList.hasOwnProperty(t)) { - t = controlList[t]; - if (t.example.group && t.example.groupLabel) { - groupClass = name + "_controlgroup-" + t.example.group; - group = controls.find("ul." + groupClass); - outer = jQuery('<li />'); - if (group.length === 0) { - group = jQuery('<ul style="display: none;" />'); - group.addClass(name + '_controlgroup-dropdown ' + groupClass); - outer.addClass(name + '_controlgroup ' + groupClass); - outer.append('<span>' + t.example.groupLabel + ' <i class="meltdown-icon-caret-down"></i></span><b></b>'); - outer.append(group); - controls.append(outer); - } - group.append(t.control); - addClickHandler(outer); - } else { - controls.append(t.control); - } - } - } - } - - function getAddExampleControl(options, thees, previewArea, example) { - var control = jQuery('<li><span>' + example.label + '</span></li>'); - control.addClass(name + '_control'); - if (typeof example.styleClass !== 'undefined') { - control.addClass(example.styleClass); - } - control.children(":first").attr('title', example.altText); - control.on('click', function () { - thees.val(example.markdown + "\n\n\n" + thees.val()); - thees.keyup(); - }); - return control; - } - - function getPreviewControl(options, thees, previewArea) { - var control = jQuery('<li class="' + name + '_control ' + name + '_control-preview"><span title="Show preview">Show preview</span></li>'); - control.on('click', function () { - - if (control.hasClass('disabled')) { - return; - } - - if (!previewArea.is(':visible')) { - previewArea.find('.meltdown_preview').height(thees.outerHeight()); - if (options.hasEffects) { - previewArea.slideToggle(options.previewTimeout); - } else { - previewArea.fadeIn(); - } - previewArea.addClass(name + 'visible'); - control.children(':eq(0)').text('Hide preview'); - control.addClass(name + '_preview-showing'); - update(previewArea.children(':eq(1)'), thees); - } else { - if (options.hasEffects) { - previewArea.slideToggle(options.previewTimeout); - } else { - previewArea.fadeOut(); - } - previewArea.removeClass(name + 'visible'); - control.removeClass(name + '_preview-showing'); - control.children(':eq(0)').text('Show preview'); - } - }); - return control; - } - - function getExamples() { - var key, examples, pounds, i, j; - examples = { - bold: { - label: "B", - altText: "Bold", - before: "**", - after: "**" - }, - italics: { - label: "I", - altText: "Italics", - before: "*", - after: "*" - }, - ul: { - label: "UL", - altText: "Unordered List", - before: "* ", - placeholder: "Item\n* Item", - lineSelect: true, - isBlock: true - }, - ol: { - label: "OL", - altText: "Ordered List", - before: "1. ", - placeholder: "Item 1\n2. Item 2\n3. Item 3", - lineSelect: true, - isBlock: true - }, - table: { - label: "Table", - altText: "Table", - before: "First Header | Second Header\n------------- | -------------\nContent Cell | Content Cell\nContent Cell | Content Cell\n", - isBlock: true - } - }; - - pounds = ""; - for (i = 1; i <= 6; i += 1) { - pounds = pounds + "#"; - examples['h' + i] = { - group: "h", - groupLabel: "Headers", - label: "H" + i, - altText: "Header " + i, - before: pounds + " ", - lineSelect: true - }; - } - - examples.link = { - label: "Link", - group: "kitchenSink", - groupLabel: "Kitchen Sink", - altText: "Link", - before: "[", - placeholder: "Example link", - after: "](http:// \"Link title\")" - }; - - examples.img = { - label: "Image", - group: "kitchenSink", - groupLabel: "Kitchen Sink", - altText: "Image", - before: "![Alt text](", - placeholder: "http://", - after: ")" - }; - - examples.blockquote = { - label: "Blockquote", - group: "kitchenSink", - groupLabel: "Kitchen Sink", - altText: "Blockquote", - before: "> ", - placeholder: "Quoted text", - lineSelect: true, - isBlock: true - }; - - examples.codeblock = { - label: "Code Block", - group: "kitchenSink", - groupLabel: "Kitchen Sink", - altText: "Code Block", - before: "~~~\n", - placeholder: "Code", - after: "\n~~~", - lineSelect: true, - isBlock: true - }; - - examples.code = { - label: "Code", - group: "kitchenSink", - groupLabel: "Kitchen Sink", - altText: "Inline Code", - before: "`", - placeholder: "code", - after: "`", - }; - - examples.footnote = { - label: "Footnote", - group: "kitchenSink", - groupLabel: "Kitchen Sink", - altText: "Footnote", - before: "[^1]\n\n[^1]:", - placeholder: "Example footnote", - isBlock: true - }; - - examples.hr = { - label: "HR", - group: "kitchenSink", - groupLabel: "Kitchen Sink", - altText: "Horizontal Rule", - before: "----------", - placeholder: "", - isBlock: true - }; - - for (key in examples) { - if (examples.hasOwnProperty(key)) { - examples[key].styleClass = name + "_control-" + key; - } - } - - return examples; - } - - function addToolTip(wrap) { - var tip, preview; - - preview = wrap.find('.meltdown_control-preview'); - if (typeof jQuery.qtip !== 'undefined') { - // Disable the preview - preview.addClass('disabled'); - tip = preview.qtip({ - content: "Warning this feature is a tech preview feature.<br/>" - + "There is a <a target=\"_blank\" href=\"https://github.com/iphands/Meltdown/issues/1\">known issue</a> with one of the libraries used to generate the live preview.<br/><br/>" - + "Live previews <b>can</b> cause the browser tab to stop responding.<br/><br/>" - + "This warning will be removed when <a href=\"#\" target=\"_blank\" href=\"https://github.com/iphands/Meltdown/issues/1\">the issue</a> is resolved.<br/></br>" - + "<input type=\"button\" class=\"meltdown_control-preview-enabler\" value=\"Click here\"> to remove this warning and enable live previews", - show: { - delay: 0, - when: { - event: 'mouseover' - } - }, - hide: { - delay: 5000, - when: { - event: 'mouseout' - } - }, - position: { - corner: { - target: 'leftMiddle', - tooltip: 'rightMiddle' - } - }, - api: { - onRender: function () { - jQuery('.meltdown_control-preview-enabler').click(function () { - tip.qtip('destroy'); - jQuery('.meltdown_control-preview').removeClass('disabled'); - preview.click(); - }); - } - }, - style: { - classes: 'meltdown_techpreview-qtip', - name: 'dark', - lineHeight: '1.3em', - padding: '12px', - width: { - max: 300, - min: 0 - }, - tip: true - } - }); - } - } - - jQuery.fn.meltdown = function (userOptions) { - return this.each(function () { - var defaults, opts, thees, wrap, previewWrap, preview, bar, controls; - defaults = jQuery.fn.meltdown.defaults; - opts = jQuery.extend(true, {}, defaults, userOptions); - opts.hasEffects = typeof jQuery.ui !== 'undefined'; - - thees = jQuery(this); - thees.wrap('<div class="' + name + '_wrap" />'); - thees.before('<div><div style="display: none;" class="' + name + '_preview-wrap"><span class="' + name + '_preview-header">Preview Area (<a class="meltdown_techpreview" href="https://github.com/iphands/Meltdown/issues/1">Tech Preview</a>)</span><div class="' + name + '_preview"></div></div></div><div class="meltdown_bar"><ul class="' + name + '_controls"></ul></div>'); - wrap = thees.parent(); - previewWrap = wrap.children(':eq(0)').children(':eq(0)'); /* wrapper for the preview area, but not where the updated content goes */ - preview = previewWrap.children(':eq(1)'); /* preview area where updates happen */ - bar = wrap.children(':eq(1)'); - controls = bar.children().first(); - - buildControls(opts, thees, controls); - controls.append(getPreviewControl(opts, thees, previewWrap)); - - wrap.width(thees.outerWidth()); - preview.height(thees.outerHeight()); - - thees.on('keyup', function (event) { - if (previewWrap.is(':visible')) { - update(preview, thees); - } - }); - - addToolTip(wrap); - }); - }; - - jQuery.fn.meltdown.defaults = { - examples: getExamples(), - previewTimeout: 400 - }; - -}(jQuery)); +(function ($, window, document, undefined) { + 'use strict'; + + var ver = '0.2', + plgName = 'meltdown', + dbg = true, + isIE8 = document.all && !document.addEventListener, // From: http://tanalin.com/en/articles/ie-version-js/ + jqueryRequired = [1, 8, 0], + jqueryCurrent = $.fn.jquery.split(' ')[0].split('.'), // first split to get rid of any amd related extras + isOldjQuery = false, + doc = $(document), + body = $("body"); + + for (var i = 0; i < jqueryRequired.length; i++) { + var required = jqueryRequired[i], + current = parseInt(jqueryCurrent[i], 10); + if (required > current) { + isOldjQuery = true; + break; + } else if (current > required) { + break; + } + } + + function debug(msg) { + if (window.console && dbg) { + window.console.log(msg); + } + } + + // Used to test the bottom offset of elements: + var bottomPositionTest = $('<div style="bottom: 0;" />'); + + // Helper for users that want to change the controls (For usage, see: $.meltdown.defaults.controls below) + var controlsGroup = function(name, label, controls) { + controls.name = name; + controls.label = label; + return controls; + }; + + $.meltdown = { + version: ver, + + // Expose publicly: + controlsGroup: controlsGroup, + + // Default meltdown options: + defaults: { + // Use $.meltdown.controlsGroup() to make groups and subgroups of controls. + // The available control names come from the keys of $.meltdown.controlDefs (see below) + controls: controlsGroup("", "", [ + "preview", + "bold", + "italics", + "ul", + "ol", + "|", + "table", + controlsGroup("h", "Headers", ["h1", "h2", "h3", "h4", "h5", "h6"]), + "|", + controlsGroup("kitchenSink", "Kitchen Sink", [ + "link", + "img", + "blockquote", + "codeblock", + "code", + "footnote", + "hr" + ]), + "fullscreen", + "sidebyside" + ]), + + // If true, goes directly in fullscreen mode: + fullscreen: false, + + // Should the preview be visible by default ? + openPreview: false, + + // A CSS height or "editorHeight" or "auto" (to let the height adjust to the content). + previewHeight: "editorHeight", + + // If true, when the preview is toggled it will (un)collapse resulting in the total height of the wrap to change. + // Set this to false if you want the editor to expand/shrinkin the opposite way of the preview. + // Setting this to false can be useful if you want to restrict or lock the total height. + previewCollapses: true, + + // If true, editor and preview will be displayed side by side instead of one on the other. + sidebyside: false, + + // If true, when the preview is fully scrolled it will stay scrolled while typing. + // Very convenient when typing/adding text at the end of the editor. + autoScrollPreview: true, + + // Duration of the preview toggle animation: + previewDuration: 400, + + // The parser. The function takes a string and returns an html formatted string. + // Set this to false to use an _identity_ function (for a direct HTML "parser"). + parser: window.Markdown + }, + + // Definitions for the toolbar controls: + controlDefs: { + bold: { + label: "B", + altText: "Bold", + before: "**", + after: "**" + }, + italics: { + label: "I", + altText: "Italics", + before: "*", + after: "*" + }, + ul: { + label: "UL", + altText: "Unordered List", + preselectLine: true, + before: "* ", + placeholder: "Item\n* Item", + isBlock: true + }, + ol: { + label: "OL", + altText: "Ordered List", + preselectLine: true, + before: "1. ", + placeholder: "Item 1\n2. Item 2\n3. Item 3", + isBlock: true + }, + table: { + label: "Table", + altText: "Table", + before: "First Header | Second Header\n------------- | -------------\nContent Cell | Content Cell\nContent Cell | Content Cell\n", + isBlock: true + }, + link: { + label: "Link", + altText: "Link", + before: "[", + placeholder: "Example link", + after: "](http:// \"Link title\")" + }, + img: { + label: "Image", + altText: "Image", + before: "![Alt text](", + placeholder: "http://", + after: ")" + }, + blockquote: { + label: "Blockquote", + altText: "Blockquote", + preselectLine: true, + before: "> ", + placeholder: "Quoted text", + isBlock: true + }, + codeblock: { + label: "Code Block", + altText: "Code Block", + preselectLine: true, + before: "~~~\n", + placeholder: "Code", + after: "\n~~~", + isBlock: true + }, + code: { + label: "Code", + altText: "Inline Code", + before: "`", + placeholder: "code", + after: "`" + }, + footnote: { + label: "Footnote", + altText: "Footnote", + before: "[^1]\n\n[^1]:", + placeholder: "Example footnote", + isBlock: true + }, + hr: { + label: "HR", + altText: "Horizontal Rule", + before: "----------", + placeholder: "", + isBlock: true + }, + fullscreen: { + label: "Fullscreen", + altText: "Toggle fullscreen", + click: function(meltdown /*, def, control, execAction */) { + meltdown.toggleFullscreen(); + } + }, + sidebyside: { + label: "Sidebyside", + altText: "Toggle sidebyside", + click: function(meltdown /*, def, control, execAction */) { + meltdown.toggleSidebyside(); + } + }, + preview: { + label: "Preview", + altText: "Toggle preview", + click: function(meltdown /*, def, control, execAction */) { + meltdown.togglePreview(); + } + } + } + }; + + // Add h1...h6 control definitions to $.meltdown.controlDefs: + (function(controlDefs) { + for (var pounds = "", i = 1; i <= 6; i++) { + pounds += "#"; + controlDefs['h' + i] = { + label: "H" + i, + altText: "Header " + i, + preselectLine: true, + before: pounds + " " + }; + } + })($.meltdown.controlDefs); + + + function addControlEventHandler(meltdown, def, control) { + var editor = meltdown.editor, + execAction = function () { + var text = editor.val(), + selection = editor.getSelection(), + before = def.before || "", + placeholder = def.placeholder || "", + after = def.after || ""; + + // Extend selection if needed: + if (def.preselectLine) { + var lineStart = text.lastIndexOf('\n', selection.start) + 1, + lineEnd = text.indexOf('\n', selection.end); + + if (lineEnd === -1) { + lineEnd = text.length; + } + editor.setSelection(lineStart, lineEnd); + selection = editor.getSelection(); + } + + // placeholder is only used if there is no selected text: + if (selection.length > 0) { + placeholder = selection.text; + } + + // isBlock means that there should be empty line before and after the selection: + if (def.isBlock) { + for (var i = 0; i < 2; i++) { + var charBefore = text.charAt(selection.start - 1 - i), + charAfter = text.charAt(selection.end + i); + + if (charBefore !== "\n" && charBefore !== "") { + before = "\n" + before; + } + if (charAfter !== "\n" && charAfter !== "") { + after = after + "\n"; + } + } + } + + // Insert placeholder: + if (selection.text !== placeholder) { + editor.replaceSelectedText(placeholder, "select"); + } + // Insert before and after selection: + editor.surroundSelectedText(before, after, "select"); + }; + + control.click(function (e) { + if (!control.hasClass('disabled')) { + if (def.click) { + def.click(meltdown, def, control, execAction); + } else { + execAction(); + } + meltdown.update(); + } + editor.focus(); + e.preventDefault(); + }); + } + + function addGroupClickHandler(control) { + control.on('click', function () { + control.siblings('li').removeClass(plgName + '_controlgroup-open').children('ul').hide(); + control.toggleClass(plgName + '_controlgroup-open').children('ul').toggle(); + }); + } + + function buildControls(meltdown, controlsGroup, subGroup) { + var controlList = $('<ul />'); + if (subGroup) { + controlList.css("display", "none"); + controlList.addClass(plgName + "_controlgroup-" + controlsGroup.name + " " + plgName + '_controlgroup-dropdown'); + } else { + controlList.addClass("meltdown_controls"); + } + + for (var i = 0; i < controlsGroup.length; i++) { + var controlName = controlsGroup[i], + control = $('<li />'), + span = $('<span />').appendTo(control); + if ($.type(controlName) === "string") { + if (controlName === "|") { // Separator + controlList.append(control.addClass(plgName + '_controlsep ' + plgName + '_controlbutton')); + continue; + } + var def = $.meltdown.controlDefs[controlName]; + if (def === undefined) { + debug("Control not found: " + controlName); + continue; + } + control.addClass(plgName + "_control-" + controlName + " " + plgName + '_control ' + plgName + '_controlbutton ' + (def.styleClass || "")); + span.text(def.label).attr("title", def.altText); + addControlEventHandler(meltdown, def, control); + + } else if ($.isArray(controlName)) { + control.addClass(plgName + "_controlgroup-" + controlName.name + " " + plgName + '_controlgroup ' + plgName + '_controlbutton'); + span.text(controlName.label).append('<i class="meltdown-icon-caret-down" />'); + addGroupClickHandler(control); + control.append(buildControls(meltdown, controlName, true)); + } + controlList.append(control); + } + + return controlList; + } + + function addWarning(meltdown, element) { + element.click(function(e) { + var warning = $('<div class"' + plgName + '_warning"/>').html('<center><b>The preview area is a tech preview feature</b></center><br/>' + + 'Live previews <b>can</b> cause the browser tab to stop responding.<br/><br/>' + + 'There is a <a target="_blank" href="https://github.com/iphands/Meltdown/issues/1">known issue</a> with <a target="_blank" href="https://github.com/tanakahisateru/js-markdown-extra#notice">one of the libraries</a> used to generate the live preview.<br/><br/>' + + 'This warning will be removed when the issue is resolved.<br/><br/>' + + '<center><i>Click to continue.</i></center>').css({background: "#fdd", cursor: "pointer"}); + warning.on("click", function(e) { + if (!$(e.target).is("a, a *")) { // Ignore clicks on links + meltdown.update(true); + } + }); + meltdown.preview.empty().append(warning); + e.preventDefault(); + }); + } + + // Setup event handlers for the resize handle: + function setupResizeHandle(resizeHandle, firstElem, lastElem, vertical, meltdown) { + resizeHandle.addClass("meltdown_resizehandle-" + (vertical ? "vert" : "horiz")); + var propName = vertical ? "height" : "width", + pageName = vertical ? "pageY" : "pageX", + lastEditorPercentName = vertical ? "lastEditorPercentHeight" : "lastEditorPercentWidth", + minSize = vertical ? 15 : 60; + + var startPos, minPos, maxPos, originalFirstElemSize, originalLastElemSize, + moveEventHandler = function(e) { + var delta = Math.min(Math.max(e[pageName] , minPos), maxPos) - startPos, + firstElemSize = originalFirstElemSize + delta, + lastElemSize = originalLastElemSize - delta; + firstElem[propName](firstElemSize); + lastElem[propName](lastElemSize); + if (!vertical) { + firstElem[0].style.maxWidth = firstElemSize + "px"; + lastElem[0].style.maxWidth = lastElemSize + "px"; + } + + var editorElem = vertical ? meltdown.editor[0] : meltdown.editorWrap[0], + editorSize = firstElem[0] === editorElem ? firstElemSize : lastElemSize; + meltdown[lastEditorPercentName] = editorSize / (firstElemSize + lastElemSize); + }; + + // Init dragging handlers only on mousedown: + resizeHandle.on("mousedown", function(e) { + if (meltdown.isSidebyside() === vertical) { + return; + } + // Sort elems in document order: + var elems = firstElem.add(lastElem); + // The first elem is assumed to be before resizeHandle, and the last is after: + firstElem = elems.first(); + lastElem = elems.last(); + + // Init dragging properties: + startPos = e[pageName]; + originalFirstElemSize = firstElem[propName](); + originalLastElemSize = lastElem[propName](); + minPos = startPos - originalFirstElemSize + minSize; + maxPos = startPos + originalLastElemSize - minSize; + + // Setup event handlers: + doc.on("mousemove", moveEventHandler).one("mouseup", function() { + doc.off("mousemove", moveEventHandler); + body.removeClass("unselectable"); + meltdown.editor.focus(); + }); + // Prevent text selection while dragging: + body.addClass("unselectable"); + }); + } + + function debounce(func, wait, returnValue) { + var context, args, timeout, + exec = function() { + func.apply(context, args); + }; + return function() { + context = this; + args = arguments; + clearTimeout(timeout); + timeout = setTimeout(exec, wait); + return returnValue; + }; + } + + // Return true, false or undefined. + // If newState is undefined or not a boolean, return !state (this is the toggle action) + // If newState === state, return newState or if force, return undefined (to tell that no state change is required) + function checkToggleState(newState, state, force) { + if (newState !== true && newState !== false) { + return !state; + } + if (newState === state) { + return force ? newState : undefined; + } + return newState; + } + + function splitSize(availableSize, firstPercentSize, minSize) { + var firstSize = Math.round(firstPercentSize * availableSize), + lastSize = availableSize - firstSize; + if (firstSize < minSize) { + lastSize -= minSize - firstSize; + firstSize = minSize; + } else if (lastSize < minSize) { + firstSize -= minSize - lastSize; + lastSize = minSize; + } + return {firstSize: firstSize, lastSize: lastSize}; + } + + + // Meltdown base class: + var Meltdown = $.meltdown.Meltdown = function(elem) { + this.element = $(elem); + }; + + // The Meltdown methods. + // Methods are publicly available: elem.meltdown("methodName", args...) + $.meltdown.methods = $.extend(Meltdown.prototype, { + _init: function(userOptions) { + var self = this, + _options = this._options = $.extend({}, $.meltdown.defaults, userOptions); + + this._lastUpdateText = ""; + + // If parser is false, use a HTML parser (ie. directly use the text as the HTML source) + this.parser = _options.parser || function(text) { + return text; + }; + + this.editorPreInitOuterWidth = this.element.outerWidth(); + + // Setup everything detached from the document: + this.wrap = $('<div class="' + plgName + '_wrap previewopen" />'); + this.topmargin = $('<div class="' + plgName + '_topmargin"/>').appendTo(this.wrap); + this.bar = $('<div class="meltdown_bar"></div>').appendTo(this.wrap); + this.editorWrap = $('<div class="' + plgName + '_editor-wrap" />').appendTo(this.wrap); + this.editorDeco = $('<div class="' + plgName + '_editor-deco" />').appendTo(this.editorWrap); + this.editor = this.element.addClass("meltdown_editor"); + this.previewWrap = $('<div class="' + plgName + '_preview-wrap" />').appendTo(this.wrap); + this.resizeHandle = $('<div class="' + plgName + '_resizehandle"><span></span></div>').appendTo(this.previewWrap); + this.previewHeader = $('<span class="' + plgName + '_preview-header">Preview Area (<a class="meltdown_techpreview" href="https://github.com/iphands/Meltdown/issues/1">Tech Preview</a>)</span>').appendTo(this.previewWrap); + this.preview = $('<div class="' + plgName + '_preview" />').appendTo(this.previewWrap); + this.bottommargin = $('<div class="' + plgName + '_bottommargin"/>').appendTo(this.wrap); + + // Setup meltdown sizes: + this.wrap.outerWidth(this.editorPreInitOuterWidth); // jQuery 1.8+ (undocumented: http://bugs.jquery.com/ticket/10877) + if (isOldjQuery) this.wrap.width(this.editorPreInitOuterWidth); // Good enough. + var previewHeight = _options.previewHeight; + if (previewHeight === "editorHeight") { + previewHeight = this.editor.height(); + } + this.preview.height(previewHeight); + + // Build toolbar: + this.controls = buildControls(this, _options.controls).appendTo(this.bar); + addWarning(this, this.previewHeader.find(".meltdown_techpreview")); + + // editorDeco's CSS need a bit of help: + this.editor.focus(function() { + self.editorDeco.addClass("focus"); + }).blur(function() { + self.editorDeco.removeClass("focus"); + }); + + // Need to put a div in the wrap to allow absolute positioning for child elements. + // Bug in FF < 31: https://bugzilla.mozilla.org/show_bug.cgi?id=63895 + this.previewWrap2 = $('<div class="' + plgName + '_preview-wrap2"></div>').appendTo(this.previewWrap); + this.previewWrap2.append(this.resizeHandle, this.previewHeader, this.preview); + setupResizeHandle(this.resizeHandle, this.editor, this.preview, true, this); + setupResizeHandle(this.resizeHandle, this.editorWrap, this.previewWrap, false, this); + + // Setup update: + this.debouncedUpdate = debounce(this.update, 350, this); + this.editor.on('keyup', $.proxy(this.debouncedUpdate, this)); + + // Store datas needed by fullscreen mode: + this.fullscreenData = {}; + + // Insert meltdown in the document: + this.editor.after(this.wrap).appendTo(this.editorDeco); + this._checkToolbarOverflowedControls(); + + // Setup display state (preview open and _heightsManaged): + this._previewCollapses = _options.previewCollapses; + this.togglePreview(true, 0, true, !_options.openPreview); // Do not update the preview if !_options.openPreview + if (!this.isPreviewCollapses() && _options.previewHeight === "auto") { + this.preview.height("+=0"); // If !_previewCollapses, we cannot have a dynamic height. + } + this._checkHeightsManaged("", undefined, true); // Set CSS height of wrap. + + // Define the wrap min height from the editor and the preview min heights: + var wrapHeight = this.wrap.height(), + minWrapHeights = parseFloat(this.editor.css("minHeight")) + parseFloat(this.preview.css("minHeight")), + editorHeight = this.editor.height(); + previewHeight = this.preview.height(); + this.wrap.css("minHeight", wrapHeight - editorHeight - previewHeight + minWrapHeights); + + // Setup editor and preview resizing when wrap is resized: + this.lastWrapWidth = this.wrap.width(); + this.lastWrapHeight = wrapHeight; + this.lastEditorPercentWidth = 0.5; + this.lastEditorPercentHeight = editorHeight / (editorHeight + previewHeight); + addResizeListener(this.wrap[0], $.proxy(this._wrapResizeListener, this)); + + // Now that all measures were made, we can close the preview if needed: + if (!_options.openPreview) { + this.togglePreview(false, 0); + } + // And set the sidebyside and fullscreen modes: + this.toggleSidebyside(_options.sidebyside, true); + if (_options.fullscreen) { + this.toggleFullscreen(_options.fullscreen); + } + + return this; // Chaining + }, + options: function(name, value) { + if (arguments.length === 1) { + return this._options[name]; + } else if (arguments.length > 1) { + this._options[name] = value; + return this; // Chaining + } + }, + update: function(force) { + return this.updateWith(this.editor.val(), force); + }, + updateWith: function(text, force) { + if (force === true || (this.isPreviewOpen() && text !== this._lastUpdateText)) { + // If the preview is scrolled to the bottom, keept it scrolled after update: + var previewNode = this.preview[0], + scrolledToBottom = previewNode.scrollHeight - previewNode.scrollTop === previewNode.clientHeight; + this.preview.html(this.parser(text)); + if (scrolledToBottom) { + previewNode.scrollTop = previewNode.scrollHeight; + } + this._lastUpdateText = text; + } + return this; // Chaining + }, + isPreviewOpen: function() { + return this.wrap.hasClass("previewopen"); + }, + togglePreview: function(open, duration, force, noUpdate) { + open = checkToggleState(open, this.isPreviewOpen(), force); + if (open === undefined) { + return this; // Chaining + } + if (duration === undefined) { + duration = this._options.previewDuration; + } + + // Function to resize the editor when the preview is resized: + var self = this, + editorHeight = this.editor.height(), + previewWrapHeightStart = open ? 0 : this.previewWrap.outerHeight(), + availableHeight = editorHeight + previewWrapHeightStart, + progress = this._isHeightsManaged() ? function(/* animation, progress */) { + self.editor.height(availableHeight - self.previewWrap.outerHeight()); + } : $.noop, + editorWrapWidth = this.editorWrap.width(), + previewWrapWidth = open ? 0 : this.previewWrap.width(), + sidebysideStep = function (now /*, fx */) { + self.previewWrap[0].style.maxWidth = now + "px"; + var newEditorWrapWidth = editorWrapWidth + (previewWrapWidth - now); + self.editorWrap.width(newEditorWrapWidth); + self.editorWrap[0].style.maxWidth = newEditorWrapWidth + "px"; + }, + unsetPreviewWrapDisplay = function() { + self.previewWrap.css("display", ""); + }; + + if (open) { + this.wrap.addClass("previewopen"); + if (!noUpdate) { + this.update(); + } + if (this.isSidebyside()) { + this.previewWrap.stop().animate({ + width: "show" + }, { + duration: duration, + step: sidebysideStep, + start: function(fx) { // jQuery 1.8+ + var sizes = splitSize(self.wrap.width(), self.lastEditorPercentWidth, 60); + fx.tweens[0].end = sizes.lastSize; + unsetPreviewWrapDisplay(); // Why jQuery sets this to "block" ? + }, + complete: unsetPreviewWrapDisplay // Why jQuery sets this to "block" ? + }); + } else { + var previewWrapHeightUsed = this.previewWrap.outerHeight(); + // Check that preview is not too big: + if (this._heightsManaged && previewWrapHeightUsed > editorHeight - 15) { + this.preview.height("-=" + (previewWrapHeightUsed - (editorHeight - 15))); + } + if (!isOldjQuery) { + this.previewWrap.stop().slideDown({ + duration: duration, + progress: progress, // jQuery 1.8+ + start: unsetPreviewWrapDisplay, // Why jQuery sets this to "block" ? // jQuery 1.8+ + complete: unsetPreviewWrapDisplay // Why jQuery sets this to "block" ? + }); + } else { + if (this._heightsManaged) { + this.editor.height("-=" + previewWrapHeightUsed); + } + this.previewWrap.stop().show(); + unsetPreviewWrapDisplay(); // Why jQuery sets this to "block" ? + } + } + } else { + if (this.isSidebyside()) { + this.previewWrap.stop().animate({ + width: "hide" + }, { + duration: duration, + step: sidebysideStep, + complete: function() { + self.previewWrap.css("max-width", ""); + } + }); + } else { + if (!isOldjQuery && this.previewWrap.is(":visible") && duration > 0) { // slideUp() doesn't work on hidden elements. + this.previewWrap.stop().slideUp({ + duration: duration, + progress: progress // jQuery 1.8+ + }); + } else { + this.previewWrap.stop().hide(); + if (this._heightsManaged) { + this.editor.height(availableHeight); + } + } + } + this.wrap.removeClass("previewopen"); + } + + return this; // Chaining + }, + isFullscreen: function() { + return this.wrap.hasClass('fullscreen'); + }, + toggleFullscreen: function(full) { + full = checkToggleState(full, this.isFullscreen()); + if (full === undefined) { + return this; // Chaining + } + + var data = this.fullscreenData; + if (full) { + data.originalWrapHeight = this.wrap.height(); + data.availableHeight = this.editor.height() + this.preview.height(); + // Keep height in case it is "auto" or "" or whatever: + data.originalWrapStyleHeight = this.wrap[0].style.height; + this._checkHeightsManaged("fullscreen", true); + + this.wrap.addClass('fullscreen'); + var self = this; + doc.on("keypress." + plgName + ".fullscreenEscKey", function(e) { + if (e.keyCode === 27) { // Esc key + self.toggleFullscreen(false); + } + }); + } else { + doc.off("keypress." + plgName + ".fullscreenEscKey"); + this.wrap.removeClass('fullscreen'); + + if (this._isHeightsManaged()) { + this._adjustHeights(data.originalWrapHeight); + this.lastWrapHeight = data.originalWrapHeight; + } else { + var sizes = splitSize(data.availableHeight, this.lastEditorPercentHeight, 15); + this.editor.height(sizes.firstSize); + this.preview.height(sizes.lastSize); + } + this._checkHeightsManaged("fullscreen", false); + this.wrap[0].style.height = data.originalWrapStyleHeight; + } + this._wrapResizeListener(); + + return this; // Chaining + }, + isSidebyside: function() { + return this.wrap.hasClass('sidebyside'); + }, + toggleSidebyside: function(sidebyside, force) { + sidebyside = checkToggleState(sidebyside, this.isSidebyside(), force); + if (sidebyside === undefined) { + return this; // Chaining + } + + var isPreviewOpen = this.isPreviewOpen(), + originalBottommarginTop = this.bottommargin.offset().top; + if (sidebyside) { + this.wrap.addClass("sidebyside"); + this._adjustWidths(this.wrap.width()); + if (!isPreviewOpen) { + this.togglePreview(true, 0, false, true); + } + var editorBottom = bottomPositionTest.appendTo(this.editorWrap).offset().top, + previewBottom = bottomPositionTest.appendTo(this.previewWrap).offset().top; + bottomPositionTest.detach(); + if (!isPreviewOpen) { + this.togglePreview(false, 0, false, true); + } + var diffHeights = editorBottom - previewBottom; + this.preview.height("+=" + diffHeights); + + var deltaWrapHeight = originalBottommarginTop - this.bottommargin.offset().top; + this.editor.height("+=" + deltaWrapHeight); + this.preview.height("+=" + deltaWrapHeight); + this._checkHeightsManaged("sidebyside", true); + } else { + if (!isPreviewOpen) { + this.togglePreview(true, 0, false, true); + } + var originalWrapHeight = this.wrap.height(); + this.editorWrap.css("width", ""); + this._checkHeightsManaged("sidebyside", false); + this.editorWrap.css({width: "", maxWidth: ""}); + this.previewWrap.css({width: "", maxWidth: ""}); + this.wrap.removeClass("sidebyside"); + + var deltaBottommarginTop = this.bottommargin.offset().top - originalBottommarginTop; + this.lastWrapHeight = originalWrapHeight + deltaBottommarginTop; + this._adjustHeights(originalWrapHeight); + this.lastWrapHeight = originalWrapHeight; + if (!isPreviewOpen) { + this.togglePreview(false, 0, false, true); + } + } + + return this; // Chaining + }, + isPreviewCollapses: function() { + return this._previewCollapses; + }, + togglePreviewCollapses: function(previewCollapses, force) { + previewCollapses = checkToggleState(previewCollapses, this._previewCollapses, force); + if (previewCollapses === undefined) { + return this; // Chaining + } + + this._previewCollapses = previewCollapses; + this._checkHeightsManaged(); + + return this; // Chaining + }, + _isHeightsManaged: function() { + return this._heightsManaged; + }, + _toggleHeightsManaged: function(manage, force) { + manage = checkToggleState(manage, this._heightsManaged, force); + if (manage === undefined) { + return this; // Chaining + } + + if (manage) { + this.wrap.height("+=0").addClass("heightsManaged"); + } else { + this.wrap.height("auto").removeClass("heightsManaged"); + } + this._heightsManaged = manage; + + return this; // Chaining + }, + _checkHeightsManaged: function(change, value, force) { + var previewCollapses = change === "previewCollapses" ? value : this._previewCollapses, + fullscreen = change === "fullscreen" ? value : this.isFullscreen(), + sidebyside = change === "sidebyside" ? value : this.isSidebyside(), + manage = !previewCollapses || fullscreen || sidebyside; + if (force || manage !== this._heightsManaged) { + this._toggleHeightsManaged(manage, force); + } + }, + _wrapResizeListener: function() { + var newWidth = this.wrap.width(), + newHeight = this.wrap.height(); + if (newWidth !== this.lastWrapWidth) { + this._checkToolbarOverflowedControls(); + this._adjustWidths(newWidth); + this.lastWrapWidth = newWidth; + } + if (newHeight !== this.lastWrapHeight) { + if (this._heightsManaged) { + this._adjustHeights(newHeight); + } else { + var editorHeight = this.editor.height(); + this.lastEditorPercentHeight = editorHeight / (editorHeight + this.preview.height()); + } + this.lastWrapHeight = newHeight; + } + }, + // When the wrap height changes, this will resize the editor and the preview, + // keeping the height ratio between them. + _adjustHeights: function(wrapHeight) { + // To avoid document reflow, we only set the values at the end. + var sizes; + if (this.isSidebyside()) { + var deltaHeight = wrapHeight - this.lastWrapHeight; + sizes = { + firstSize: this.editor.height() + deltaHeight, + lastSize: this.preview.height() + deltaHeight + }; + } else { + var isPreviewOpen = this.isPreviewOpen(), + editorHeight = this.editor.height(), + previewHeight = isPreviewOpen ? this.preview.height() : 0, + availableHeight = editorHeight + previewHeight + (wrapHeight - this.lastWrapHeight); + sizes = splitSize(availableHeight, this.lastEditorPercentHeight, 15); + if (!isPreviewOpen) { + // Keep the previewHeight for when the preview will slide down again. + // But allow editorHeight to take the whole available height: + sizes.firstSize = editorHeight + (wrapHeight - this.lastWrapHeight); + } + } + this.editor.height(sizes.firstSize); + this.preview.height(sizes.lastSize); + + return this; // Chaining + }, + _adjustWidths: function(wrapWidth) { + if (this.isSidebyside()) { + var sizes = splitSize(wrapWidth, this.lastEditorPercentWidth, 60); + if (!this.isPreviewOpen()) { + sizes.firstSize += sizes.lastSize; + } + this.editorWrap.width(sizes.firstSize); + this.previewWrap.width(sizes.lastSize); + this.editorWrap[0].style.maxWidth = sizes.firstSize + "px"; + this.previewWrap[0].style.maxWidth = sizes.lastSize + "px"; + } + + return this; // Chaining + }, + // Call this to manage controls that are overflowing the toolbar + // when its width changes: + _checkToolbarOverflowedControls: function() { + var controls = this.controls.children(), + control = $(controls[0]), + defaultTop = control.position().top, + foundOverflowed = false; + + // First we look for overflowed controls: + for (var i = controls.length - 1; i > 1; i--) { + control = $(controls[i]); + if (control.hasClass("overflowedControl")) { + continue; + } + else if (control.position().top <= defaultTop) { + break; + } + control.addClass("overflowedControl"); + foundOverflowed = true; + } + + // If no new overflowed control was found, + // then look for controls that are no more overflowed: + if (!foundOverflowed) { + for (; i < controls.length; i++) { + control = $(controls[i]); + if (!$(controls[i]).hasClass("overflowedControl")) { + continue; + } + // Test if it would overflow: + control.removeClass("overflowedControl"); + if (control.position().top > defaultTop) { + control.addClass("overflowedControl"); + break; + } + } + } + + return this; // Chaining + } + }); + + // THE $(...).meltdown() function: + // Inspired by: http://api.jqueryui.com/jQuery.widget/ + $.fn.meltdown = function (arg) { + // Get method name and method arguments: + var methodName = $.type(arg) === "string" ? arg : "_init", + args = Array.prototype.slice.call(arguments, methodName === "_init" ? 0 : 1); + + // Dispatch method call: + for (var elem, meltdown, returnValue, i = 0; i < this.length; i++) { + elem = this[i]; + // Get the Meltdown object or create it: + meltdown = $.data(elem, "Meltdown"); + if (methodName === "_init") { + if (meltdown) continue; // Don't re-create it. + meltdown = new Meltdown(elem); + $.data(elem, "Meltdown", meltdown); + } + // Call the method: + returnValue = meltdown[methodName].apply(meltdown, args); + // If the method is a getter, return the value + // (See: http://bililite.com/blog/2009/04/23/improving-jquery-ui-widget-getterssetters/) + if (returnValue !== meltdown) { + return returnValue; + } + } + + return this; // Chaining + }; + + + if (isIE8||true) { + // Fixing the textarea deselection on click: + // (http://stackoverflow.com/questions/3558939/javascript-get-selected-text-from-textarea-in-ie8) + var oldBuildControls = buildControls; + buildControls = function() { + var ret = oldBuildControls.apply(this, arguments); + ret.find("span").attr("unselectable", "on"); + return ret; + }; + } + + if (isOldjQuery) { + $.meltdown.controlDefs.sidebyside.styleClass = "disabled"; + $.meltdown.controlDefs.sidebyside.altText = "Disabled: requires jQuery 1.8+"; + Meltdown.prototype.toggleSidebyside = function() { + debug("Requires jQuery 1.8+"); + return this; + }; + } + +}(jQuery, window, document)); diff --git a/public_html/lib/plugins/markdownextra/lib/meltdown/js/lib/element_resize_detection.js b/public_html/lib/plugins/markdownextra/lib/meltdown/js/lib/element_resize_detection.js new file mode 100644 index 00000000..e90664b5 --- /dev/null +++ b/public_html/lib/plugins/markdownextra/lib/meltdown/js/lib/element_resize_detection.js @@ -0,0 +1,81 @@ +/* Source: http://www.backalleycoder.com/2013/03/18/cross-browser-event-based-element-resize-detection/ */ +(function(){ + var attachEvent = document.attachEvent; + + if (!attachEvent) { + var requestFrame = (function(){ + var raf = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || + function(fn){ return window.setTimeout(fn, 20); }; + return function(fn){ return raf(fn); }; + })(); + + var cancelFrame = (function(){ + var cancel = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || + window.clearTimeout; + return function(id){ return cancel(id); }; + })(); + + function resetTriggers(element){ + var triggers = element.__resizeTriggers__, + expand = triggers.firstElementChild, + contract = triggers.lastElementChild, + expandChild = expand.firstElementChild; + contract.scrollLeft = contract.scrollWidth; + contract.scrollTop = contract.scrollHeight; + expandChild.style.width = expand.offsetWidth + 1 + 'px'; + expandChild.style.height = expand.offsetHeight + 1 + 'px'; + expand.scrollLeft = expand.scrollWidth; + expand.scrollTop = expand.scrollHeight; + }; + + function checkTriggers(element){ + return element.offsetWidth != element.__resizeLast__.width || + element.offsetHeight != element.__resizeLast__.height; + } + + function scrollListener(e){ + var element = this; + resetTriggers(this); + if (this.__resizeRAF__) cancelFrame(this.__resizeRAF__); + this.__resizeRAF__ = requestFrame(function(){ + if (checkTriggers(element)) { + element.__resizeLast__.width = element.offsetWidth; + element.__resizeLast__.height = element.offsetHeight; + element.__resizeListeners__.forEach(function(fn){ + fn.call(element, e); + }); + } + }); + }; + } + + window.addResizeListener = function(element, fn){ + if (attachEvent) element.attachEvent('onresize', fn); + else { + if (!element.__resizeTriggers__) { + if (getComputedStyle(element).position == 'static') element.style.position = 'relative'; + element.__resizeLast__ = {}; + element.__resizeListeners__ = []; + (element.__resizeTriggers__ = document.createElement('div')).className = 'resize-triggers'; + element.__resizeTriggers__.innerHTML = '<div class="expand-trigger"><div></div></div>' + + '<div class="contract-trigger"></div>'; + element.appendChild(element.__resizeTriggers__); + resetTriggers(element); + element.addEventListener('scroll', scrollListener, true); + } + element.__resizeListeners__.push(fn); + } + }; + + window.removeResizeListener = function(element, fn){ + if (attachEvent) element.detachEvent('onresize', fn); + else { + element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1); + if (!element.__resizeListeners__.length) { + element.removeEventListener('scroll', scrollListener); + element.__resizeTriggers__ = !element.removeChild(element.__resizeTriggers__); + } + } + } + +})(); \ No newline at end of file diff --git a/public_html/lib/plugins/markdownextra/lib/meltdown/js/lib/js-markdown-extra.js b/public_html/lib/plugins/markdownextra/lib/meltdown/js/lib/js-markdown-extra.js old mode 100755 new mode 100644 --