User:Srtxg/common.js

From Wikisource
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
// ça n' rote nén avou des variåves locåles...
var cons_min = 'b-df-hj-np-tv-z';
var cons_maj ='B-DF-HJ-NP-TV-Z';
var	cons = cons_min + cons_maj;
var	voy_min = 'aàâåäeéèêëiîïoôöuûü';
var	voy_maj = 'AÀÂÅÄEÉÈÊËIÎÏOÔÖUÛÜ';
var	voy = voy_min + voy_maj;
var char_min = voy_min + cons_min;
var	char_maj = voy_maj + cons_maj;
var	char_mM = char_min + char_maj;

scanilles = {

    container : "#mw-content-text",
    //container : "#wpTextbox1",
    error_count : 0,
    infos : [],
    
	// espace insécable => espace fine
	narrow_whitespace_patterns : [
		[	"([\u00A0])[?!;»]", 
			"Cette $1 devrait être remplacée par une une espace fine (U+202F) pour une typographie soignée." 
		], 
		[	"[«]([\u00A0])",
			"Cette $1 devrait être remplacée par une espace fine (U+202F) pour une typographie soignée."
		]
	],

	whitespace_patterns : [
		[	// espace sécable devant ?!;» => espace fine
			"([\u0020])[?!;»]", 
			"Cette $1 devrait être remplacée par une espace insécable (U+002A) ou une espace fine (U+202F) pour une typographie soignée."
		], 					
		[	// espace sécable ou insécable => espace fine
			"[«]([\u0020])",
			"Cette $1 devrait être remplacée par une espace fine (U+202F) ou une espace fine (U+202F)  pour une typographie soignée."
		],
		[	// (Wallon) espace insécable après ’ => espace sécable
			"[" + char_mM + "]{3,}[’]([\u00A0\u202F])[" + cons + "]", 
			"Cette $1 devrait être remplacée par une espace sécable." 
		],
		[	// (Wallon) espace sécable ou fine après ’ => espace insécable
			// "(ènn'|qu'|<cons>') "
			"\b[EÈè]?[Qqn]?[" + cons + "][’]([\u0020\u202F])", 
			"Cette $1 devrait être remplacée par une espace insécable." 
		],
		[	// (Wallon) espace sécable après un debut de phrase d'une lettre => espace insécable
			//"\b[" + char_maj + "]([\u0020\u202F])", 
			"\b[I]([\u0020\u202F])", 
			"Cette $1 devrait être remplacée par une espace insécable." 
		]
	],

	typo_patterns : [
		[	"[.]{3,}",
			"Les trois points consécutifs « . » (U+002E) devraient êtres replacés par trois points de suspension « … » (U+2026)"
		],		
		[	"'",
			"Cette apostrophe droite « ' » (U+0027) devrait être remplacée par une apostrophe courbe « ’ » (U+2019)."
		],
		[	"‘",
			"Ce caractère « ‘ » (U+2018) n'est pas une apostrophe courbe « ’ » (U+2019)."
		],			
		[	"[!:,;?][,;.]+",
			"Cette succession de signes de poncuation semble étrange."
		],
		[	"[" + char_min + "][:!?;]",
			"Une espace insécable (U+00A0) devrait précéder un signe de ponctuation bipoints."
		],		
		[	"[!?;:.,][" + char_mM + "]",
			"Une espace sécable (U+0020) est attendu après un signe de ponctuation."
		],
		[	"[\u0020\u00A0][.,]",
			"Il ne devrait pas y avoir d'espace à cet endroit."
		],
		[	"\u0020(1e[^r]|[!1][a]|1[^e0-9][^r0-9])",
			"Il s'agit probablement d'un L minuscule, et non du chiffre 1."
		],
		[	"([^\u0020\u00A0\nst]—|—[^\u0020\u00A0\ntia])",
			"Une espace est attendue à cet endroit."
		],
		[	"([\u0020]-|-[\u0020])",
			"Aucune espace est attendue à cet endroit."
		],
		[	"([st]—[tia])",
			"Un tiret est attendue à cet endroit."
		],
				
	],    
  
    precompile_regexp : function (search, group, multi_line) {
        var ml = (multi_line)?"m":"";
        var temp = [];
        var search_r="";
                     
        for (var i in search){
			search_r = search[i];
            if (typeof(search_r) === 'object')
            {
				if(scanilles.infos[(group+'-'+i)] === undefined){
					scanilles.infos[(group+'-'+i)] = search[i][1];
				}
				
				search_r = search_r[0];
			}
            temp.push([new RegExp(search_r, ml), i]);
        }
        return temp;
    },

    match : function (text, regexp) {
        var m = text.match(regexp);
        if (m) {
            var i = (m[1]!==undefined)?1:0;
     
            var start_match = text.search(regexp)+(m[0].search(m[i]));
            var end_match = start_match + m[i].length;
            
            return [ start_match, end_match, m[i] ];
        }
        return null;
    },

    change_text_node : function(el, search, first, group) {
        
        var info = "";
        var regex = "";
        
        for (var cur = first; cur < search.length; ++cur) {
            			
			regex = search[cur][0];
			info = search[cur][1];            
            var match = this.match(el.nodeValue, regex);
            if (match) {
                               
                var tail = $(el).clone()[0];
                el.nodeValue = el.nodeValue.substring(0, match[0]);
                tail.nodeValue = tail.nodeValue.substring(match[1]);
				
                var data_unicode = "";
                if (match[2] == "\x20"){
					data_unicode = "U+0020";
					match[2] = "_"; // préserver une fausse espace
				}
				else if (match[2] == " "){
					data_unicode = "U+00A0";
				}
				else if (match[2] == "\u202F"){
					data_unicode = "U+202F";
				}
					
				if(data_unicode!=="")
					data_unicode = 'data-unicode="'+data_unicode+'"';
                
                // FIXME: how to setup the text part of the span w/o injecting it in html ?
                $(el).after(tail).after($('<span class="rix '+group+'" data-rixid="'+group+'-'+info+'"'+data_unicode+'>' + match[2] + '</span>'));
                
				scanilles.error_count++;
                scanilles.change_text_node(el, search, cur + 1, group);
                scanilles.change_text_node(tail, search, cur, group);
            }
        }
    },
    
    filter_page : function() {
        
        if (mw.config.get('wgNamespaceNumber') !== 104 )
            return false;
		
        return true;
    },

    filter_node : function() {
        if ($(this).parent().hasClass('rix'))
            return false;
        return this.nodeType == 3;
    },

    get_text_nodes : function () {
        var content_id = scanilles.container;
        if ($("#wikiPreview").length)
            content_id = "#wikiPreview";
        
        return $(content_id)
                   .find("*")
                   .contents()
                   .filter(scanilles.filter_node);
    },

    exec : function(user_filter, search, group, multi_line) {
		if (multi_line === undefined)
			multi_line = false;
								
        if (!scanilles.filter_page())
            return;
                    
        search = scanilles.precompile_regexp(search, group, multi_line);        
		var text_nodes = scanilles.get_text_nodes();
		
		$.each(text_nodes, function(i, el) {
			scanilles.change_text_node(el, search, 0, group);
		});
				 
    },
               
    tip : function (){
		$(".rix").hover(function(){
			var i = $(this).data('rixid');
			if(scanilles.infos[i] === undefined){
				return;
			}
			
			var rep = $(this).text();
			
			if ($(this).data('unicode')!==undefined)
				rep = $(this).data('unicode');
			
			switch(rep){
				case "U+0020" : 
					rep = "espace sécable (U+0020)"; break;
				case "U+00A0" :
					rep = "espace insécable (U+00A0)"; break;
				case "U+202F" :
					rep = "espace fine (U+202F)"; break;
				default : rep = "« "+rep+" »"
			}
			
			info = scanilles.infos[i].replace('$1', rep);
			
			var rixinfo = $('<span>',{
				class : "rix-info"
			}).html(info);
		
			$(this).append(rixinfo);
		},function(){$(".rix-info").remove();});
    },
    
    default_select : function(){
		console.log('Chargement de Scanilles');
        scanilles.exec(/.*/, scanilles.narrow_whitespace_patterns, 'narrowwhitespace');
		scanilles.exec(/.*/, scanilles.whitespace_patterns, 'whitespace');
        scanilles.exec(/.*/, scanilles.typo_patterns , 'scanille');
        
        scanilles.tip();
	},
};

$(document).ready(scanilles.default_select());