「MediaWiki:Common.js」の版間の差分

提供:WikiNebula
ナビゲーションに移動 検索に移動
編集の要約なし
編集の要約なし
 
(同じ利用者による、間の40版が非表示)
10行目: 10行目:
       console.log("nebula_switch: 閲覧モードです");
       console.log("nebula_switch: 閲覧モードです");


      var switch_tag = nebula_switch;
       var parser = new Switch_parser();
       var parser = new Switch_parser();
       if (parser.parse(switch_tag) == false){
       if (parser.parse(document.getElementById("nebula_switch"))){
         console.log(
         if (parser.tag_exists){
           "nebula_switch: 入れ替えタグが異常です"
          console.log(
          + parser.failed_message
            "nebula_switch: 入れ替えタグの解析に成功しました"
        );
          );
 
          nebula_run(parser.doc);
        }else{
           console.log("nebula_switch: 入れ替えタグがありません");
        }
      }else{
        console.log("nebula_switch: 入れ替えタグが異常です");
        nebula_write_error(parser.failed_message);
       }
       }
     
        
        
     }else
     }else
23行目: 31行目:
         "nebula_switch: 閲覧モードでないため、入れ替えは行いません"
         "nebula_switch: 閲覧モードでないため、入れ替えは行いません"
       );
       );
  }else{
    var uri = new URL(window.location.href);
    if (is_view_mode(uri)){
      if (document.getElementById("nebula_switch")){
        uri.searchParams.append("nebula_switch", "");
        document.getElementsByClassName("mw-parser-output")[0].innerHTML
        += "<h2>お知らせ:この記事は、「男女逆にして」表示できます</h2>"
        + "<p>WikiNebula では、女性に対して向けられるべきではないような"
        + "差別や冷遇が、男性に対しては現実に起きてしまっていることを、"
        + "記事として取り上げています。</p>"
        + "<p>そのため、 WikiNebula には、男性が経験するこの種の"
        + "差別や女尊男卑を理解しやすくするために、"
        + "男女の立場を入れ替えて表示する「男女入れ替えスイッチ」"
        + "の機能があります。</p>"
        + "<p>現在、男女入れ替えスイッチが無効になっています。"
        + "有効にするには、<a href='" + uri.toString() +"'>こちら</a>を"
        + "クリックしてください</p>";
      }
    }
   }
   }
}


   function is_view_mode(uri){
   function is_view_mode(uri){
36行目: 65行目:
   }
   }


   var Switch_parser;
   // ES5 なので class 構文は使えない・・・
  function Switch_parser(){
    if (this === null) throw new TypeError();
  }
   Switch_parser.prototype = {
   Switch_parser.prototype = {
     constructor: function(){
     constructor: Switch_parser,
       if (this === null) throw new TypeError();
    parse: function(switch_tag){
       console.log("Switch_parser initialized!");
      // パース成功の真偽値を返却する
     
       if (switch_tag == null){
        this.tag_exists = false;
        return true;
      }
      this.tag_exists = true;
     
      if (!window.DOMParser){
        this.failed_message = "DOMParser が有効ではありません。"
        + "お使いのブラウザで DOMParser を有効にしてください。";
        return false;
      }
     
      var dom_parser = new DOMParser();
      var doc = dom_parser.parseFromString(
        "<root>" + switch_tag.innerText + "</root>", "text/xml"
      );
       var parser_error = doc.querySelector("parsererror");
      if (parser_error){
        this.failed_message = "入れ替えタグに構文エラーがありました\n"
        + parser_error.innerHTML;
        return false;
      }
      this.doc = doc;
      return true;
 
     }
     }
   };
   };


}
  function nebula_write_error(message){
    var content_node =
      document.getElementsByClassName("mw-parser-output")[0];
    content_node.innerHTML =
      "<h1>エラー: 男女入れ替えスイッチでエラー</h1>" + message
    throw new Error("nebula_switch: " + message);
  }
 
  function nebula_run(doc){
    var content_node
    = document.getElementsByClassName("mw-parser-output")[0];
    Array.from(doc.children[0].children).forEach(function(tag){
      if (tag.tagName.toLowerCase() == "replace"){
        var is_syntax_error = !(
            tag.childNodes[0].nodeName == "#text"
          && tag.childNodes[1].nodeName.toLowerCase() == "to"
          && tag.childNodes[2].nodeName == "#text"
          && tag.childNodes.length == 3
        );
        if (is_syntax_error){
          nebula_write_error(
            "次のreplace タグが構文エラーです。<br>"
            + "<code>" + code_escape(tag.outerHTML) + "</code>"
          );
        }
        var before = code_unescape(tag.childNodes[0].nodeValue);
        var after  = code_unescape(tag.childNodes[2].nodeValue);
       
        content_node.innerHTML
        = content_node.innerHTML.replaceAll(before, after);
 
      }
 
      if (tag.tagName.toLowerCase() == "swap"){
        var is_syntax_error = !(
            tag.childNodes[0].nodeName == "#text"
          && tag.childNodes[1].nodeName.toLowerCase() == "for"
          && tag.childNodes[2].nodeName == "#text"
          && tag.childNodes.length == 3
        );
        if (is_syntax_error){
          nebula_write_error(
            "次のreplace タグが構文エラーです。<br>"
            + "<code>" + code_escape(tag.outerHTML) + "</code>"
          );
        }
        var A = code_unescape(tag.childNodes[0].nodeValue);
        var B = code_unescape(tag.childNodes[2].nodeValue);
       
        content_node.innerHTML
        = swap_string(content_node.innerHTML, A, B);
 
      }
    });
 
    var uri = new URL(window.location.href);
    uri.searchParams.delete("nebula_switch");
    content_node.innerHTML
    += "<h2>お知らせ:この記事は、「男女逆にして」表示されています</h2>"
    + "<p>WikiNebula では、女性に対して向けられるべきではないような"
    + "差別や冷遇が、男性に対しては現実に起きてしまっていることを、"
    + "記事として取り上げています。</p>"
    + "<p>そのため、 WikiNebula には、男性が経験するこの種の"
    + "差別や女尊男卑を理解しやすくするために、"
    + "男女の立場を入れ替えて表示する「男女入れ替えスイッチ」"
    + "の機能があります。</p>"
    + "<p>現在、男女入れ替えスイッチが有効になっています。"
    + "無効にするには、<a href='" + uri.toString() +"'>こちら</a>を"
    + "クリックしてください</p>";
 
  }
    function code_escape(code){
      var textarea = document.createElement("textarea");
      textarea.innerText = code;
      return textarea.innerHTML;
    }
 
    function code_unescape(code){
      var textarea = document.createElement("textarea");
      textarea.innerHTML = code;
      return textarea.innerText;
    }
 
    function swap_string(input_string, x, y) {
      // xとyを正規表現の特殊文字からエスケープする
      x = x.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
      y = y.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
 
      // xとyを入れ替える
      var regex = new RegExp('(' + x + '|' + y + ')', 'g');
      var result = input_string.replace(regex, function(match) {
        return match === x ? y : x;
      });
 
      return result;
    }
 


my_switch();
my_switch();

2024年5月2日 (木) 14:20時点における最新版

/* ここにあるすべてのJavaScriptは、すべてのページ読み込みですべての利用者に対して読み込まれます */

function my_switch(){
  var uri = new URL(window.location.href);
  var is_switched = uri.searchParams.get("nebula_switch") != null;
  if (is_switched){
    console.log("nebula_switch: 入れ替え後のページです");

    if (is_view_mode(uri)){
      console.log("nebula_switch: 閲覧モードです");

      var parser = new Switch_parser();
      if (parser.parse(document.getElementById("nebula_switch"))){
        if (parser.tag_exists){
          console.log(
            "nebula_switch: 入れ替えタグの解析に成功しました"
          );

          nebula_run(parser.doc);
        }else{
          console.log("nebula_switch: 入れ替えタグがありません");
        }
      }else{
        console.log("nebula_switch: 入れ替えタグが異常です");
        nebula_write_error(parser.failed_message);
      }
      
      
    }else
      console.log(
        "nebula_switch: 閲覧モードでないため、入れ替えは行いません"
      );
  }else{
    var uri = new URL(window.location.href);
    if (is_view_mode(uri)){
      if (document.getElementById("nebula_switch")){
        uri.searchParams.append("nebula_switch", "");
        document.getElementsByClassName("mw-parser-output")[0].innerHTML
        += "<h2>お知らせ:この記事は、「男女逆にして」表示できます</h2>"
        + "<p>WikiNebula では、女性に対して向けられるべきではないような" 
        + "差別や冷遇が、男性に対しては現実に起きてしまっていることを、"
        + "記事として取り上げています。</p>"
        + "<p>そのため、 WikiNebula には、男性が経験するこの種の" 
        + "差別や女尊男卑を理解しやすくするために、"
        + "男女の立場を入れ替えて表示する「男女入れ替えスイッチ」"
        + "の機能があります。</p>"
        + "<p>現在、男女入れ替えスイッチが無効になっています。"
        + "有効にするには、<a href='" + uri.toString() +"'>こちら</a>を"
        + "クリックしてください</p>";
      }
    }
  }

}

  function is_view_mode(uri){
    var view_tab = document.getElementById("ca-view");
    if (view_tab)
      var is_view_mode_selected
        = view_tab.classList.contains("selected");
    else
      var is_view_mode_selected = false;
    var is_not_ve_edit_mode = uri.searchParams.get("veaction") == null;
    return is_view_mode_selected && is_not_ve_edit_mode;
  }

  // ES5 なので class 構文は使えない・・・
  function Switch_parser(){
    if (this === null) throw new TypeError();
  }
  Switch_parser.prototype = {
    constructor: Switch_parser,
    parse: function(switch_tag){
      // パース成功の真偽値を返却する
      
      if (switch_tag == null){
        this.tag_exists = false;
        return true;
      }
      this.tag_exists = true;
      
      if (!window.DOMParser){
        this.failed_message = "DOMParser が有効ではありません。"
        + "お使いのブラウザで DOMParser を有効にしてください。";
        return false;
      }
      
      var dom_parser = new DOMParser();
      var doc = dom_parser.parseFromString(
        "<root>" + switch_tag.innerText + "</root>", "text/xml"
      );
      var parser_error = doc.querySelector("parsererror");
      if (parser_error){
        this.failed_message = "入れ替えタグに構文エラーがありました\n"
        + parser_error.innerHTML;
        return false;
      }
      this.doc = doc;
      return true;

    }
  };

  function nebula_write_error(message){
    var content_node = 
      document.getElementsByClassName("mw-parser-output")[0];
    content_node.innerHTML = 
      "<h1>エラー: 男女入れ替えスイッチでエラー</h1>" + message
    throw new Error("nebula_switch: " + message);
  }

  function nebula_run(doc){
    var content_node
    = document.getElementsByClassName("mw-parser-output")[0];
    Array.from(doc.children[0].children).forEach(function(tag){
      if (tag.tagName.toLowerCase() == "replace"){
        var is_syntax_error = !(
             tag.childNodes[0].nodeName == "#text"
          && tag.childNodes[1].nodeName.toLowerCase() == "to"
          && tag.childNodes[2].nodeName == "#text"
          && tag.childNodes.length == 3
        );
        if (is_syntax_error){
          nebula_write_error(
            "次のreplace タグが構文エラーです。<br>"
            + "<code>" + code_escape(tag.outerHTML) + "</code>"
          );
        }
        var before = code_unescape(tag.childNodes[0].nodeValue);
        var after  = code_unescape(tag.childNodes[2].nodeValue);
        
        content_node.innerHTML
        = content_node.innerHTML.replaceAll(before, after);

      }

      if (tag.tagName.toLowerCase() == "swap"){
        var is_syntax_error = !(
             tag.childNodes[0].nodeName == "#text"
          && tag.childNodes[1].nodeName.toLowerCase() == "for"
          && tag.childNodes[2].nodeName == "#text"
          && tag.childNodes.length == 3
        );
        if (is_syntax_error){
          nebula_write_error(
            "次のreplace タグが構文エラーです。<br>"
            + "<code>" + code_escape(tag.outerHTML) + "</code>"
          );
        }
        var A = code_unescape(tag.childNodes[0].nodeValue);
        var B = code_unescape(tag.childNodes[2].nodeValue);
        
        content_node.innerHTML
        = swap_string(content_node.innerHTML, A, B);

      }
    });

    var uri = new URL(window.location.href);
    uri.searchParams.delete("nebula_switch");
    content_node.innerHTML
    += "<h2>お知らせ:この記事は、「男女逆にして」表示されています</h2>"
    + "<p>WikiNebula では、女性に対して向けられるべきではないような" 
    + "差別や冷遇が、男性に対しては現実に起きてしまっていることを、"
    + "記事として取り上げています。</p>"
    + "<p>そのため、 WikiNebula には、男性が経験するこの種の" 
    + "差別や女尊男卑を理解しやすくするために、"
    + "男女の立場を入れ替えて表示する「男女入れ替えスイッチ」"
    + "の機能があります。</p>"
    + "<p>現在、男女入れ替えスイッチが有効になっています。"
    + "無効にするには、<a href='" + uri.toString() +"'>こちら</a>を"
    + "クリックしてください</p>";

  }
    function code_escape(code){
      var textarea = document.createElement("textarea");
      textarea.innerText = code;
      return textarea.innerHTML;
    }

    function code_unescape(code){
      var textarea = document.createElement("textarea");
      textarea.innerHTML = code;
      return textarea.innerText;
    }

    function swap_string(input_string, x, y) {
      // xとyを正規表現の特殊文字からエスケープする
      x = x.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
      y = y.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');

      // xとyを入れ替える
      var regex = new RegExp('(' + x + '|' + y + ')', 'g');
      var result = input_string.replace(regex, function(match) {
        return match === x ? y : x;
      });

      return result;
    }


my_switch();