Django

Code

Show
Ignore:
Timestamp:
07/04/07 04:28:29 (2 years ago)
Author:
mtredinnick
Message:

unicode: Added unicode-aware slugify filter (in Python) and better non-ASCII
handling for the Javascript slug creator in admin. Can never be perfect here,
but this is more tolerant in many cases. Fixed #4365. Thanks, Bill de hÓra,
Baptiste, orestis@orestis.gr, Ahmet and Jonas for contributions to this.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/unicode/django/contrib/admin/media/js/urlify.js

    r4537 r5608  
     1var LATIN_MAP = 
     2{ 
     3    'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE', 'Ç': 
     4    'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I', 'Î': 'I', 
     5    'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O', 'Õ': 'O', 'Ö': 
     6    'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U', 'Ü': 'U', 'Ý': 'Y', 'Þ': 'TH', 
     7    'ß': 'ss', 'à':'a', 'á':'a', 'â': 'a', 'ã': 'a', 'ä': 'a', 'å': 'a', 'æ': 
     8    'ae', 'ç': 'c', 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e', 'ì': 'i', 'í': 'i', 
     9    'î': 'i', 'ï': 'i', 'ð': 'o', 'ñ': 'n', 'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 
     10    'o', 'ö': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u', 'û': 'u', 'ü': 'u', 'ý': 'y', 
     11    'þ': 'th', 'ÿ': 'y', 
     12} 
     13var LATIN_SYMBOLS_MAP = 
     14{ 
     15    '©':'(c)', 
     16} 
     17var GREEK_MAP = 
     18{ 
     19    'α':'a', 'β':'b', 'γ':'g', 'δ':'d', 'ε':'e', 'ζ':'z', 'η':'h', 'θ':'8', 
     20    'ι':'i', 'κ':'k', 'λ':'l', 'μ':'m', 'ν':'n', 'ξ':'3', 'ο':'o', 'π':'p', 
     21    'ρ':'r', 'σ':'s', 'τ':'t', 'υ':'y', 'φ':'f', 'χ':'x', 'ψ':'ps', 'ω':'w', 
     22    'ά':'a', 'έ':'e', 'ί':'i', 'ό':'o', 'ύ':'y', 'ή':'h', 'ώ':'w', 'ς':'s', 
     23    'ϊ':'i', 'ΰ':'y', 'ϋ':'y', 'ΐ':'i', 
     24    'Α':'A', 'Β':'B', 'Γ':'G', 'Δ':'D', 'Ε':'E', 'Ζ':'Z', 'Η':'H', 'Θ':'8', 
     25    'Ι':'I', 'Κ':'K', 'Λ':'L', 'Μ':'M', 'Ν':'N', 'Ξ':'3', 'Ο':'O', 'Π':'P', 
     26    'Ρ':'R', 'Σ':'S', 'Τ':'T', 'Υ':'Y', 'Φ':'F', 'Χ':'X', 'Ψ':'PS', 'Ω':'W', 
     27    'Ά':'A', 'Έ':'E', 'Ί':'I', 'Ό':'O', 'Ύ':'Y', 'Ή':'H', 'Ώ':'W', 'Ϊ':'I', 
     28    'Ϋ':'Y' 
     29} 
     30var TURKISH_MAP = { 
     31    'ş':'s', 'Ş':'S', 'ı':'i', 'İ':'I', 'ç':'c', 'Ç':'C', 'ü':'u', 'Ü':'U', 
     32    'ö':'o', 'Ö':'O', 'ğ':'g', 'Ğ':'G', 
     33} 
     34// var RUSSIAN_MAP = 
     35// { 
     36// } 
     37 
     38var ALL_DOWNCODE_MAPS=new Array() 
     39ALL_DOWNCODE_MAPS[0]=LATIN_MAP 
     40ALL_DOWNCODE_MAPS[1]=LATIN_SYMBOLS_MAP 
     41ALL_DOWNCODE_MAPS[2]=GREEK_MAP 
     42ALL_DOWNCODE_MAPS[3]=TURKISH_MAP 
     43//ALL_DOWNCODE_MAPS[4]=RUSSIAN_MAP 
     44 
     45var Downcoder = new Object(); 
     46Downcoder.Initialize = function() 
     47{ 
     48    if (Downcoder.map) // already made 
     49        return ; 
     50    Downcoder.map ={} 
     51    Downcoder.chars = '' ; 
     52    for(var i in ALL_DOWNCODE_MAPS) 
     53    { 
     54        var lookup = ALL_DOWNCODE_MAPS[i] 
     55        for (var c in lookup) 
     56        { 
     57            Downcoder.map[c] = lookup[c] ; 
     58            Downcoder.chars += c ; 
     59        } 
     60     } 
     61    Downcoder.regex = new RegExp('[' + Downcoder.chars + ']|[^' + Downcoder.chars + ']+','g') ; 
     62} 
     63 
     64downcode= function( slug ) 
     65{ 
     66    Downcoder.Initialize() ; 
     67    var downcoded ="" 
     68    var pieces = slug.match(Downcoder.regex); 
     69    if(pieces) 
     70    { 
     71        for (var i = 0 ; i < pieces.length ; i++) 
     72        { 
     73            if (pieces[i].length == 1) 
     74            { 
     75                var mapped = Downcoder.map[pieces[i]] ; 
     76                if (mapped != null) 
     77                { 
     78                    downcoded+=mapped; 
     79                    continue ; 
     80                } 
     81            } 
     82            downcoded+=pieces[i]; 
     83        } 
     84    } 
     85    else 
     86    { 
     87        downcoded = slug; 
     88    } 
     89    return downcoded; 
     90} 
     91 
     92 
    193function URLify(s, num_chars) { 
    294    // changes, e.g., "Petty theft" to "petty_theft" 
    395    // remove all these words from the string before urlifying 
     96    s = downcode(s); 
    497    removelist = ["a", "an", "as", "at", "before", "but", "by", "for", "from", 
    598                  "is", "in", "into", "like", "of", "off", "on", "onto", "per", 
     
    8101    r = new RegExp('\\b(' + removelist.join('|') + ')\\b', 'gi'); 
    9102    s = s.replace(r, ''); 
     103    // if downcode doesn't hit, the char will be stripped here 
    10104    s = s.replace(/[^-\w\s]/g, '');  // remove unneeded chars 
    11105    s = s.replace(/^\s+|\s+$/g, ''); // trim leading/trailing spaces 
     
    14108    return s.substring(0, num_chars);// trim to first num_chars chars 
    15109} 
     110