2010-11-25 7 views
2

私は国際的なキーボードの仕組みをエミュレートしようとしています。文字の後にdead keysのいずれかを使用すると、それらを対応する文字に結合します。例えば、`aに入力するとôà^o結果になるだろう、など国際文字(発音記号)を作るために文字を置換する

私は(私は正規表現で吸う!)私の正規表現が適切に動作するように見えることはできませんが、これは私がこれまで持っているものです(demo):あなたがこれと同じことを行うために、より効率的な方法を知っていれば

var txt = "Replacing 'a ^u ~n 'e ^I 'c", 

    combos = { 
     'a': ['à', 'á', 'ä', 'â'], 
     'A': ['À', 'Á', 'Ä', 'Â'], 
     'e': ['è', 'é', 'ë', 'ê'], 
     'E': ['È', 'É', 'Ë', 'Ê'], 
     'i': ['ì', 'í', 'ï', 'î'], 
     'I': ['Ì', 'Í', 'Ï', 'Î'], 
     'o': ['ò', 'ó', 'ö', 'ô'], 
     'O': ['Ò', 'Ó', 'Ö', 'Ô'], 
     'u': ['ù', 'ú', 'ü', 'û'], 
     'U': ['Ù', 'Ú', 'Ü', 'Û'], 
     'y': 'ý', 
     'Y': 'Ý', 
     'c': 'ç', 
     'C': 'Ç', 
     'n': 'ñ', 
     'N': 'Ñ' 
    }, 

    bslash = /`[(aeiou)]/gi, 
    fslash = /\'[(aeiouyc)]/gi, 
    ddots = /\"[(aeiou)]/gi, 
    caret = /\^[(aeiou)]/gi, 
    tidle = /~[(n)]/gi; 

// global match 
if (txt.match(/[`|\'|\"|\^|~][aeiouycn]/i)) { 

    // back slash - replace `a with à 
    if (bslash.test(txt)) { 
     txt = txt.replace(bslash, function(r) { 
      // r contains the `, so remove it with a slice 
      return combos[r.slice(-1)][0]; 
     }); 
    } 

    // forward slash - replace 'a with á, etc 
    if (fslash.test(txt)) { 
     txt = txt.replace(fslash, function(r) { 
      r = r.slice(-1); 
      return (r == 'c' || r == 'y') ? combos[r][0] : combos[r][3]; 
     }); 
    } 

    // double dots - replace `a with à 
    if (ddots.test(txt)) { 
     txt = txt.replace(ddots, function(r) { 
      return combos[r.slice(-1)][4]; 
     }); 
    } 

    // caret - replace ^a with â 
    if (caret.test(txt)) { 
     txt = txt.replace(caret, function(r) { 
      return combos[r.slice(-1)][3]; 
     }); 
    } 

    // tidle - replace ~n with ñ 
    if (tidle.test(txt)) { 
     txt = txt.replace(tidle, function(r) { 
      return combos[r.slice(-1)][0]; 
     }); 
    } 

    document.write(txt); 
} 

また、私はそれを聞くのが大好きです!


私は上記の問題をAefxxの問題点で修正しました - ありがとう!しかし、私はケニーの方法と一緒に行くことに決めました。 :)(updated demo

var txt = "Replacing 'a ^u ~n 'e ^I 'c", 

combos = { 
    '`' :{ a:'à', A:'À', e:'è', E:'È', i:'ì', I:'Ì', o:'ò', O:'Ò', u:'ù', U:'Ù' }, 
    "'" :{ a:'á', A:'Á', e:'é', E:'É', i:'í', I:'Í', o:'ó', O:'Ó', u:'ú', U:'Ú', y:'ý', Y:'Ý', c:'ç', C:'Ç' }, 
    '"' :{ a:'ä', A:'Ä', e:'ë', E:'Ë', i:'ï', I:'Ï', o:'ö', O:'Ö', u:'ü', U:'Ü' }, 
    '^' :{ a:'â', A:'Â', e:'ê', E:'Ê', i:'î', I:'Î', o:'ô', O:'Ô', u:'û', U:'Û' }, 
    '~' :{ n:'ñ', N:'Ñ' } 
}; 

txt = txt.replace(/([`\'~\^\"])([a-z])/ig, function(s, accent, letter){ 
    return (accent in combos) ? combos[accent][letter] || s : s; 
}); 

document.write(txt); 

答えて

1
var txt = "Replacing 'a ^u ~n 'e ^I 'c"; 

var combos = { 
    '^': {a: 'â', A: 'Â', e: 'ê', E: 'Ê', ...}, 
    "'": {a: 'á', ...}, 
    ... 
}; 

return txt.replace(/([`'~^"])([a-z])/ig, function(s, accent, letter){ 
    if (accent in combos) { 
    return combos[accent][letter] || s; 
    } 
    return s; 
} 
+0

ありがとう...アクセントをキーとして使用することを考えましたが、オブジェクトがすでに持っていたものよりも大きくなると思いました。それは清潔であることが分かります:) – Mottie

0

正規表現を使用する必要がありますか?単に文字列全体を調べるほうが簡単です。まあ、それは代わりに手でオートマトンを符号化するが、すでに解決combos

1

[OK]を、問題によって定義されたテーブルを使用するようなものです。あなたはかなりの間違いをしました(私を含む)。割り当てなしの文字列にreplaceを呼び出すことはできません。あなたは野生に置き換えられています。

... 
// Notice the assignment of the replaced text here !!! 
txt = txt.replace(bslash, function(r) { 
     // r contains the `, so remove it with a slice 
     return combos[r.slice(-1)][0]; 
    }); 
+0

ありがとうございました!しかし、ケニーの答えはもっと効率的だから行くつもりだ。私はまだ助けに感謝します! – Mottie

1

より完全なアプローチは、あなたがそれはあなたが言及した特殊記号と、より多くの文字を扱うhttps://github.com/mplatt/fold-to-ascii-js で見つけることができるのApache LuceneのASCII折りたたみアルゴリズムのJavaScriptのポートです。

+0

+1私が取り組んでいたことは、 '^ o'に逆型を入れて'ô'を得ました。それはまだ非常に素晴らしい仕事です!私は私の[tablesorterプロジェクト](http://mottie.github.io/tablesorter/docs/#sortlocalecompare);)にそれを含めてみます。 – Mottie

+0

@Mottieありがとう!私は信用を取ることはできません。置き換えテーブルを作成するという面での "重労働"はすべて、Apache Lucene開発者によって行われています。私はJSにそれを移植していました。 –

関連する問題