ميدياويكي:Gadget-Easy LST.js

ملاحظة: بعد النشر، أنت قد تحتاج إلى إفراغ الكاش الخاص بمتصفحك لرؤية التغييرات.

  • فايرفوكس / سافاري: أمسك Shift أثناء ضغط Reload، أو اضغط على إما Ctrl-F5 أو Ctrl-R (⌘-R على ماك)
  • جوجل كروم: اضغط Ctrl-Shift-R (⌘-Shift-R على ماك)
  • إنترنت إكسبلورر/إيدج: أمسك Ctrl أثناء ضغط Refresh، أو اضغط Ctrl-F5
  • أوبرا: اضغط Ctrl-F5.
/**
 * Easy Labelled Section Transclusion Syntax
 *
 * Configurations:
 *     enabled:    Set to false to disable this gadget on the current page
 *
 * Configure it like this, from your main JS:
 *
 * {
 *   var easySectSyntaxConfig = {
 *    enabled: true,
 *   };
 *
 *   mw.hook("easy_section_syntax.config").fire(easySectSyntaxConfig);
 * }
 */

"use strict";

// IIFE used when including as a user script (to allow debug or config)
// Default gadget use will get an IIFE wrapper as well
(function($, mw) {

  var gadget_name = "easy_section_syntax";

  var EasySS = {
    enabled: true,
    debug: true,
    configured: false,
  };

  function log(msg) {
    if (EasySS.debug) {
      console.log(gadget_name + ": ", msg);
    }
  }

  function error(msg) {
    console.error(gadget_name + ": ", msg);
  }

  /*
   * Read config from user. This function fired by hook
   */
  function apply_config(cfg) {
    console.log("Configuring " + gadget_name);

    // Bail if the config looks like junk
    if (!cfg || typeof cfg !== "object") {
      console.error("Invalid " + gadget_name + " config", cfg);
      return;
    }

    if (typeof cfg.enabled === "boolean") {
      EasySS.enabled = cfg.enabled;
    }

    if (typeof cfg.debug === "boolean") {
      EasySS.debug = cfg.debug;
    }

    EasySS.configured = true;
  }

  /*
   * Convert ## syntax to <section> syntax
   */
  function restore_lst() {

    log("Restoring section markers from ##-syntax");

    var editbox = $("#wpTextbox1");

    if (!editbox) {
      error("Couldn't find editbox");
      return;
    }

    var search = /##[\s]*(.*?)[\s]*##[\s]*\n/;
    var a = editbox.textSelection('getContents').split(search);
    var s = a[0];
    var m = parseInt(a.length / 2);
    for (var i = 0; i < m; i++) {
      var title = a[i * 2 + 1];
      // Ensure we'll don't get twice quote.
      title = title.replace(/^"(.*)"$/, "$1");
      title = title.replace(/^'(.*)'$/, "$1");
      var content = a[i * 2 + 2];
      if (title && content.substring(0, 2) == "{|") {
        content = "\n" + content;
      }
      if (title) {
        s = s + "<section begin=\"" + title + "\" />" +
          content +
          "<section end=\"" + title + "\" />\n";
      } else {
        s = s + content;
      }
      /* if( i < m-1 ) s = s + "----\n"; */
    }
    editbox.textSelection('setContents', s);
  }

  /**
   * easy lst: hide section markers
   */
  function easy_section_syntax() {

    log("Converting section markers to ##-syntax");

    var editbox = $("#wpTextbox1");

    if (!editbox) {
      error("Couldn't find editbox");
      return;
    }

    var search = /<section\sbegin=[\s]*(.*?)[\s]*\/>/;
    var a = editbox.textSelection('getContents').split(search);
    var s = a[0];
    var ok = true;
    for (var i = 0; i < parseInt(a.length / 2); i++) {
      var title = a[i * 2 + 1];
      var content = a[i * 2 + 2];
      var r2 = /^([\s\S]*?)<section\send=(.*?)\/>(\n|)[\s]*([\s\S]*?)$/;
      var m2 = content.match(r2);
      if (m2) {
        title = title.replace(/^"(.*)"$/, "$1");
        title = title.replace(/^'(.*)'$/, "$1");
        if (s && s.charAt(s.length - 1) != "\n" &&
          s.charAt(s.length - 1) != "|") {
          s = s + "\n";
        }
        s = s + "## " + title + " ##\n" + m2[1];
        if (m2[4]) {
          if (m2[4] != "----\n") {
            if (s && s.charAt(s.length - 1) != "\n") {
              s = s + "\n";
            }
            s = s + "####\n" + m2[4];
          }
        }
      } else {
        ok = false;
        error("Error" + title);
      }
    }
    if (ok) {
      // val() function is important, as just setting .value on a raw
      // element doesn't work in CodeMirror
      editbox.textSelection('setContents', s);
    }
  }

  /*
   * Run setup, and convert to ## syntax for LST
   */
  function on_load() {
    easy_section_syntax();

    // Install the on-save hook on all edit buttons
    $('.editButtons').click(restore_lst);
  }

  /**
   * Install a load hook in the editor
   * @param  {Function} callback: function to call when editor text is loaded
   */
  function install_load_hook(callback) {
    if ($.inArray(mw.config.get("wgAction"), ["edit", "submit"]) !== -1) {
      mw.loader.using("ext.proofreadpage.page", function() {
        // mimic code in the extension, there is a conditionnal deps on ext.wikiEditor.
        if (mw.user.options.get("usebetatoolbar") &&
          $.inArray("ext.wikiEditor", mw.loader.getModuleNames()) > -1) {
          var load_deps = ["ext.wikiEditor"];
          if (mw.user.options.get("codemirror-syntax-highlight") == 1) {
            load_deps.push("ext.CodeMirror.lib");
          }
          mw.loader.using(load_deps, function() {
            callback();
          });
        } else {
          callback();
        }
      });
    }
  }

  function easy_sect_syn_setup() {

    // Get user config, if any
    mw.hook(gadget_name + ".config").add(apply_config);

    // LST only in Page NS and if user has it enabled
    if (!EasySS.enabled || mw.config.get("wgCanonicalNamespace") !== "Page") {
      return;
    }

    install_load_hook(on_load);
  }
  $(easy_sect_syn_setup);

}(jQuery, mediaWiki));