Scratch Forums Composer Swag

Adds more posting tools to the Scratch forums composer

От 02.04.2015. Виж последната версия.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         Scratch Forums Composer Swag
// @namespace    http://aputurk.tk/
// @version      0.2.1
// @description  Adds more posting tools to the Scratch forums composer
// @author       MegaApuTurkUltra
// @include      http://scratch.mit.edu/discuss*
// @include      https://scratch.mit.edu/discuss*
// @require      https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js
// @require      https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.3/jquery-ui.min.js
// @grant        none
// ==/UserScript==
this.$ = this.jQuery = jQuery.noConflict(true);
var startScript = function () {
  // buttons for google, wikipedia, and wiki
  $('<li class="markItUpButton markItUpButtonSwag10 "><a href="" title="Google link">Google link</a></li>').insertAfter('.markItUpButton6').find('a').css('background-image', 'url(http://i.cubeupload.com/zBWOi5.png)').click(function (e) {
    var term = prompt('Enter a search term');
    if (term === null || term === '') {
      e.preventDefault();
      return false;
    }
    $('#id_body').replaceSel('[google]' + term + '[/google]');
    e.preventDefault();
    return false;
  });
    $('<li class="markItUpButton markItUpButtonSwag11 "><a href="" title="Scratch wiki link">Scratch wiki link</a></li>').insertAfter('.markItUpButtonSwag10').find('a').css('background-image', 'url(http://i.cubeupload.com/sxxPE3.png)').click(function (e) {
    var term = prompt('Enter an article');
    if (term === null || term === '') {
      e.preventDefault();
      return false;
    }
    $('#id_body').replaceSel('[wiki]' + term + '[/wiki]');
    e.preventDefault();
    return false;
  });
    $('<li class="markItUpButton markItUpButtonSwag12 "><a href="" title="Wikipedia article">Wikipedia article</a></li>').insertAfter('.markItUpButtonSwag11').find('a').css('background-image', 'url(http://i.cubeupload.com/2Jwmpr.png)').click(function (e) {
    var term = prompt('Enter an article');
    if (term === null || term === '') {
      e.preventDefault();
      return false;
    }
    $('#id_body').replaceSel('[wp]' + term + '[/wp]');
    e.preventDefault();
    return false;
  });
  // buttons for color, center, and code
  $('<li class="markItUpButton markItUpButtonSwag1 "><a href="" title="Color">Color</a></li>').insertAfter('.markItUpButton7').find('a').css('background-image', 'url(http://i.cubeupload.com/PsGwu4.png)').click(function (e) {
    var color = prompt('Enter a hex color, rgb(a) color, or CSS color name');
    if (color === null || color === '') {
      e.preventDefault();
      return false;
    }
    $('#id_body').replaceSel('[color=' + color + ']' + $('#id_body').getSel() + '[/color]');
    e.preventDefault();
    return false;
  });
  $('<li class="markItUpButton markItUpButtonSwag3 "><a href="" title="Center">Center</a></li>').insertAfter('.markItUpButtonSwag1').find('a').css('background-image', 'url(http://i.cubeupload.com/tfrXFd.png)').click(function (e) {
    $('#id_body').replaceSel('[center]' + $('#id_body').getSel() + '[/center]');
    e.preventDefault();
    return false;
  });
  $('<li class="markItUpButton markItUpButtonSwag3 "><a href="" title="Code">Code</a></li>').insertAfter('.markItUpButton14').find('a').css('background-image', 'url(http://i.cubeupload.com/XqOaKz.png)').click(function (e) {
    var code = prompt('Enter a language');
    if (code === null || code === '') {
      e.preventDefault();
      return false;
    }
    $('#id_body').replaceSel('[code=' + code + ']\n' + $('#id_body').getSel() + '\n[/code]');
    e.preventDefault();
    return false;
  });
  // and now for the swaggy sticky quoter
  var currentStickyTitle = '';
  var currentStickyLink = '';
  var onSelectionPage = false;
  var cannedDlg = $('<div id=\'canned-dlg\' title=\'Insert Canned Quote\'>Loading...<br/><div id=\'canned-progress\'></div></div>').dialog({
    autoOpen: false,
    buttons: {
      'Cancel': function () {
        $(this).dialog('close');
      }
    },
    width: 500,
    height: 500,
    show: 'fade',
    hide: 'fade',
    dialogClass: 'jqui-modal canned-dlg'
  });
  var menu;
  var select = $('<div id=\'canned-page2\'><p>Select the part of the post you want, then click OK</p><textarea id=\'canned-select\'>Loading...</textarea><br/><button id=\'canned-ok\'>Use selection</button></div>'
  );
  var ajaxLoading = false;
  function loadAjax() {
    if (ajaxLoading) return;
    ajaxLoading = true;
    $.get('/discuss/', {
      dataType: 'html'
    }, function (data) {
      menu = $('<ul id=\'canned-menu\'></ul>');
      $(data).find('.tclcon a').each(function () {
        menu.append($('<li></li>').addClass('canned-menu-item').attr('data-link', $(this).attr('href')).append($('<button></button').text($(this).text()).addClass('canned-menu-button canned-primary')));
      });
      var completeXHRs = 0;
      var totalXHRs = menu.find('li').length;
      var complete = function () {
        completeXHRs++;
        $('#canned-progress').progressbar({
          value: Math.round(100 * completeXHRs / totalXHRs)
        });
        if (completeXHRs >= totalXHRs) {
          $('#canned-dlg').html('');
          $('#canned-dlg').append(menu);
          cannedDlg.append(select);
          $('#canned-select').css({
            'width': '100%'
          }).attr('rows', '10');
          $('#canned-ok').click(function (e) {
            var sel = $('#canned-select').getSel();
            console.log(sel);
            if (sel === null || sel === '') return;
            $('#id_body').replaceSel('[quote]\n[b]As stated on the sticky [url=https://scratch.mit.edu' + currentStickyLink + ']'
            + currentStickyTitle.replace('(New Posts)', '') + '[/url]:[/b]\n\n' + sel + '\n[/quote]');
            cannedDlg.dialog('close');
            e.preventDefault();
            return false;
          });
          select.hide();
          $('.canned-menu-button').button().css('width', '100%');
          $('.canned-menu-button.canned-primary').click(function () {
            $(this).parent().find('.canned-submenu').slideToggle();
            cannedDlg.dialog({
              title: 'Select a sticky topic'
            });
          });
          $('.canned-menu-button.canned-secondary').click(function () {
            cannedDlg.dialog({
              title: 'Select the part of the sticky you want'
            });
            $('#canned-select').val('Loading...');
            var url = $(this).parent().attr('data-sticky-link');
            currentStickyTitle = $(this).parent().attr('data-sticky-title');
            currentStickyLink = $(this).parent().attr('data-sticky-link');
            menu.fadeOut(700, function () {
              select.fadeIn();
            });
            onSelectPage = true;
            $.get(url, {
              dataType: 'html'
            }, function (data3) {
              var source = $(data3).find('.firstpost').eq(0).find('.conr').next().attr('href');
              $.get(source + 'source/', function (data4) {
                $('#canned-select').val(data4);
              });
            });
          });
          $('.canned-submenu').hide();
          menu.css('list-style-type', 'none');
          $('.canned-submenu').css('list-style-type', 'none');
        }
      };
      menu.find('li').each(function () {
        var thisLi = $(this);
        $.get($(this).attr('data-link'), {
          dataType: 'html'
        }, function (data2) {
          var submenu = $('<ul class=\'canned-submenu\'></ul');
          $(data2).find('.isticky').each(function () {
            var a = $(this).next().find('a');
            submenu.append($('<li></li>').addClass('canned-menu-item').attr('data-sticky-link', a.attr('href')).attr('data-sticky-title', a.text()).append($('<button></button').text(a.text()).addClass('canned-menu-button canned-secondary')));
          });
          thisLi.append(submenu);
        }).always(function () {
          complete();
        });
      });
    });
  }
  $('.canned-dlg button.ui-dialog-titlebar-close').hide();
  $('<li class="markItUpButton markItUpButtonSwag2 "><a href="" title="Canned quotes">Canned quotes</a></li>').insertAfter('.markItUpButton11').find('a').css('background-image', 'url(http://i.cubeupload.com/l6I5Sk.png)').click(function (e) {
    loadAjax();
    cannedDlg.dialog({
      title: 'Select a forum section to find stickies in'
    }).dialog('open');
    if (typeof menu !== 'undefined') menu.show();
    select.hide();
    onSelectPage = false;
    e.preventDefault();
    return false;
  });
  var draftStatus = $('<span></span>').css({'display':'inline-block','width':'150px','height':'1.4em','overflow':'hidden'});
  var currentSessionRnd = Math.round(Math.random() * 1000000000);
  $('<li class="markItUpButton markItUpButtonSwag3 "><a href="javascript:void(0)" title="Save draft">Save draft</a></li>').insertAfter('.markItUpButton16').find('a').css('background-image', 'url(http://i.cubeupload.com/NY2bfk.png)').click(function (e) {
    var title = 'draft_' + currentSessionRnd;
    if ($('#id_name').length > 0) title = $('#id_name').val();
    var content = $('#id_body').val();
    var drafts = {
    };
    if (typeof localStorage['forumSwagDrafts'] !== 'undefined')
    drafts = JSON.parse(localStorage['forumSwagDrafts']);
    if (drafts.hasOwnProperty(title)) {
      if (!confirm('Overwrite draft \'' + title + '\'?')) {
        e.preventDefault();
        return false;
      }
    }
    drafts[title] = content;
    localStorage['forumSwagDrafts'] = JSON.stringify(drafts);
    draftStatus.text('Saved draft: ' + title).show().fadeOut(1000);
    e.preventDefault();
    return false;
  });
  $('<li class="markItUpButton markItUpButtonSwag4 "><a href="javascript:void(0)" title="Open draft">Open draft</a></li>').insertAfter('.markItUpButton16').find('a').css('background-image', 'url(http://i.cubeupload.com/BSsouH.png)').click(function (e) {
    if (typeof localStorage['forumSwagDrafts'] === 'undefined') localStorage['forumSwagDrafts'] = JSON.stringify({
    });
    var drafts = JSON.parse(localStorage['forumSwagDrafts']);
    var select = $('<select><option value=\'__internal_default\'>&gt; Select a draft</option></select').css({'height': '16px', 'width':'150px'});
    select.append('<option value=\'__internal_del\'>&gt; Delete a draft</option>');
    var hasItems = false;
    for (var key in drafts) {
      if (drafts.hasOwnProperty(key)) {
        select.append($('<option></option>').attr('value', key).text(key));
        hasItems = true;
      }
    }
    if (!hasItems) {
      draftStatus.text('No drafts!').show().fadeOut(1000);
      e.preventDefault();
      return false;
    }
    select.append($('<option></option>').attr('value', '__internal_none').text('Cancel'));
    draftStatus.html('').append(select).show();
    select.on('change', function () {
      var value = $(this).val();
      if (value === '__internal_none') {
        draftStatus.fadeOut();
        return;
      }
      if(value === '__internal_default'){
        return;
      }
      var is_del = typeof $(this).attr('data-delete') !== 'undefined';
      if (is_del) {
        if (!confirm('Delete \'' + value + '\'?')) {
          $(this).val('__internal_default');
          return;
        }
        var drafts = JSON.parse(localStorage['forumSwagDrafts']);
        delete drafts[value];
        localStorage['forumSwagDrafts'] = JSON.stringify(drafts);
        draftStatus.fadeOut();
        return;
      }
      if (value === '__internal_del') {
        $(this).attr('data-delete', 'yes');
        $(this).find('option').eq(0).text('Select a draft to delete');
        $(this).find('option').eq(1).remove();
        $(this).val('__internal_default');
        return;
      }
      if ($('#id_body').val().trim() !== '') {
        if (!confirm('Overwrite text in editor?')) {
          $(this).val('__internal_default');
          return;
        }
      }
      var drafts2 = JSON.parse(localStorage['forumSwagDrafts']);
      if ($('#id_name').length > 0) {
        $('#id_name').val(value);
      }
      $('#id_body').val(drafts2[value]);
      draftStatus.text('Loaded draft: ' + value).show().fadeOut(1000);
    });
    e.preventDefault();
    return false;
  });
  draftStatus.insertAfter('.markItUpButtonSwag4');
  // mostly from http://stackoverflow.com/a/3966822/1021196
  function getInputSelection(el) {
    var start = 0,
    end = 0,
    normalizedValue,
    range,
    textInputRange,
    len,
    endRange;
    if (typeof el.selectionStart == 'number' && typeof el.selectionEnd == 'number') {
      start = el.selectionStart;
      end = el.selectionEnd;
    } else {
      range = document.selection.createRange();
      if (range && range.parentElement() == el) {
        len = el.value.length;
        normalizedValue = el.value.replace(/\r\n/g, '\n');
        // Create a working TextRange that lives only in the input
        textInputRange = el.createTextRange();
        textInputRange.moveToBookmark(range.getBookmark());
        // Check if the start and end of the selection are at the very end
        // of the input, since moveStart/moveEnd doesn't return what we want
        // in those cases
        endRange = el.createTextRange();
        endRange.collapse(false);
        if (textInputRange.compareEndPoints('StartToEnd', endRange) > - 1) {
          start = end = len;
        } else {
          start = - textInputRange.moveStart('character', - len);
          start += normalizedValue.slice(0, start).split('\n').length - 1;
          if (textInputRange.compareEndPoints('EndToEnd', endRange) > - 1) {
            end = len;
          } else {
            end = - textInputRange.moveEnd('character', - len);
            end += normalizedValue.slice(0, end).split('\n').length - 1;
          }
        }
      }
    }
    return {
      start: start,
      end: end
    };
  }
  function getSelectedText(el) {
    var sel = getInputSelection(el),
    val = el.value;
    return val.slice(sel.start, sel.end);
  }
  function replaceSelectedText(el, text) {
    var sel = getInputSelection(el),
    val = el.value;
    el.value = val.slice(0, sel.start) + text + val.slice(sel.end);
  }
  $.fn.getSel = function () {
    return getSelectedText($(this).get(0));
  };
  $.fn.replaceSel = function (text) {
    replaceSelectedText($(this).get(0), text);
  };
}
$(document).ready(function () {
  var interval;
  interval = setInterval(function () {
    if ($('.markItUpButton').html() != null) {
      clearInterval(interval);
      startScript();
    }
  }, 200);
});