User:Dinoguy1000/scripts/fullwidth2ascii.js
Appearance
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
Documentation for this user script can be added at User:Dinoguy1000/scripts/fullwidth2ascii. |
/***********************************************************************
* *
* [[en:User:Dinoguy1000/scripts/fullwidth2ascii.js]] *
* *
* Replaces all instances of ASCII fullwidth characters with *
* their original ASCII counterparts, according to the list *
* at [[en:User:Dinoguy1000/Cheatsheet#Fullwidth character table]]. *
* *
* Framework shamelessly ripped from [[en:User:Drilnoth/codefixer.js]] *
* *
* Spinoff stuff (try to keep everything in sync): *
* - [[Wikipedia:AutoEd/fullwidth.js]] *
* - [[User:TheFarix/AWB/scripts/FullwidthReplacer]] *
* *
***********************************************************************/
function fullwidthReplacer() { //MAIN FUNCTION describes list of fixes
var txt = document.editform.wpTextbox1;
//replace
//Common punctuation
txt.value = txt.value.replace(/ /g, ' '); //fullwidth space
//txt.value = txt.value.replace(/・/g, '·'); //fullwidth interpunct
txt.value = txt.value.replace(/。/g, '.'); //replace ideographic period with a regular period (from TheFarix's AWB cleanup module)
//txt.value = txt.value.replace(/・・・/g, '...'); //three interpuncts normally mean an ellipsis
//txt.value = txt.value.replace(/···/g, '...'); //catch already converted triple interpuncts - it's after the interpunct rule so we only need one go-through to catch partial replacements
txt.value = txt.value.replace(/…/g, '...'); //it's a little ballsy, I guess, but we're already doing lots of replacements, so... (see also [[WP:ELLIPSES]])
txt.value = txt.value.replace(/!/g, '!');
txt.value = txt.value.replace(/(/g, '(');
txt.value = txt.value.replace(/)/g, ')');
txt.value = txt.value.replace(/?/g, '?');
//Numbers
txt.value = txt.value.replace(/0/g, '0');
txt.value = txt.value.replace(/1/g, '1');
txt.value = txt.value.replace(/2/g, '2');
txt.value = txt.value.replace(/3/g, '3');
txt.value = txt.value.replace(/4/g, '4');
txt.value = txt.value.replace(/5/g, '5');
txt.value = txt.value.replace(/6/g, '6');
txt.value = txt.value.replace(/7/g, '7');
txt.value = txt.value.replace(/8/g, '8');
txt.value = txt.value.replace(/9/g, '9');
//Latin letters, uppercase
txt.value = txt.value.replace(/A/g, 'Α');
txt.value = txt.value.replace(/B/g, 'B');
txt.value = txt.value.replace(/C/g, 'C');
txt.value = txt.value.replace(/D/g, 'D');
txt.value = txt.value.replace(/E/g, 'E');
txt.value = txt.value.replace(/F/g, 'F');
txt.value = txt.value.replace(/G/g, 'G');
txt.value = txt.value.replace(/H/g, 'H');
txt.value = txt.value.replace(/I/g, 'I');
txt.value = txt.value.replace(/J/g, 'J');
txt.value = txt.value.replace(/K/g, 'K');
txt.value = txt.value.replace(/L/g, 'L');
txt.value = txt.value.replace(/M/g, 'M');
txt.value = txt.value.replace(/N/g, 'N');
txt.value = txt.value.replace(/O/g, 'O');
txt.value = txt.value.replace(/P/g, 'P');
txt.value = txt.value.replace(/Q/g, 'Q');
txt.value = txt.value.replace(/R/g, 'R');
txt.value = txt.value.replace(/S/g, 'S');
txt.value = txt.value.replace(/T/g, 'T');
txt.value = txt.value.replace(/U/g, 'U');
txt.value = txt.value.replace(/V/g, 'V');
txt.value = txt.value.replace(/W/g, 'W');
txt.value = txt.value.replace(/X/g, 'X');
txt.value = txt.value.replace(/Y/g, 'Y');
txt.value = txt.value.replace(/Z/g, 'Z');
//Latin letters, lowercase
txt.value = txt.value.replace(/a/g, 'a');
txt.value = txt.value.replace(/b/g, 'b');
txt.value = txt.value.replace(/c/g, 'c');
txt.value = txt.value.replace(/d/g, 'd');
txt.value = txt.value.replace(/e/g, 'e');
txt.value = txt.value.replace(/f/g, 'f');
txt.value = txt.value.replace(/g/g, 'g');
txt.value = txt.value.replace(/h/g, 'h');
txt.value = txt.value.replace(/i/g, 'i');
txt.value = txt.value.replace(/j/g, 'j');
txt.value = txt.value.replace(/k/g, 'k');
txt.value = txt.value.replace(/l/g, 'l');
txt.value = txt.value.replace(/m/g, 'm');
txt.value = txt.value.replace(/n/g, 'n');
txt.value = txt.value.replace(/o/g, 'o');
txt.value = txt.value.replace(/p/g, 'p');
txt.value = txt.value.replace(/q/g, 'q');
txt.value = txt.value.replace(/r/g, 'r');
txt.value = txt.value.replace(/s/g, 's');
txt.value = txt.value.replace(/t/g, 't');
txt.value = txt.value.replace(/u/g, 'u');
txt.value = txt.value.replace(/v/g, 'v');
txt.value = txt.value.replace(/w/g, 'w');
txt.value = txt.value.replace(/x/g, 'x');
txt.value = txt.value.replace(/y/g, 'y');
txt.value = txt.value.replace(/z/g, 'z');
//Other punctuation
txt.value = txt.value.replace(/"/g, '"');
txt.value = txt.value.replace(/#/g, '#');
txt.value = txt.value.replace(/$/g, '$');
txt.value = txt.value.replace(/%/g, '%');
txt.value = txt.value.replace(/&/g, '&');
txt.value = txt.value.replace(/'/g, '\'');
txt.value = txt.value.replace(/*/g, '*');
txt.value = txt.value.replace(/+/g, '+');
txt.value = txt.value.replace(/,/g, ', ');
//txt.value = txt.value.replace(/、/g, ', '); //replace ideographic comma with a regular comma (from TheFarix's AWB cleanup module)
txt.value = txt.value.replace(/-/g, '-');
txt.value = txt.value.replace(/./g, '. ');
txt.value = txt.value.replace(///g, '\/');
txt.value = txt.value.replace(/:/g, ': ');
txt.value = txt.value.replace(/;/g, '; ');
txt.value = txt.value.replace(/</g, '<');
txt.value = txt.value.replace(/=/g, '='); //this replacement could break template usage, use {{=}} as an alternative inside templates
txt.value = txt.value.replace(/>/g, '>');
txt.value = txt.value.replace(/@/g, '@');
txt.value = txt.value.replace(/[/g, '['); //this replacement could break wikimarkup usage
txt.value = txt.value.replace(/\/g, '\\');
txt.value = txt.value.replace(/]/g, ']'); //this replacement could break wikimarkup usage
txt.value = txt.value.replace(/^/g, '^');
txt.value = txt.value.replace(/_/g, '_');
txt.value = txt.value.replace(/`/g, '`');
txt.value = txt.value.replace(/{/g, '{'); //this replacement could break wikimarkup usage, use {{(}} as an alternative
txt.value = txt.value.replace(/|/g, '|'); //this replacement could break template usage, use {{!}} as an alternative inside templates
txt.value = txt.value.replace(/}/g, '}'); //this replacement could break wikimarkup usage, use {{)}} as an alternative
txt.value = txt.value.replace(/~/g, '〜'); //ASCII tilde is, apparently, treated as a diacritic in some fonts, so this should be a better replacement
txt.value = txt.value.replace(/¢/g, '¢');
txt.value = txt.value.replace(/£/g, '£');
txt.value = txt.value.replace(/¬/g, '¬');
txt.value = txt.value.replace(/¦/g, '¦');
txt.value = txt.value.replace(/¥/g, '¥');
txt.value = txt.value.replace(/₩/g, '₩');
txt.value = txt.value.replace(/│/g, '│');
txt.value = txt.value.replace(/←/g, '←');
txt.value = txt.value.replace(/↑/g, '↑');
txt.value = txt.value.replace(/→/g, '→');
txt.value = txt.value.replace(/↓/g, '↓');
txt.value = txt.value.replace(/■/g, '■');
txt.value = txt.value.replace(/○/g, '○');
txt.value = txt.value.replace(/『/g, '「'); //some Japanese quote replacement (from TheFarix's AWB cleanup module)
txt.value = txt.value.replace(/』/g, '」'); //some Japanese quote replacement (from TheFarix's AWB cleanup module)
}
function fullwidthReplacerStartInEdit() { //Initiates fullwidthReplacer if you are already in edit mode
fullwidthReplacer();
// Add a tag to the summary box
var txt = document.editform.wpSummary;
var summary = "replaced fullwidth chars with ASCII equivalents ([[User:Dinoguy1000/scripts/fullwidth2ascii.js|FullwidthReplacer]])";
if (txt.value.indexOf(summary) == -1) {
if (txt.value.match(/[^\*\/\s][^\/\s]?\s*$/)) {
txt.value += "; ";
}
txt.value += summary;
}
document.editform.wpDiff.click()
}
if(queryString('fullwidthReplacerStartFromView')) $(function() { fullwidthReplacerStartFromView(); }) //Part of next function
function fullwidthReplacerStartFromView() { //Initiates FullwidthReplacer if you are viewing the article without currently editing it
var txt = document.getElementById('wpTextbox1');
if(!txt) return;
fullwidthReplacer();
document.getElementById('wpSummary').value += 'Replaced fullwidth chars with ASCII equivalents using [[User:Dinoguy1000/scripts/fullwidth2ascii.js|FullwidthReplacer]]';
document.editform.wpDiff.click()
}
function queryString(p) { //Allows URI to be properly decoded so that fullwidthReplacerStartFromView() works properly
var re = RegExp('[&?]' + p + '=([^&]*)');
var matches;
if (matches = re.exec(document.location)) {
try {
return decodeURI(matches[1]);
} catch (e) {
}
}
return null;
}
$(function () { //Adds "replace fullwidth" tabs to page.
if(mw.config.get("wgNamespaceNumber") == 0 || mw.config.get("wgNamespaceNumber") == 2) {
if(document.forms.editform) {
mw.util.addPortletLink('p-cactions', 'javascript:fullwidthReplacerStartInEdit()', 'replace fullwidth', 'ca-fullwidthreplaceredit', 'Replaces fullwidth ASCII characters with their ASCII equivalents', '', document.getElementById('ca-talk'));
}
if(mw.config.get("wgAction") == "view"){
var url = mw.config.get("wgServer") + mw.config.get("wgScript") + '?title=' + encodeURIComponent(mw.config.get("wgPageName")) + '&action=edit';
mw.util.addPortletLink('p-cactions', url + '&fullwidthReplacerStartFromView=true', 'replace fullwidth', 'ca-fullwidthreplacerview', 'Replaces fullwidth ASCII characters with their ASCII equivalents'), '', document.getElementById('ca-talk');
}
}
});