跳至内容

MediaWiki:Gadget-wkcategorize.js

来自维基文库,一个开放世界的开放书库
注意:保存后,更改可能不会立即生效。点击此处了解如何绕过浏览器的缓存。
  • Mozilla/Firefox/Safari:按住Shift并点击重新加载,或按Ctrl-Shift-R(Apple Mac 上为 Cmd-Shift-R);
  • Internet Explorer:按住Ctrl并点击刷新,或按Ctrl-F5
  • Konqueror:只需点击重新加载按钮,或按F5
  • Opera用户可能需要在工具→首选项中完全清除他们的缓存。
var cg = {
  version:   2.06,
  require:   2.64,
  textspan: "WKCGSpan",
  editspan: "WKCGFormSpanEdit",
  statspan: "WKCGStatSpan",
  formspan: "WKCGFormSpan"
}
cg.tags = "";
cg.notes = "";
cg.subjects = new Array(
  ["opt",                     "Computing"],
  ["Software (general)",      "Computer software"],
  ["Programming Language",    "Programming language"],
  ["Business Software",       "Computer software"],
  ["Computer Science",        "Computer science"],
  ["Operating Systems",       "Computer software"],
  ["Computer Graphics",       "Computer science"],
  ["Information Technology",  "Information technology"],
  ["Meta Languages",          "Domain-specific languages"],
 
  ["opt",                     "Engineering"],
  ["Engineering (general)",   "Engineering"],
  ["Electrical Engineering",  "Electrical Engineering"],
  ["Computer Engineering",    "Computer Engineering"],
  ["Elec / Comp Engineering", "Electrical Engineering|Computer Engineering"],
  ["Mechanical Engineering",  "Mechanical Engineering"],
  ["Civil Engineering",       "Civil Engineering"],
  ["Chemical Engineering",    "Chemical Engineering"],
 
  ["opt",                     "Science and Technology"],
  ["Science (general)",       "Science"],
  ["Physics",                 "Physics"],
  ["Medicine",                "Health science"],
  ["Technology",              "Technology"],
  ["Biology",                 "Biology"],
  ["Life Science",            "Life Science"],
  ["Mathematics",             "Mathematics"],
  ["Chemistry",               "Chemistry"], 
  ["Earth Sciences",          "Earth Sciences"],
  ["Environmental Science",   "Environmental Science"],
 
  ["opt",                     "Arts and Humanities"],
  ["Art",                     "Arts"],
  ["Music",                   "Music"],
  ["Architecture",            "Architecture"],
  ["Education",               "Education"],
  ["Languages",               "Languages"],
  ["English and Literature",  "Language and literature"],
  ["Philosophy",              "Philosophy"],
  ["Psychology",              "Social Sciences"], 
  ["Religion",                "Religion"],
  ["Geography",               "Humanities"],
 
  ["opt",                     "Social sciences"],
  ["History (general)",       "History"],
  ["History (usa)",           "History"],
  ["Business and Economics",  "Business and economics"],
  ["Law",                     "Law"],
  ["Social Science",          "Social sciences"],
  ["Agriculture",             "Social sciences"],
  ["Political Science",       "Political Science"],
  ["Military Science",        "Military science"],
  ["Naval Science",           "Naval science"],
 
  ["opt",                     "Miscellaneous"],
  ["Games and Athletics",     "Games and athletics"],
  ["How To",                  "How-tos"],
  ["Study Guides",            "Study guides"],
  ["Help",                    "Help"],
  ["Misc",                    "Miscellaneous"]
);

cg._form = null;
cg.getForm = function() {
  if(cg._form == null) cg.createForm();
  return cg._form;
}
cg.bookName = "";
cg.getBookName = function() {
  cg.bookName = cg._booknameB.value;
  return cg.bookName;
}

cg.makeOptgroup = function (parent, i) {
  for( ; i < cg.subjects.length; i++) {
    if(cg.subjects[i][0] == "opt") return i - 1;
    else {
      parent.appendChild(wk.makeElement("option", {value:i}, cg.subjects[i][0]));
    }
  }
  return i;
}

cg.makeSubjectSelect = function(num, multi) {
  var s = (num == null)?(1):(num);
  cg._subjectB = wk.makeElement("select", {id:"WKCGSubjectB", size:s, name:"WKCGSubjectB"});
  if(multi) {
    cg._subjectB.multiple = true;
  }
  for(i = 0; i < cg.subjects.length; i++) {
    if(cg.subjects[i][0] == "opt") {
      var node = wk.makeElement("optgroup", {label:cg.subjects[i][1]});
      i = cg.makeOptgroup(node, i + 1);
      cg._subjectB.appendChild(node);
    } else {
      var node = wk.makeElement("option", {value:i}, subjects[i][0]);
      cg._subjectB.appendChild(node);
    }
  }
  return cg._subjectB;
}

cg.writeCats = function (subject, bookname) {
  var temp = "{" + "{Subject|" + subject[1] + "}}\n";
  if(bookname == "") temp += "{" + "{Alphabetical}}\n";
  else temp += "{" + "{Alphabetical|" + bookname.substr(0, 1) + "}}";
  return temp;
}

cg.createForm = function() {
  var div = wk.spanText(cg.formspan, "");
  if(div == null) return;
  cg._displayB = wk.makeButton("WKCGDisplayB",    "Display",    cg.display);
  cg._editB = wk.makeButton("WKCGEditB",          "Edit",       cg.edit);
  cg._booknameB = wk.makeInput("WKCGBookNameB", "")
  cg._form = wk.makeElement("form", {name:"WKCGFormB", method:"GET"}, [
    cg._booknameB,
    " ",
    cg.makeSubjectSelect(),
    wk.makeButton("WKCGCategorizeB", "Categorize", cg.categorize),
    " ",
    cg._displayB,
    cg._editB,
    wk.makeButton("WKCGClearB",      "Clear",      cg.clear)
  ]);
  wk.toggleDisable(cg._displayB, true);
  wk.toggleDisable(cg._editB, true);
  div.appendChild(cg._form);
}
if(typeof wk == 'object' && wk.testVersion(cg.require)) {
  $(cg.createForm);
}

cg.clear = function() {
  wk.toggleDisable(cg._displayB, true);
  wk.toggleDisable(cg._editB,    true);
  wk.spanText(cg.textspan, "");
  wk.spanText(cg.statspan, "");
}

cg.categorize = function () {
  cg.clear();
  cg.getBookName();
  var form = cg.getForm();
  var select = cg._subjectB;
  var index = select.options[select.selectedIndex].value;
  var subject = cg.subjects[index];
  cg.tags = cg.writeCats(subject, cg.bookName);
  cg.notes = "<b>Notes:</b><br><ul>" +
    "<li>These are the templates necessary to categorize your book as being \"" + 
    "<b>" + subject[0] + "</b>\"";
  cg.notes = cg.notes + "</ul>";
  wk.toggleDisable(cg._displayB, false);
  wk.toggleDisable(cg._editB, false);
  wk.spanText(cg.statspan, "Created categories for [[" +
    ((cg.bookName == "")?("Unknown Book"):(wk.wikiLinkText(cg.bookName))) +
    "]]. Click <b>Display</b> to see the created category templates. " +
    "Click <b>Edit</b> to display an edit window and save changes.");
}

cg.display = function() {
  wk.spanText(cg.textspan, 
    "<table width=\"100%\"><tr><td width=\"50%\" valign=\"top\">" +
    "<b>Categorization Templates:</b><br>" +
    "<pre>" + cg.tags + "</pre>" + 
    "</td><td valign=\"top\">" +
    cg.notes + "</td></tr></table>");
  if(cg.getBookName() == "") {
    wk.spanText(cg.statspan, 
      "These are the categorization templates for your book. " +
      "Copy and Paste these templates into your book.");
  } else {
    wk.spanText(cg.statspan, 
      "These are the categorization templates for [[" +
      wk.wikiLinkText(cg.bookName) +
      "]]. Copy and Paste these templates into your book, or click " +
      "<b>Edit</b> to display an edit window and save these changes.");
  }
}

cg.edit = function() { 
  if(cg.getBookName() == "") {
    setSpanText(cg.statspan, "You must enter a valid book name to <b>Edit</b>");
    return;  
  }
  wk.spanText(cg.statspan, "Loading edit window...");
  wk.loadEditPage(cg.bookName, function(xml) {
    var editform = wk.showEditWindow(xml, cg.textspan);
    var temp = editform.text.value;
    if(temp.length < 20) {
      wk.spanText(cg.statspan, "The page [[" +
        wk.wikiLinkText(cg.bookName) +
        "]] does not exist or is not a proper book table of contents (TOC). " +
        "You should only categorize proper book pages or " +
        "TOCs. Double-check the spelling of the title, if the page is supposed " +
        "to exist. If the book does not yet exist, create it first with Whiteknight's " +
        wk.wikiLinkText("User:Whiteknight/Book Designer Gadget", "Book Designer Gadget") +
        ".");
      wk.spanText(cg.textspan, "");
      return;
    }
    editform.summary.value = cg.bookName + 
      ": Autocategorizing using Whiteknight's Categorization Gadget";
    temp = temp.replace(/\{\{cleanup-link\}\}\n*/gi, "");
    temp = temp.replace(/\{\{(alphabetical|DDC|LOC|Shelf)([^\}])*\}\}/gi, "");
    temp = temp.replace(/\{\{(software|programming language|business software|computer science|operating systems|computer graphics)\}\}/gi, "");
    temp = temp.replace(/\n\n\n+/g, "\n\n");
    editform.text.value = temp + "\n" + cg.tags;
    wk.spanText(cg.statspan, 
      "You are editing the text for [[" +
      wk.wikiLinkText(cg.bookName) +
      "]]. The categorization templates have been appended to the end of the page. " +
      "Make sure that the text is correct, and then click <b>Save Page</b>."
    );
  });
}

cg.createForm2 = function() {
  var div = document.getElementById(cg.editspan);
  if(div == null) return;
  wk.toggleDisplay(div, "block");
  cg.bookName = div.innerHTML;
  cg._booknameB = wk.makeElement("input", {type:"hidden", id:"WKCGBookNameB", value:cg.bookName})
  cg._form = wk.makeElement("form", {name:"WKCGFormB", method:"GET"}, [
    cg._booknameB,
    cg.makeSubjectSelect(),
    wk.makeButton("WKCGCategorizeB", "Categorize", cg.categorize2)
  ]);
  div.appendChild(cg._form);
}
if(typeof wk == "object" && wk.testVersion(cg.require)) {
  $(cg.createForm2);
}

cg.categorize2 = function() {
  cg.getBookName();
  var select = cg._subjectB;
  var index = select.options[select.selectedIndex].value;
  tags = cg.writeCats(cg.subjects[index], cg.bookName);
  var editwin = document.getElementById("wpTextbox1");
  if(editwin) {
    var temp = editwin.value;
    temp = temp.replace(/\{\{(Alphabetical|DDC|LOC|UDC|Shelf|Subject)([^\}])*\}\}/gi, "");
    temp = temp.replace(/\{\{(software|programming language|business software|computer science|operating systems|computer graphics|engineering)\}\}/gi, "");
    temp = temp.replace(/\n\n\n+/g, "\n\n");
    editwin.value = temp + "\n" + tags;
  }
}

cg.returnAllSelected = function () {
  var subjects = cg._subjectB;
  var opts = new Array();
  for(var i = 0; i < subjects.options.length; i++) {
    if(subjects.options[i].selected) {
      var index = subjects.options[i].value;
      opts.push(cg.subjects[index][1]);
    }
  }
  return opts;
}

cg.getItemIndex = function (item) {
  for(var i = 0; i < cg.subjects.length; i++) {
    if(cg.subjects[i][0] == 'opt') continue;
    if(cg.subjects[i][0] == item) return i;
    if(cg.subjects[i][1] == item) return i;
  }
  return 0;
}

cg.setItemSelected = function(value) {
  for(var i = 0; i < cg._subjectB.options.length; i++) {
    if(cg._subjectB.options[i].value == value) {
      cg._subjectB.options[i].selected = true;
      return i;
    }
  }
  return 0;
}

cg.setSelected = function(opts) {
  var subjects = cg._subjectB;
  var index = 0;
  for(var i = 0; i < opts.length; i++) {
    if(typeof opts[i] == 'string') {
      index = cg.getItemIndex(opts[i]);
    } else {
      index = opts[i];
    }     
    cg.setItemSelected(index);
  }
}
华夏公益教科书