diff --git a/chrome_point_plus/css/markitup/sets/markdown/style.css b/chrome_point_plus/css/markitup/sets/markdown/style.css new file mode 100644 index 0000000..251af13 --- /dev/null +++ b/chrome_point_plus/css/markitup/sets/markdown/style.css @@ -0,0 +1,54 @@ +/* ------------------------------------------------------------------- +// markItUp! +// By Jay Salvat - http://markitup.jaysalvat.com/ +// ------------------------------------------------------------------*/ +.markItUp .markItUpButton1 a { + background-image:url(chrome-extension://__MSG_@@extension_id__/images/markitup/sets/markdown/h1.png); +} +.markItUp .markItUpButton2 a { + background-image:url(chrome-extension://__MSG_@@extension_id__/images/markitup/sets/markdown/h2.png); +} +.markItUp .markItUpButton3 a { + background-image:url(chrome-extension://__MSG_@@extension_id__/images/markitup/sets/markdown/h3.png); +} +.markItUp .markItUpButton4 a { + background-image:url(chrome-extension://__MSG_@@extension_id__/images/markitup/sets/markdown/h4.png); +} +.markItUp .markItUpButton5 a { + background-image:url(chrome-extension://__MSG_@@extension_id__/images/markitup/sets/markdown/h5.png); +} +.markItUp .markItUpButton6 a { + background-image:url(chrome-extension://__MSG_@@extension_id__/images/markitup/sets/markdown/h6.png); +} + +.markItUp .markItUpButton7 a { + background-image:url(chrome-extension://__MSG_@@extension_id__/images/markitup/sets/markdown/bold.png); +} +.markItUp .markItUpButton8 a { + background-image:url(chrome-extension://__MSG_@@extension_id__/images/markitup/sets/markdown/italic.png); +} + +.markItUp .markItUpButton9 a { + background-image:url(chrome-extension://__MSG_@@extension_id__/images/markitup/sets/markdown/list-bullet.png); +} +.markItUp .markItUpButton10 a { + background-image:url(chrome-extension://__MSG_@@extension_id__/images/markitup/sets/markdown/list-numeric.png); +} + +.markItUp .markItUpButton11 a { + background-image:url(chrome-extension://__MSG_@@extension_id__/images/markitup/sets/markdown/picture.png); +} +.markItUp .markItUpButton12 a { + background-image:url(chrome-extension://__MSG_@@extension_id__/images/markitup/sets/markdown/link.png); +} + +.markItUp .markItUpButton13 a { + background-image:url(chrome-extension://__MSG_@@extension_id__/images/markitup/sets/markdown/quotes.png); +} +.markItUp .markItUpButton14 a { + background-image:url(chrome-extension://__MSG_@@extension_id__/images/markitup/sets/markdown/code.png); +} + +.markItUp .preview a { + background-image:url(chrome-extension://__MSG_@@extension_id__/images/markitup/sets/markdown/preview.png); +} \ No newline at end of file diff --git a/chrome_point_plus/css/markitup/skins/markitup/style.css b/chrome_point_plus/css/markitup/skins/markitup/style.css new file mode 100644 index 0000000..fd86683 --- /dev/null +++ b/chrome_point_plus/css/markitup/skins/markitup/style.css @@ -0,0 +1,147 @@ +/* ------------------------------------------------------------------- +// markItUp! Universal MarkUp Engine, JQuery plugin +// By Jay Salvat - http://markitup.jaysalvat.com/ +// ------------------------------------------------------------------*/ +.markItUp * { + margin:0px; padding:0px; + outline:none; +} +.markItUp a:link, +.markItUp a:visited { + color:#000; + text-decoration:none; +} +.markItUp { + width:700px; + margin:5px 0 5px 0; + border:5px solid #F5F5F5; +} +.markItUpContainer { + border:1px solid #3C769D; + background:#FFF url(chrome-extension://__MSG_@@extension_id__/images/markitup/skins/markitup/bg-container.png) repeat-x top left; + padding:5px 5px 2px 5px; + font:11px Verdana, Arial, Helvetica, sans-serif; +} +.markItUpEditor { + font:12px 'Courier New', Courier, monospace; + padding:5px 5px 5px 5px/*35px*/; + border:3px solid #3C769D; + width:643px; + height:320px; + /*background:#FFF url(chrome-extension://__MSG_@@extension_id__/images/markitup/skins/markitup/bg-editor.png) no-repeat;*/ + clear:both; + line-height:18px; + overflow:auto; +} +.markItUpPreviewFrame { + overflow:auto; + background-color:#FFFFFF; + border:1px solid #3C769D; + width:99.9%; + height:300px; + margin:5px 0; +} +.markItUpFooter { + width:100%; + cursor:n-resize; +} +.markItUpResizeHandle { + overflow:hidden; + width:22px; height:5px; + margin-left:auto; + margin-right:auto; + background-image:url(chrome-extension://__MSG_@@extension_id__/images/markitup/skins/markitup/handle.png); + cursor:n-resize; +} +/***************************************************************************************/ +/* first row of buttons */ +.markItUpHeader ul li { + list-style:none; + float:left; + position:relative; +} +.markItUpHeader ul li ul{ + display:none; +} +.markItUpHeader ul li:hover > ul{ + display:block; +} +.markItUpHeader ul .markItUpDropMenu { + background:transparent url(chrome-extension://__MSG_@@extension_id__/images/markitup/skins/markitup/menu.png) no-repeat 115% 50%; + margin-right:5px; +} +.markItUpHeader ul .markItUpDropMenu li { + margin-right:0px; +} +.markItUpHeader ul .markItUpSeparator { + margin:0 10px; + width:1px; + height:16px; + overflow:hidden; + background-color:#CCC; +} +.markItUpHeader ul ul .markItUpSeparator { + width:auto; height:1px; + margin:0px; +} +/* next rows of buttons */ +.markItUpHeader ul ul { + display:none; + position:absolute; + top:18px; left:0px; + background:#F5F5F5; + border:1px solid #3C769D; + height:inherit; +} +.markItUpHeader ul ul li { + float:none; + border-bottom:1px solid #3C769D; +} +.markItUpHeader ul ul .markItUpDropMenu { + background:#F5F5F5 url(chrome-extension://__MSG_@@extension_id__/images/markitup/skins/markitup/submenu.png) no-repeat 100% 50%; +} +/* next rows of buttons */ +.markItUpHeader ul ul ul { + position:absolute; + top:-1px; left:150px; +} +.markItUpHeader ul ul ul li { + float:none; +} +.markItUpHeader ul a { + display:block; + width:16px; height:16px; + text-indent:-10000px; + background-repeat:no-repeat; + padding:3px; + margin:0px; +} +.markItUpHeader ul ul a { + display:block; + padding-left:0px; + text-indent:0; + width:120px; + padding:5px 5px 5px 25px; + background-position:2px 50%; +} +.markItUpHeader ul ul a:hover { + color:#FFF; + background-color:#3C769D; +} +/***************************************************************************************/ +.html .markItUpEditor { + background-image:url(chrome-extension://__MSG_@@extension_id__/images/markitup/skins/markitup/bg-editor-html.png); +} +.markdown .markItUpEditor { + background-image:url(chrome-extension://__MSG_@@extension_id__/images/markitup/skins/markitup/bg-editor-markdown.png); +} +.textile .markItUpEditor { + background-image:url(chrome-extension://__MSG_@@extension_id__/images/markitup/skins/markitup/bg-editor-textile.png); +} +.bbcode .markItUpEditor { + background-image:url(chrome-extension://__MSG_@@extension_id__/images/markitup/skins/markitup/bg-editor-bbcode.png); +} +.wiki .markItUpEditor, +.dotclear .markItUpEditor { + background-image:url(chrome-extension://__MSG_@@extension_id__/images/markitup/skins/markitup/bg-editor-wiki.png); +} \ No newline at end of file diff --git a/chrome_point_plus/css/point-plus.css b/chrome_point_plus/css/point-plus.css new file mode 100644 index 0000000..93a3bc6 --- /dev/null +++ b/chrome_point_plus/css/point-plus.css @@ -0,0 +1,9 @@ +/* MarkItUp margin fix */ +div#markItUpText-input { + margin-top: 30px; +} + +/* MarkItUp override */ +.markItUp { + width:770px; +} \ No newline at end of file diff --git a/chrome_point_plus/images/markitup/sets/markdown/bold.png b/chrome_point_plus/images/markitup/sets/markdown/bold.png new file mode 100644 index 0000000..889ae80 Binary files /dev/null and b/chrome_point_plus/images/markitup/sets/markdown/bold.png differ diff --git a/chrome_point_plus/images/markitup/sets/markdown/code.png b/chrome_point_plus/images/markitup/sets/markdown/code.png new file mode 100644 index 0000000..63fe6ce Binary files /dev/null and b/chrome_point_plus/images/markitup/sets/markdown/code.png differ diff --git a/chrome_point_plus/images/markitup/sets/markdown/h1.png b/chrome_point_plus/images/markitup/sets/markdown/h1.png new file mode 100644 index 0000000..9c122e9 Binary files /dev/null and b/chrome_point_plus/images/markitup/sets/markdown/h1.png differ diff --git a/chrome_point_plus/images/markitup/sets/markdown/h2.png b/chrome_point_plus/images/markitup/sets/markdown/h2.png new file mode 100644 index 0000000..fbd8765 Binary files /dev/null and b/chrome_point_plus/images/markitup/sets/markdown/h2.png differ diff --git a/chrome_point_plus/images/markitup/sets/markdown/h3.png b/chrome_point_plus/images/markitup/sets/markdown/h3.png new file mode 100644 index 0000000..c7836cf Binary files /dev/null and b/chrome_point_plus/images/markitup/sets/markdown/h3.png differ diff --git a/chrome_point_plus/images/markitup/sets/markdown/h4.png b/chrome_point_plus/images/markitup/sets/markdown/h4.png new file mode 100644 index 0000000..4e929ea Binary files /dev/null and b/chrome_point_plus/images/markitup/sets/markdown/h4.png differ diff --git a/chrome_point_plus/images/markitup/sets/markdown/h5.png b/chrome_point_plus/images/markitup/sets/markdown/h5.png new file mode 100644 index 0000000..30cabeb Binary files /dev/null and b/chrome_point_plus/images/markitup/sets/markdown/h5.png differ diff --git a/chrome_point_plus/images/markitup/sets/markdown/h6.png b/chrome_point_plus/images/markitup/sets/markdown/h6.png new file mode 100644 index 0000000..058170a Binary files /dev/null and b/chrome_point_plus/images/markitup/sets/markdown/h6.png differ diff --git a/chrome_point_plus/images/markitup/sets/markdown/italic.png b/chrome_point_plus/images/markitup/sets/markdown/italic.png new file mode 100644 index 0000000..8482ac8 Binary files /dev/null and b/chrome_point_plus/images/markitup/sets/markdown/italic.png differ diff --git a/chrome_point_plus/images/markitup/sets/markdown/link.png b/chrome_point_plus/images/markitup/sets/markdown/link.png new file mode 100644 index 0000000..25eacb7 Binary files /dev/null and b/chrome_point_plus/images/markitup/sets/markdown/link.png differ diff --git a/chrome_point_plus/images/markitup/sets/markdown/list-bullet.png b/chrome_point_plus/images/markitup/sets/markdown/list-bullet.png new file mode 100644 index 0000000..4a8672b Binary files /dev/null and b/chrome_point_plus/images/markitup/sets/markdown/list-bullet.png differ diff --git a/chrome_point_plus/images/markitup/sets/markdown/list-numeric.png b/chrome_point_plus/images/markitup/sets/markdown/list-numeric.png new file mode 100644 index 0000000..33b0b8d Binary files /dev/null and b/chrome_point_plus/images/markitup/sets/markdown/list-numeric.png differ diff --git a/chrome_point_plus/images/markitup/sets/markdown/picture.png b/chrome_point_plus/images/markitup/sets/markdown/picture.png new file mode 100644 index 0000000..4a158fe Binary files /dev/null and b/chrome_point_plus/images/markitup/sets/markdown/picture.png differ diff --git a/chrome_point_plus/images/markitup/sets/markdown/preview.png b/chrome_point_plus/images/markitup/sets/markdown/preview.png new file mode 100644 index 0000000..a9925a0 Binary files /dev/null and b/chrome_point_plus/images/markitup/sets/markdown/preview.png differ diff --git a/chrome_point_plus/images/markitup/sets/markdown/quotes.png b/chrome_point_plus/images/markitup/sets/markdown/quotes.png new file mode 100644 index 0000000..e54ebeb Binary files /dev/null and b/chrome_point_plus/images/markitup/sets/markdown/quotes.png differ diff --git a/chrome_point_plus/images/markitup/skins/markitup/bg-container.png b/chrome_point_plus/images/markitup/skins/markitup/bg-container.png new file mode 100644 index 0000000..ec38b8e Binary files /dev/null and b/chrome_point_plus/images/markitup/skins/markitup/bg-container.png differ diff --git a/chrome_point_plus/images/markitup/skins/markitup/bg-editor-bbcode.png b/chrome_point_plus/images/markitup/skins/markitup/bg-editor-bbcode.png new file mode 100644 index 0000000..39cdbd8 Binary files /dev/null and b/chrome_point_plus/images/markitup/skins/markitup/bg-editor-bbcode.png differ diff --git a/chrome_point_plus/images/markitup/skins/markitup/bg-editor-dotclear.png b/chrome_point_plus/images/markitup/skins/markitup/bg-editor-dotclear.png new file mode 100644 index 0000000..b3188dc Binary files /dev/null and b/chrome_point_plus/images/markitup/skins/markitup/bg-editor-dotclear.png differ diff --git a/chrome_point_plus/images/markitup/skins/markitup/bg-editor-html.png b/chrome_point_plus/images/markitup/skins/markitup/bg-editor-html.png new file mode 100644 index 0000000..11bff45 Binary files /dev/null and b/chrome_point_plus/images/markitup/skins/markitup/bg-editor-html.png differ diff --git a/chrome_point_plus/images/markitup/skins/markitup/bg-editor-json.png b/chrome_point_plus/images/markitup/skins/markitup/bg-editor-json.png new file mode 100644 index 0000000..e898c1d Binary files /dev/null and b/chrome_point_plus/images/markitup/skins/markitup/bg-editor-json.png differ diff --git a/chrome_point_plus/images/markitup/skins/markitup/bg-editor-markdown.png b/chrome_point_plus/images/markitup/skins/markitup/bg-editor-markdown.png new file mode 100644 index 0000000..c199715 Binary files /dev/null and b/chrome_point_plus/images/markitup/skins/markitup/bg-editor-markdown.png differ diff --git a/chrome_point_plus/images/markitup/skins/markitup/bg-editor-textile.png b/chrome_point_plus/images/markitup/skins/markitup/bg-editor-textile.png new file mode 100644 index 0000000..3ab1e9f Binary files /dev/null and b/chrome_point_plus/images/markitup/skins/markitup/bg-editor-textile.png differ diff --git a/chrome_point_plus/images/markitup/skins/markitup/bg-editor-wiki.png b/chrome_point_plus/images/markitup/skins/markitup/bg-editor-wiki.png new file mode 100644 index 0000000..7887181 Binary files /dev/null and b/chrome_point_plus/images/markitup/skins/markitup/bg-editor-wiki.png differ diff --git a/chrome_point_plus/images/markitup/skins/markitup/bg-editor-xml.png b/chrome_point_plus/images/markitup/skins/markitup/bg-editor-xml.png new file mode 100644 index 0000000..33b1c5d Binary files /dev/null and b/chrome_point_plus/images/markitup/skins/markitup/bg-editor-xml.png differ diff --git a/chrome_point_plus/images/markitup/skins/markitup/bg-editor.png b/chrome_point_plus/images/markitup/skins/markitup/bg-editor.png new file mode 100644 index 0000000..ab7cde4 Binary files /dev/null and b/chrome_point_plus/images/markitup/skins/markitup/bg-editor.png differ diff --git a/chrome_point_plus/images/markitup/skins/markitup/handle.png b/chrome_point_plus/images/markitup/skins/markitup/handle.png new file mode 100644 index 0000000..3993b20 Binary files /dev/null and b/chrome_point_plus/images/markitup/skins/markitup/handle.png differ diff --git a/chrome_point_plus/images/markitup/skins/markitup/menu.png b/chrome_point_plus/images/markitup/skins/markitup/menu.png new file mode 100644 index 0000000..de337c8 Binary files /dev/null and b/chrome_point_plus/images/markitup/skins/markitup/menu.png differ diff --git a/chrome_point_plus/images/markitup/skins/markitup/submenu.png b/chrome_point_plus/images/markitup/skins/markitup/submenu.png new file mode 100644 index 0000000..03d1977 Binary files /dev/null and b/chrome_point_plus/images/markitup/skins/markitup/submenu.png differ diff --git a/chrome_point_plus/includes/preview.html b/chrome_point_plus/includes/preview.html new file mode 100644 index 0000000..685b81e --- /dev/null +++ b/chrome_point_plus/includes/preview.html @@ -0,0 +1,16 @@ + + + + +markItUp! preview template + + + + + + diff --git a/chrome_point_plus/js/markitup/jquery.markitup.js b/chrome_point_plus/js/markitup/jquery.markitup.js new file mode 100644 index 0000000..9505faa --- /dev/null +++ b/chrome_point_plus/js/markitup/jquery.markitup.js @@ -0,0 +1,665 @@ +// ---------------------------------------------------------------------------- +// markItUp! Universal MarkUp Engine, JQuery plugin +// v 1.1.x +// Dual licensed under the MIT and GPL licenses. +// ---------------------------------------------------------------------------- +// Copyright (C) 2007-2012 Jay Salvat +// http://markitup.jaysalvat.com/ +// ---------------------------------------------------------------------------- +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// ---------------------------------------------------------------------------- +(function($) { + $.fn.markItUp = function(settings, extraSettings) { + var method, params, options, ctrlKey, shiftKey, altKey; ctrlKey = shiftKey = altKey = false; + + if (typeof settings == 'string') { + method = settings; + params = extraSettings; + } + + options = { id: '', + nameSpace: '', + root: '', + previewHandler: false, + previewInWindow: '', // 'width=800, height=600, resizable=yes, scrollbars=yes' + previewInElement: '', + previewAutoRefresh: true, + previewPosition: 'after', + previewTemplatePath: chrome.extension.getURL('/includes/preview.html'), + previewParser: false, + previewParserPath: '', + previewParserVar: 'data', + resizeHandle: true, + beforeInsert: '', + afterInsert: '', + onEnter: {}, + onShiftEnter: {}, + onCtrlEnter: {}, + onTab: {}, + markupSet: [ { /* set */ } ] + }; + $.extend(options, settings, extraSettings); + + // compute markItUp! path + if (!options.root) { + $('script').each(function(a, tag) { + miuScript = $(tag).get(0).src.match(/(.*)jquery\.markitup(\.pack)?\.js$/); + if (miuScript !== null) { + options.root = miuScript[1]; + } + }); + } + + // Quick patch to keep compatibility with jQuery 1.9 + var uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + var matched = uaMatch( navigator.userAgent ); + var browser = {}; + + if (matched.browser) { + browser[matched.browser] = true; + browser.version = matched.version; + } + if (browser.chrome) { + browser.webkit = true; + } else if (browser.webkit) { + browser.safari = true; + } + + return this.each(function() { + var $$, textarea, levels, scrollPosition, caretPosition, caretOffset, + clicked, hash, header, footer, previewWindow, template, iFrame, abort; + $$ = $(this); + textarea = this; + levels = []; + abort = false; + scrollPosition = caretPosition = 0; + caretOffset = -1; + + options.previewParserPath = localize(options.previewParserPath); + options.previewTemplatePath = localize(options.previewTemplatePath); + + if (method) { + switch(method) { + case 'remove': + remove(); + break; + case 'insert': + markup(params); + break; + default: + $.error('Method ' + method + ' does not exist on jQuery.markItUp'); + } + return; + } + + // apply the computed path to ~/ + function localize(data, inText) { + if (inText) { + return data.replace(/("|')~\//g, "$1"+options.root); + } + return data.replace(/^~\//, options.root); + } + + // init and build editor + function init() { + id = ''; nameSpace = ''; + if (options.id) { + id = 'id="'+options.id+'"'; + } else if ($$.attr("id")) { + id = 'id="markItUp'+($$.attr("id").substr(0, 1).toUpperCase())+($$.attr("id").substr(1))+'"'; + + } + if (options.nameSpace) { + nameSpace = 'class="'+options.nameSpace+'"'; + } + $$.wrap('
'); + $$.wrap('
'); + $$.wrap('
'); + $$.addClass("markItUpEditor"); + + // add the header before the textarea + header = $('
').insertBefore($$); + $(dropMenus(options.markupSet)).appendTo(header); + + // add the footer after the textarea + footer = $('
').insertAfter($$); + + // add the resize handle after textarea + if (options.resizeHandle === true && browser.safari !== true) { + resizeHandle = $('
') + .insertAfter($$) + .bind("mousedown.markItUp", function(e) { + var h = $$.height(), y = e.clientY, mouseMove, mouseUp; + mouseMove = function(e) { + $$.css("height", Math.max(20, e.clientY+h-y)+"px"); + return false; + }; + mouseUp = function(e) { + $("html").unbind("mousemove.markItUp", mouseMove).unbind("mouseup.markItUp", mouseUp); + return false; + }; + $("html").bind("mousemove.markItUp", mouseMove).bind("mouseup.markItUp", mouseUp); + }); + footer.append(resizeHandle); + } + + // listen key events + $$.bind('keydown.markItUp', keyPressed).bind('keyup', keyPressed); + + // bind an event to catch external calls + $$.bind("insertion.markItUp", function(e, settings) { + if (settings.target !== false) { + get(); + } + if (textarea === $.markItUp.focused) { + markup(settings); + } + }); + + // remember the last focus + $$.bind('focus.markItUp', function() { + $.markItUp.focused = this; + }); + + if (options.previewInElement) { + refreshPreview(); + } + } + + // recursively build header with dropMenus from markupset + function dropMenus(markupSet) { + var ul = $(''), i = 0; + $('li:hover > ul', ul).css('display', 'block'); + $.each(markupSet, function() { + var button = this, t = '', title, li, j; + title = (button.key) ? (button.name||'')+' [Ctrl+'+button.key+']' : (button.name||''); + key = (button.key) ? 'accesskey="'+button.key+'"' : ''; + if (button.separator) { + li = $('
  • '+(button.separator||'')+'
  • ').appendTo(ul); + } else { + i++; + for (j = levels.length -1; j >= 0; j--) { + t += levels[j]+"-"; + } + li = $('
  • '+(button.name||'')+'
  • ') + .bind("contextmenu.markItUp", function() { // prevent contextmenu on mac and allow ctrl+click + return false; + }).bind('click.markItUp', function(e) { + e.preventDefault(); + }).bind("focusin.markItUp", function(){ + $$.focus(); + }).bind('mouseup', function() { + if (button.call) { + eval(button.call)(); + } + setTimeout(function() { markup(button) },1); + return false; + }).bind('mouseenter.markItUp', function() { + $('> ul', this).show(); + $(document).one('click', function() { // close dropmenu if click outside + $('ul ul', header).hide(); + } + ); + }).bind('mouseleave.markItUp', function() { + $('> ul', this).hide(); + }).appendTo(ul); + if (button.dropMenu) { + levels.push(i); + $(li).addClass('markItUpDropMenu').append(dropMenus(button.dropMenu)); + } + } + }); + levels.pop(); + return ul; + } + + // markItUp! markups + function magicMarkups(string) { + if (string) { + string = string.toString(); + string = string.replace(/\(\!\(([\s\S]*?)\)\!\)/g, + function(x, a) { + var b = a.split('|!|'); + if (altKey === true) { + return (b[1] !== undefined) ? b[1] : b[0]; + } else { + return (b[1] === undefined) ? "" : b[0]; + } + } + ); + // [![prompt]!], [![prompt:!:value]!] + string = string.replace(/\[\!\[([\s\S]*?)\]\!\]/g, + function(x, a) { + var b = a.split(':!:'); + if (abort === true) { + return false; + } + value = prompt(b[0], (b[1]) ? b[1] : ''); + if (value === null) { + abort = true; + } + return value; + } + ); + return string; + } + return ""; + } + + // prepare action + function prepare(action) { + if ($.isFunction(action)) { + action = action(hash); + } + return magicMarkups(action); + } + + // build block to insert + function build(string) { + var openWith = prepare(clicked.openWith); + var placeHolder = prepare(clicked.placeHolder); + var replaceWith = prepare(clicked.replaceWith); + var closeWith = prepare(clicked.closeWith); + var openBlockWith = prepare(clicked.openBlockWith); + var closeBlockWith = prepare(clicked.closeBlockWith); + var multiline = clicked.multiline; + + if (replaceWith !== "") { + block = openWith + replaceWith + closeWith; + } else if (selection === '' && placeHolder !== '') { + block = openWith + placeHolder + closeWith; + } else { + string = string || selection; + + var lines = [string], blocks = []; + + if (multiline === true) { + lines = string.split(/\r?\n/); + } + + for (var l = 0; l < lines.length; l++) { + line = lines[l]; + var trailingSpaces; + if (trailingSpaces = line.match(/ *$/)) { + blocks.push(openWith + line.replace(/ *$/g, '') + closeWith + trailingSpaces); + } else { + blocks.push(openWith + line + closeWith); + } + } + + block = blocks.join("\n"); + } + + block = openBlockWith + block + closeBlockWith; + + return { block:block, + openBlockWith:openBlockWith, + openWith:openWith, + replaceWith:replaceWith, + placeHolder:placeHolder, + closeWith:closeWith, + closeBlockWith:closeBlockWith + }; + } + + // define markup to insert + function markup(button) { + var len, j, n, i; + hash = clicked = button; + get(); + $.extend(hash, { line:"", + root:options.root, + textarea:textarea, + selection:(selection||''), + caretPosition:caretPosition, + ctrlKey:ctrlKey, + shiftKey:shiftKey, + altKey:altKey + } + ); + // callbacks before insertion + prepare(options.beforeInsert); + prepare(clicked.beforeInsert); + if ((ctrlKey === true && shiftKey === true) || button.multiline === true) { + prepare(clicked.beforeMultiInsert); + } + $.extend(hash, { line:1 }); + + if ((ctrlKey === true && shiftKey === true)) { + lines = selection.split(/\r?\n/); + for (j = 0, n = lines.length, i = 0; i < n; i++) { + if ($.trim(lines[i]) !== '') { + $.extend(hash, { line:++j, selection:lines[i] } ); + lines[i] = build(lines[i]).block; + } else { + lines[i] = ""; + } + } + + string = { block:lines.join('\n')}; + start = caretPosition; + len = string.block.length + ((browser.opera) ? n-1 : 0); + } else if (ctrlKey === true) { + string = build(selection); + start = caretPosition + string.openWith.length; + len = string.block.length - string.openWith.length - string.closeWith.length; + len = len - (string.block.match(/ $/) ? 1 : 0); + len -= fixIeBug(string.block); + } else if (shiftKey === true) { + string = build(selection); + start = caretPosition; + len = string.block.length; + len -= fixIeBug(string.block); + } else { + string = build(selection); + start = caretPosition + string.block.length ; + len = 0; + start -= fixIeBug(string.block); + } + if ((selection === '' && string.replaceWith === '')) { + caretOffset += fixOperaBug(string.block); + + start = caretPosition + string.openBlockWith.length + string.openWith.length; + len = string.block.length - string.openBlockWith.length - string.openWith.length - string.closeWith.length - string.closeBlockWith.length; + + caretOffset = $$.val().substring(caretPosition, $$.val().length).length; + caretOffset -= fixOperaBug($$.val().substring(0, caretPosition)); + } + $.extend(hash, { caretPosition:caretPosition, scrollPosition:scrollPosition } ); + + if (string.block !== selection && abort === false) { + insert(string.block); + set(start, len); + } else { + caretOffset = -1; + } + get(); + + $.extend(hash, { line:'', selection:selection }); + + // callbacks after insertion + if ((ctrlKey === true && shiftKey === true) || button.multiline === true) { + prepare(clicked.afterMultiInsert); + } + prepare(clicked.afterInsert); + prepare(options.afterInsert); + + // refresh preview if opened + if (previewWindow && options.previewAutoRefresh) { + refreshPreview(); + } + + // reinit keyevent + shiftKey = altKey = ctrlKey = abort = false; + } + + // Substract linefeed in Opera + function fixOperaBug(string) { + if (browser.opera) { + return string.length - string.replace(/\n*/g, '').length; + } + return 0; + } + // Substract linefeed in IE + function fixIeBug(string) { + if (browser.msie) { + return string.length - string.replace(/\r*/g, '').length; + } + return 0; + } + + // add markup + function insert(block) { + if (document.selection) { + var newSelection = document.selection.createRange(); + newSelection.text = block; + } else { + textarea.value = textarea.value.substring(0, caretPosition) + block + textarea.value.substring(caretPosition + selection.length, textarea.value.length); + } + } + + // set a selection + function set(start, len) { + if (textarea.createTextRange){ + // quick fix to make it work on Opera 9.5 + if (browser.opera && browser.version >= 9.5 && len == 0) { + return false; + } + range = textarea.createTextRange(); + range.collapse(true); + range.moveStart('character', start); + range.moveEnd('character', len); + range.select(); + } else if (textarea.setSelectionRange ){ + textarea.setSelectionRange(start, start + len); + } + textarea.scrollTop = scrollPosition; + textarea.focus(); + } + + // get the selection + function get() { + textarea.focus(); + + scrollPosition = textarea.scrollTop; + if (document.selection) { + selection = document.selection.createRange().text; + if (browser.msie) { // ie + var range = document.selection.createRange(), rangeCopy = range.duplicate(); + rangeCopy.moveToElementText(textarea); + caretPosition = -1; + while(rangeCopy.inRange(range)) { + rangeCopy.moveStart('character'); + caretPosition ++; + } + } else { // opera + caretPosition = textarea.selectionStart; + } + } else { // gecko & webkit + caretPosition = textarea.selectionStart; + + selection = textarea.value.substring(caretPosition, textarea.selectionEnd); + } + return selection; + } + + // open preview window + function preview() { + if (typeof options.previewHandler === 'function') { + previewWindow = true; + } else if (options.previewInElement) { + previewWindow = $(options.previewInElement); + } else if (!previewWindow || previewWindow.closed) { + if (options.previewInWindow) { + previewWindow = window.open('', 'preview', options.previewInWindow); + $(window).unload(function() { + previewWindow.close(); + }); + } else { + iFrame = $(''); + if (options.previewPosition == 'after') { + iFrame.insertAfter(footer); + } else { + iFrame.insertBefore(header); + } + previewWindow = iFrame[iFrame.length - 1].contentWindow || frame[iFrame.length - 1]; + } + } else if (altKey === true) { + if (iFrame) { + iFrame.remove(); + } else { + previewWindow.close(); + } + previewWindow = iFrame = false; + } + if (!options.previewAutoRefresh) { + refreshPreview(); + } + if (options.previewInWindow) { + previewWindow.focus(); + } + } + + // refresh Preview window + function refreshPreview() { + renderPreview(); + } + + function renderPreview() { + var phtml; + if (options.previewHandler && typeof options.previewHandler === 'function') { + options.previewHandler( $$.val() ); + } else if (options.previewParser && typeof options.previewParser === 'function') { + var data = options.previewParser( $$.val() ); + writeInPreview(localize(data, 1) ); + } else if (options.previewParserPath !== '') { + $.ajax({ + type: 'POST', + dataType: 'text', + global: false, + url: options.previewParserPath, + data: options.previewParserVar+'='+encodeURIComponent($$.val()), + success: function(data) { + writeInPreview( localize(data, 1) ); + } + }); + } else { + if (!template) { + $.ajax({ + url: options.previewTemplatePath, + dataType: 'text', + global: false, + success: function(data) { + writeInPreview( localize(data, 1).replace(//g, $$.val()) ); + } + }); + } + } + return false; + } + + function writeInPreview(data) { + if (options.previewInElement) { + $(options.previewInElement).html(data); + } else if (previewWindow && previewWindow.document) { + try { + sp = previewWindow.document.documentElement.scrollTop + } catch(e) { + sp = 0; + } + previewWindow.document.open(); + previewWindow.document.write(data); + previewWindow.document.close(); + previewWindow.document.documentElement.scrollTop = sp; + } + } + + // set keys pressed + function keyPressed(e) { + shiftKey = e.shiftKey; + altKey = e.altKey; + ctrlKey = (!(e.altKey && e.ctrlKey)) ? (e.ctrlKey || e.metaKey) : false; + + if (e.type === 'keydown') { + if (ctrlKey === true) { + li = $('a[accesskey="'+((e.keyCode == 13) ? '\\n' : String.fromCharCode(e.keyCode))+'"]', header).parent('li'); + if (li.length !== 0) { + ctrlKey = false; + setTimeout(function() { + li.triggerHandler('mouseup'); + },1); + return false; + } + } + if (e.keyCode === 13 || e.keyCode === 10) { // Enter key + if (ctrlKey === true) { // Enter + Ctrl + ctrlKey = false; + markup(options.onCtrlEnter); + return options.onCtrlEnter.keepDefault; + } else if (shiftKey === true) { // Enter + Shift + shiftKey = false; + markup(options.onShiftEnter); + return options.onShiftEnter.keepDefault; + } else { // only Enter + markup(options.onEnter); + return options.onEnter.keepDefault; + } + } + if (e.keyCode === 9) { // Tab key + if (shiftKey == true || ctrlKey == true || altKey == true) { + return false; + } + if (caretOffset !== -1) { + get(); + caretOffset = $$.val().length - caretOffset; + set(caretOffset, 0); + caretOffset = -1; + return false; + } else { + markup(options.onTab); + return options.onTab.keepDefault; + } + } + } + } + + function remove() { + $$.unbind(".markItUp").removeClass('markItUpEditor'); + $$.parent('div').parent('div.markItUp').parent('div').replaceWith($$); + $$.data('markItUp', null); + } + + init(); + }); + }; + + $.fn.markItUpRemove = function() { + return this.each(function() { + $(this).markItUp('remove'); + } + ); + }; + + $.markItUp = function(settings) { + var options = { target:false }; + $.extend(options, settings); + if (options.target) { + return $(options.target).each(function() { + $(this).focus(); + $(this).trigger('insertion', [options]); + }); + } else { + $('textarea').trigger('insertion', [options]); + } + }; +})(jQuery); diff --git a/chrome_point_plus/js/markitup/sets/markdown/set.js b/chrome_point_plus/js/markitup/sets/markdown/set.js new file mode 100644 index 0000000..96970a4 --- /dev/null +++ b/chrome_point_plus/js/markitup/sets/markdown/set.js @@ -0,0 +1,52 @@ +// ------------------------------------------------------------------- +// markItUp! +// ------------------------------------------------------------------- +// Copyright (C) 2008 Jay Salvat +// http://markitup.jaysalvat.com/ +// ------------------------------------------------------------------- +// MarkDown tags example +// http://en.wikipedia.org/wiki/Markdown +// http://daringfireball.net/projects/markdown/ +// ------------------------------------------------------------------- +// Feel free to add more tags +// ------------------------------------------------------------------- +mySettings = { + previewParserPath: '', + onShiftEnter: {keepDefault:false, openWith:'\n\n'}, + markupSet: [ + {name:'First Level Heading', key:'1', placeHolder:'Your title here...', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '=') } }, + {name:'Second Level Heading', key:'2', placeHolder:'Your title here...', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '-') } }, + {name:'Heading 3', key:'3', openWith:'### ', placeHolder:'Your title here...' }, + {name:'Heading 4', key:'4', openWith:'#### ', placeHolder:'Your title here...' }, + {name:'Heading 5', key:'5', openWith:'##### ', placeHolder:'Your title here...' }, + {name:'Heading 6', key:'6', openWith:'###### ', placeHolder:'Your title here...' }, + {separator:'---------------' }, + {name:'Bold', key:'B', openWith:'**', closeWith:'**'}, + {name:'Italic', key:'I', openWith:'_', closeWith:'_'}, + {separator:'---------------' }, + {name:'Bulleted List', openWith:'- ' }, + {name:'Numeric List', openWith:function(markItUp) { + return markItUp.line+'. '; + }}, + {separator:'---------------' }, + {name:'Picture', key:'P', replaceWith:'![[![Alternative text]!]]([![Url:!:http://]!] "[![Title]!]")'}, + {name:'Link', key:'L', openWith:'[', closeWith:']([![Url:!:http://]!] "[![Title]!]")', placeHolder:'Your text to link here...' }, + {separator:'---------------'}, + {name:'Quotes', openWith:'> '}, + {name:'Code Block / Code', openWith:'(!(\t|!|`)!)', closeWith:'(!(`)!)'}, + {separator:'---------------'}, + {name:'Preview', call:'preview', className:"preview"} + ] +} + +// mIu nameSpace to avoid conflict. +miu = { + markdownTitle: function(markItUp, char) { + heading = ''; + n = $.trim(markItUp.selection||markItUp.placeHolder).length; + for(i = 0; i < n; i++) { + heading += char; + } + return '\n'+heading; + } +} \ No newline at end of file diff --git a/chrome_point_plus/js/options.js b/chrome_point_plus/js/options.js index 4b4f601..d158ee5 100644 --- a/chrome_point_plus/js/options.js +++ b/chrome_point_plus/js/options.js @@ -13,6 +13,10 @@ function save_options() { var checkbox_layout_fluid = document.getElementById('option-layout-fluid'); // Load original images var checkbox_images_load_original = document.getElementById('option-images-load-original'); + // Visual editor for posts + var checkbox_visual_editor_post = document.getElementById('option-visual-editor-post'); + // Google search + var checkbox_search_with_google = document.getElementById('option-search-with-google'); // Saving parameters chrome.storage.sync.set({ @@ -21,7 +25,9 @@ function save_options() { 'option_fancybox_videos': checkbox_fancybox_videos.checked, 'option_fancybox_posts': checkbox_fancybox_posts.checked, 'option_fluid_layout': checkbox_layout_fluid.checked, - 'option_images_load_original': checkbox_images_load_original.checked + 'option_images_load_original': checkbox_images_load_original.checked, + 'option_visual_editor_post': checkbox_visual_editor_post.checked, + 'option_search_with_google': checkbox_search_with_google.checked }, function() { // Update status to let user know options were saved. var status = document.getElementById('status'); @@ -35,7 +41,8 @@ function save_options() { // Restores select box state to saved value from localStorage. function restore_options() { // Loading options - chrome.storage.sync.get(['option_fancybox_images', 'option_fancybox_videos', 'option_fancybox_posts', 'option_ctrl_enter', 'option_images_load_original', 'option_fluid_layout'], function(options) { + chrome.storage.sync.get(['option_fancybox_images', 'option_fancybox_videos', 'option_fancybox_posts', 'option_ctrl_enter', 'option_images_load_original', + 'option_fluid_layout', 'option_visual_editor_post', 'option_search_with_google'], function(options) { // CTRL+Enter if (options.option_ctrl_enter == true) { document.getElementById('option-ctrl-enter').checked = true; @@ -61,6 +68,14 @@ function restore_options() { if (options.option_images_load_original == true) { document.getElementById('option-images-load-original').checked = true; } + // Visual editor for posts + if (options.option_visual_editor_post == true) { + document.getElementById('option-visual-editor-post').checked = true; + } + // Google search + if (options.option_search_with_google == true) { + document.getElementById('option-search-with-google').checked = true; + } }); } document.addEventListener('DOMContentLoaded', restore_options); diff --git a/chrome_point_plus/js/point-plus.js b/chrome_point_plus/js/point-plus.js index c9bce50..8530dce 100644 --- a/chrome_point_plus/js/point-plus.js +++ b/chrome_point_plus/js/point-plus.js @@ -1,6 +1,7 @@ $(document).ready(function() { // Loading options - chrome.storage.sync.get(['option_fancybox_images', 'option_fancybox_videos', 'option_fancybox_posts', 'option_ctrl_enter', 'option_fluid_layout', 'option_images_load_original'], function(options) { + chrome.storage.sync.get(['option_fancybox_images', 'option_fancybox_videos', 'option_fancybox_posts', 'option_ctrl_enter', 'option_fluid_layout', + 'option_images_load_original', 'option_visual_editor_post', 'option_search_with_google'], function(options) { // Fancybox // Images if (options.option_fancybox_images == true) { @@ -52,10 +53,11 @@ $(document).ready(function() { // Look and feel // Fluid #main layout if (options.option_fluid_layout == true) { - $('#main').css({ + $('#main, #header, #subheader, #footer').css({ 'width': '95%', 'max-width': '95%' }); + // TODO: fix #main #left-menu #top-link position } // Image resizing if (options.option_images_load_original == true) { @@ -72,6 +74,22 @@ $(document).ready(function() { 'max-height': '100%' }); } + // WYSIWYG editor + if (options.option_visual_editor_post == true) { + // Add classes + $('#new-post-form #text-input, .post-content #text-input').addClass('markitup').css('height', '20em'); + // Init + $('.markitup').markItUp(mySettings); + } + // Google search + if (options.option_search_with_google == true) { + $('#search-form input[type="text"]').attr('placeholder', 'Google').keydown(function(e) { + if (e.keyCode == 10 || e.keyCode == 13) { + e.preventDefault(); + document.location.href = '//www.google.ru/search?q=site%3Apoint.im+' + $(this).val(); + } + }); + } }); // Showing page action diff --git a/chrome_point_plus/manifest.json b/chrome_point_plus/manifest.json index c9c6d9a..3b0b76c 100644 --- a/chrome_point_plus/manifest.json +++ b/chrome_point_plus/manifest.json @@ -24,20 +24,31 @@ }, "content_scripts": [ { - "matches": ["http://*.point.im/*"], - "js": ["js/jquery-1.10.1.min.js", "js/jquery.fancybox.pack.js", "js/jquery.fancybox-media.js", "js/point-plus.js"], - "css": ["css/jquery.fancybox.css"], + "matches": ["http://*.point.im/*", "https://*.point.im/*"], + "js": [ + "js/jquery-1.10.1.min.js", + "js/jquery.fancybox.pack.js", "js/jquery.fancybox-media.js", + "js/markitup/jquery.markitup.js", "js/markitup/sets/markdown/set.js", + "js/point-plus.js" + ], + "css": [ + "css/jquery.fancybox.css", + "css/markitup/skins/markitup/style.css", "css/markitup/sets/markdown/style.css", + "css/point-plus.css" + ], "run_at": "document_end" } ], "web_accessible_resources": [ - "images/*" + "images/*", + "includes/*" ], "background": { "scripts": ["js/background.js"] }, "permissions": [ "http://*.point.im/*", + "https://*.point.im/*", "storage", "tabs" ] diff --git a/chrome_point_plus/options.html b/chrome_point_plus/options.html index 5a2eaa2..854f45b 100644 --- a/chrome_point_plus/options.html +++ b/chrome_point_plus/options.html @@ -25,6 +25,12 @@

    +

    +

    +

    +