123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693 |
- /**
- * Simple Machines Forum (SMF)
- *
- * @package SMF
- * @author Simple Machines
- * @copyright 2013 Simple Machines and individual contributors
- * @license http://www.simplemachines.org/about/smf/license.php BSD
- *
- * @version 2.1 Alpha 1
- */
- (function($) {
- var extensionMethods = {
- InsertText: function(text, bClear) {
- var bIsSource = this.inSourceMode();
- // @TODO make it put the quote close to the current selection
- if (!bIsSource)
- this.toggleSourceMode();
- var current_value = bClear ? text + "\n" : this.getSourceEditorValue(false) + "\n" + text + "\n";
- this.setSourceEditorValue(current_value);
- if (!bIsSource)
- this.toggleSourceMode();
- },
- getText: function(filter) {
- var current_value = '';
- if(this.inSourceMode())
- current_value = this.getSourceEditorValue(false);
- else
- current_value = this.getWysiwygEditorValue(filter);
- return current_value;
- },
- appendEmoticon: function (code, emoticon) {
- if (emoticon == '')
- line.append($('<br />'));
- else
- line.append($('<img />')
- .attr({
- src: emoticon,
- alt: code,
- })
- .click(function (e) {
- var start = '', end = '';
-
- if (base.opts.emoticonsCompat)
- {
- start = '<span> ';
- end = ' </span>';
- }
- if (base.inSourceMode())
- base.sourceEditorInsertText(' ' + $(this).attr('alt') + ' ');
- else
- base.wysiwygEditorInsertHtml(start + '<img src="' + $(this).attr("src") + '" data-sceditor-emoticon="' + $(this).attr('alt') + '" />' + end);
- e.preventDefault();
- })
- );
- if (line.children().length > 0)
- content.append(line);
- $(".sceditor-toolbar").append(content);
- },
- storeLastState: function (){
- this.wasSource = this.inSourceMode();
- },
- setTextMode: function () {
- if (!this.inSourceMode())
- this.toggleSourceMode();
- },
- createPermanentDropDown: function() {
- var emoticons = $.extend({}, this.opts.emoticons.dropdown);
- var popup_exists = false;
- content = $('<div class="sceditor-insertemoticon" />');
- line = $('<div />');
- base = this;
- for (smiley_popup in this.opts.emoticons.popup)
- {
- popup_exists = true;
- break;
- }
- if (popup_exists)
- {
- this.opts.emoticons.more = this.opts.emoticons.popup;
- moreButton = $('<div class="sceditor-more-button sceditor-more" />').text('[' + this._('More') + ']').click(function () {
- if ($(".sceditor-smileyPopup").length > 0)
- {
- $(".sceditor-smileyPopup").fadeIn('fast');
- }
- else
- {
- var emoticons = $.extend({}, base.opts.emoticons.popup);
- var popup_position;
- var titlebar = $('<div class="catbg sceditor-popup-grip"/>');
- popupContent = $('<div id="sceditor-popup"/>');
- allowHide = true;
- line = $('<div id="sceditor-popup-smiley"/>');
- adjheight = 0;
- popupContent.append(titlebar);
- closeButton = $('<span />').text('[' + base._('Close') + ']').click(function () {
- $(".sceditor-smileyPopup").fadeOut('fast');
- });
- $.each(emoticons, base.appendEmoticon);
- if (line.children().length > 0)
- popupContent.append(line);
- if (typeof closeButton !== "undefined")
- popupContent.append(closeButton);
- // IE needs unselectable attr to stop it from unselecting the text in the editor.
- // The editor can cope if IE does unselect the text it's just not nice.
- if(base.ieUnselectable !== false) {
- content = $(content);
- content.find(':not(input,textarea)').filter(function() { return this.nodeType===1; }).attr('unselectable', 'on');
- }
- $dropdown = $('<div class="sceditor-dropdown sceditor-smileyPopup" />').append(popupContent);
- $dropdown.appendTo($('body'));
- dropdownIgnoreLastClick = true;
- adjheight = closeButton.height() + titlebar.height();
- $dropdown.css({
- position: "fixed",
- top: $(window).height() * 0.2,
- left: $(window).width() * 0.5 - ($dropdown.find('#sceditor-popup-smiley').width() / 2),
- "max-width": "50%",
- "max-height": "50%",
- }).find('#sceditor-popup-smiley').css({
- height: $dropdown.height() - adjheight,
- "overflow": "auto"
- });
- $('.sceditor-smileyPopup').animaDrag({
- speed: 150,
- interval: 120,
- during: function(e) {
- $(this).height(this.startheight);
- $(this).width(this.startwidth);
- },
- before: function(e) {
- this.startheight = $(this).innerHeight();
- this.startwidth = $(this).innerWidth();
- },
- grip: '.sceditor-popup-grip'
- });
- // stop clicks within the dropdown from being handled
- $dropdown.click(function (e) {
- e.stopPropagation();
- });
- }
- });
- }
- $.each(emoticons, base.appendEmoticon);
- if (typeof moreButton !== "undefined")
- content.append(moreButton);
- }
- };
- $.extend(true, $['sceditor'].prototype, extensionMethods);
- })(jQuery);
- $.sceditor.command.set(
- 'ftp', {
- tooltip: 'Insert FTP Link',
- txtExec: ["[ftp]", "[/ftp]"],
- exec: function (caller) {
- var editor = this,
- content = $(this._('<form><div><label for="link">{0}</label> <input type="text" id="link" value="ftp://" /></div>' +
- '<div><label for="des">{1}</label> <input type="text" id="des" value="" /></div></form>',
- this._("URL:"),
- this._("Description (optional):")
- ))
- .submit(function () {return false;});
- content.append($(
- this._('<div><input type="button" class="button" value="{0}" /></div>',
- this._("Insert")
- )).click(function (e) {
- var val = $(this).parent("form").find("#link").val(),
- description = $(this).parent("form").find("#des").val();
- if(val !== "" && val !== "ftp://") {
- // needed for IE to reset the last range
- editor.focus();
- if(!editor.getRangeHelper().selectedHtml() || description)
- {
- if(!description)
- description = val;
- editor.wysiwygEditorInsertHtml('<a href="' + val + '">' + description + '</a>');
- }
- else
- editor.execCommand("createlink", val);
- }
- editor.closeDropDown(true);
- e.preventDefault();
- }));
- editor.createDropDown(caller, "insertlink", content);
- }
- }
- );
- $.sceditor.command.set(
- 'glow', {
- tooltip: 'Glow',
- txtExec: ["[glow=red,2,300]", "[/glow]"],
- exec: function () {
- this.wysiwygEditorInsertHtml('[glow=red,2,300]', '[/glow]');
- }
- }
- );
- $.sceditor.command.set(
- 'shadow', {
- tooltip: 'Shadow',
- txtExec: ["[shadow=red,left]", "[/shadow]"],
- exec: function () {
- this.wysiwygEditorInsertHtml('[shadow=red,left]', '[/shadow]');
- }
- }
- );
- $.sceditor.command.set(
- 'tt', {
- tooltip: 'Teletype',
- txtExec: ["[tt]", "[/tt]"],
- exec: function () {
- this.wysiwygEditorInsertHtml('<tt>', '</tt>');
- }
- }
- );
- $.sceditor.command.set(
- 'pre', {
- tooltip: 'Pre',
- txtExec: ["[pre]", "[/pre]"],
- exec: function () {
- this.wysiwygEditorInsertHtml('<pre>', '</pre>');
- }
- }
- );
- $.sceditor.command.set(
- 'move', {
- tooltip: 'Marquee',
- txtExec: ["[move]", "[/move]"],
- exec: function () {
- this.wysiwygEditorInsertHtml('<marquee>', '</marquee>');
- }
- }
- );
- $.sceditor.command.set(
- 'email', {
- txtExec: function(caller, selected) {
- var display = selected && selected.indexOf('@') > -1 ? null : selected,
- email = prompt(this._("Enter the e-mail address:"), (display ? '' : selected));
- if (email)
- {
- var text = prompt(this._("Enter the displayed text:"), display || email) || email;
- this.insertText("[email=" + email + "]" + text + "[/email]");
- }
- }
- }
- );
- $.sceditor.command.set(
- 'link', {
- txtExec: function(caller, selected) {
- var display = selected && selected.indexOf('http://') > -1 ? null : selected,
- url = prompt(this._("Enter URL:"), (display ? 'http://' : selected));
- if (url)
- {
- var text = prompt(this._("Enter the displayed text:"), display || url) || url;
- this.insertText("[url=" + url + "]" + text + "[/url]");
- }
- }
- }
- );
- $.sceditor.command.set(
- 'bulletlist', {
- txtExec: ["[list]\n[li]", "[/li]\n[li][/li]\n[/list]"]
- }
- );
- $.sceditor.command.set(
- 'orderedlist', {
- txtExec: ["[list type=decimal]\n[li]", "[/li]\n[li][/li]\n[/list]"]
- }
- );
- $.sceditor.command.set(
- 'table', {
- txtExec: ["[table]\n[tr]\n[td]", "[/td]\n[/tr]\n[/table]"]
- }
- );
- $.sceditorBBCodePlugin.bbcode.set(
- 'abbr', {
- tags: {
- abbr: {
- title: null
- }
- },
- format: function(element, content) {
- return '[abbr=' + element.attr('title') + ']' + content + '[/abbr]';
- },
- html: function(element, attrs, content) {
- if(typeof attrs.defaultattr === "undefined" || attrs.defaultattr.length === 0)
- return content;
- return '<abbr title="' + attrs.defaultattr + '">' + content + '</abbr>';
- }
- }
- );
- $.sceditorBBCodePlugin.bbcode.set(
- 'acronym', {
- tags: {
- acronym: {
- title: null
- }
- },
- format: function(element, content) {
- return '[abbr=' + element.attr('title') + ']' + content + '[/abbr]';
- },
- html: function(element, attrs, content) {
- if(typeof attrs.defaultattr === "undefined" || attrs.defaultattr.length === 0)
- return content;
- return '<abbr title="' + attrs.defaultattr + '">' + content + '</abbr>';
- }
- }
- );
- $.sceditorBBCodePlugin.bbcode.set(
- 'bdo', {
- tags: {
- bdo: {
- dir: null
- }
- },
- format: function(element, content) {
- return '[bdo=' + element.attr('dir') + ']' + content + '[/bdo]';
- },
- html: function(element, attrs, content) {
- if(typeof attrs.defaultattr === "undefined" || attrs.defaultattr.length === 0)
- return content;
- if (attrs.defaultattr != 'rtl' && attrs.defaultattr != 'ltr')
- return '[bdo=' + attrs.defaultattr + ']' + content + '[/bdo]';
- return '<bdo dir="' + attrs.defaultattr + '">' + content + '</bdo>';
- }
- }
- );
- $.sceditorBBCodePlugin.bbcode.set(
- 'black', {
- html: '<font color="black">{0}</font>'
- }
- );
- $.sceditorBBCodePlugin.bbcode.set(
- 'blue', {
- html: '<font color="blue">{0}</font>'
- }
- );
- $.sceditorBBCodePlugin.bbcode.set(
- 'green', {
- html: '<font color="green">{0}</font>'
- }
- );
- $.sceditorBBCodePlugin.bbcode.set(
- 'red', {
- html: '<font color="red">{0}</font>'
- }
- );
- $.sceditorBBCodePlugin.bbcode.set(
- 'white', {
- html: '<font color="white">{0}</font>'
- }
- );
- $.sceditorBBCodePlugin.bbcode.set(
- 'list', {
- breakStart: true,
- isInline: false,
- allowedChildren: ['*', 'li'],
- html: function(element, attrs, content) {
- var style = '';
- var code = 'ul';
- if (attrs.type)
- style = ' style="list-style-type: ' + attrs.type + '"';
- return '<' + code + style + '>' + content + '</' + code + '>';
- }
- }
- );
- $.sceditorBBCodePlugin.bbcode.set(
- 'ul', {
- tags: {
- ul: null
- },
- breakStart: true,
- isInline: false,
- html: '<ul>{0}</ul>',
- format: function(element, content) {
- if ($(element[0]).css('list-style-type') == 'disc')
- return '[list]' + content + '[/list]';
- else
- return '[list type=' + $(element[0]).css('list-style-type') + ']' + content + '[/list]';
- }
- }
- );
- $.sceditorBBCodePlugin.bbcode.set(
- 'ol', {
- tags: {
- ol: null
- },
- breakStart: true,
- isInline: false,
- format: "[list type=decimal]{0}[/list]",
- html: '<ol>{0}</ol>'
- }
- );
- $.sceditorBBCodePlugin.bbcode.set(
- 'img', {
- tags: {
- img: {
- src: null
- }
- },
- allowsEmpty: true,
- quoteType: $.sceditor.BBCodeParser.QuoteType.never,
- format: function(element, content) {
- var attribs = '',
- style = function(name) {
- return element.style ? element.style[name] : null;
- };
- // check if this is an emoticon image
- if(typeof element.attr('data-sceditor-emoticon') !== "undefined")
- return content;
- // only add width and height if one is specified
- if(element.attr('width') || style('width'))
- attribs += " width=" + $(element).width();
- if(element.attr('height') || style('height'))
- attribs += " height=" + $(element).height();
- if(element.attr('alt'))
- attribs += " alt=" + element.attr('alt');
- return '[img' + attribs + ']' + element.attr('src') + '[/img]';
- },
- html: function(token, attrs, content) {
- var parts,
- attribs = '';
- // handle [img width=340 height=240]url[/img]
- if(typeof attrs.width !== "undefined")
- attribs += ' width="' + attrs.width + '"';
- if(typeof attrs.height !== "undefined")
- attribs += ' height="' + attrs.height + '"';
- if(typeof attrs.alt !== "undefined")
- attribs += ' alt="' + attrs.alt + '"';
- return '<img' + attribs + ' src="' + content + '" />';
- }
- }
- );
- $.sceditorBBCodePlugin.bbcode.set(
- 'url', {
- allowsEmpty: true,
- tags: {
- a: {
- href: null
- }
- },
- format: function(element, content) {
- var url = element.attr('href');
- // make sure this link is not an e-mail, if it is return e-mail BBCode
- if(url.substr(0, 7) === 'mailto:')
- return '[email=' + url.substr(7) + ']' + content + '[/email]';
- // make sure this link is not an ftp, if it is return ftp BBCode
- else if(url.substr(0, 3) === 'ftp')
- return '[ftp=' + url + ']' + content + '[/ftp]';
- if(element.attr('target') !== undefined)
- return '[url=' + decodeURI(url) + ']' + content + '[/url]';
- else
- return '[iurl=' + decodeURI(url) + ']' + content + '[/iurl]';
- },
- html: function(token, attrs, content) {
- if(typeof attrs.defaultattr === "undefined" || attrs.defaultattr.length === 0)
- attrs.defaultattr = content;
- return '<a target="_blank" href="' + encodeURI(attrs.defaultattr) + '">' + content + '</a>';
- }
- }
- );
- $.sceditorBBCodePlugin.bbcode.set(
- 'iurl', {
- allowsEmpty: true,
- html: function(token, attrs, content) {
- if(typeof attrs.defaultattr === "undefined" || attrs.defaultattr.length === 0)
- attrs.defaultattr = content;
- return '<a href="' + encodeURI(attrs.defaultattr) + '">' + content + '</a>';
- }
- }
- );
- $.sceditorBBCodePlugin.bbcode.set(
- 'ftp', {
- allowsEmpty: true,
- html: function(token, attrs, content) {
- if(typeof attrs.defaultattr === "undefined" || attrs.defaultattr.length === 0)
- attrs.defaultattr = content;
- return '<a target="_blank" href="' + encodeURI(attrs.defaultattr) + '">' + content + '</a>';
- }
- }
- );
- $.sceditorBBCodePlugin.bbcode.set(
- 'tt', {
- tags: {
- tt: null
- },
- format: "[tt]{0}[/tt]",
- html: '<tt>{0}</tt>'
- }
- );
- $.sceditorBBCodePlugin.bbcode.set(
- 'pre', {
- tags: {
- pre: null
- },
- isBlock: true,
- format: "[pre]{0}[/pre]",
- html: "<pre>{0}</pre>\n"
- }
- );
- $.sceditorBBCodePlugin.bbcode.set(
- 'move', {
- tags: {
- marquee: null
- },
- format: "[move]{0}[/move]",
- html: '<marquee>{0}</marquee>'
- }
- );
- $.sceditorBBCodePlugin.bbcode.set(
- 'php', {
- isInline: false,
- format: "[php]{0}[/php]",
- html: '<code class="php">{0}</code>'
- }
- );
- $.sceditorBBCodePlugin.bbcode.set(
- 'code', {
- tags: {
- code: null
- },
- isInline: false,
- allowedChildren: ['#', '#newline'],
- format: function(element, content) {
- if ($(element[0]).hasClass('php'))
- return '[php]' + content.replace('[', '[') + '[/php]';
- var from = '';
- if ($(element).children("cite:first").length === 1)
- {
- from = $(element).children("cite:first").text();
- $(element).attr({'from': from.php_htmlspecialchars()});
- from = '=' + from;
- content = '';
- $(element).children("cite:first").remove();
- content = this.elementToBbcode($(element));
- }
- else
- {
- if (typeof $(element).attr('from') != 'undefined')
- {
- from = '=' + $(element).attr('from').php_unhtmlspecialchars();
- }
- }
- return '[code' + from + ']' + content.replace('[', '[') + '[/code]';
- },
- html: function(element, attrs, content) {
- var from = '';
- if(typeof attrs.defaultattr !== "undefined")
- from = '<cite>' + attrs.defaultattr + '</cite>';
- return '<code>' + from + content.replace('[', '[') + '</code>'
- }
- }
- );
- $.sceditorBBCodePlugin.bbcode.set(
- 'quote', {
- tags: {
- blockquote: null,
- cite: null
- },
- quoteType: $.sceditor.BBCodeParser.QuoteType.never,
- breakBefore: false,
- isInline: false,
- format: function(element, content) {
- var author = '';
- var date = '';
- var link = '';
- // The <cite> contains only the graphic for the quote, so we can skip it
- if(element[0].tagName.toLowerCase() === 'cite')
- return '';
- if(element.attr('author'))
- author = ' author=' + element.attr('author').php_unhtmlspecialchars();
- if(element.attr('date'))
- date = ' date=' + element.attr('date');
- if(element.attr('link'))
- link = ' link=' + element.attr('link');
- return '[quote' + author + date + link + ']' + content + '[/quote]';
- },
- html: function(element, attrs, content) {
- var attr_author = '', author = '';
- var attr_date = '', sDate = '';
- var attr_link = '', link = '';
- if(typeof attrs.author !== "undefined" && attrs.author)
- {
- attr_author = attrs.author;
- author = bbc_quote_from + ': ' + attr_author;
- }
- // Links could be in the form: link=topic=71.msg201#msg201 that would fool javascript, so we need a workaround
- // Probably no more necessary
- for (var key in attrs)
- {
- if (key.substr(0, 4) == 'link' && attrs.hasOwnProperty(key))
- {
- var attr_link = key.length > 4 ? key.substr(5) + '=' + attrs[key] : attrs[key];
- link = attr_link.substr(0, 7) == 'http://' ? attr_link : smf_scripturl + '?' + attr_link;
- author = author == '' ? '<a href="' + link + '">' + bbc_quote_from + ': ' + link + '</a>' : '<a href="' + link + '">' + author + '</a>';
- }
- }
- if(typeof attrs.date !== "undefined" && attrs.date)
- {
- attr_date = attrs.date;
- sDate = '<date timestamp="' + attr_date + '">' + new Date(attrs.date * 1000) + '</date>';
- }
- if (author == '' && sDate == '')
- author = bbc_quote;
- else
- author += ' ' + bbc_search_on;
- content = '<blockquote author="' + attr_author + '" date="' + attr_date + '" link="' + attr_link + '"><cite>' + author + ' ' + sDate + '</cite>' + content + '</blockquote>';
- return content;
- }
- }
- );
|