1

<!DOCTYPE html>
<html>
  <head>
    <script src="http://cdn.ckeditor.com/4.6.2/standard/ckeditor.js"></script>
  </head>

  <body>
	<textarea name="editorUrdu"></textarea>
	<script>
		CKEDITOR.plugins.addExternal( 'easykeymap', '/ckeditor/plugins/easykeymap', 'plugin.js' );
		CKEDITOR.replace( 'editorUrdu',{
			extraPlugins: 'easykeymap',
			contentsLangDirection: 'rtl'
		});
	</script>
  </body>
</html>

/**
 * This work is mine, and yours. You can modify it as you wish.
 * @Author: Roni Saha<roni.cse@gmail.com>
 *
 * This source file is subject to the MIT license that is bundled
 * with this source code in the file LICENSE.
 */

CKEDITOR.plugins.add('easykeymap',
    {
        requires : ['wysiwygarea'],
        init: function (editor) {

            //var keyMaps = CKEDITOR.tools.extend({}, editor.config.easykeymaps || {}, true);
            //Not using keymap specification from config variables, but using internally defined ones from param below

            function isRegisteredKeystroke(code) {
                if(typeof editor.keystrokeHandler.keystrokes[code] != 'undefined') {
                    console.warn("the keystroke : " + code + " is being attached to another event")
                    return true;
                }
                return false;
            }
            
            var sm1 = [];   var en1 = [];
            sm1[192]="؏";   en1[192]="~";
            sm1[49]="۱";    en1[49]="1";
            sm1[50]="۲";    en1[50]="2";
            sm1[51]="۳";    en1[51]="3";
            sm1[52]="۴";    en1[52]="4";
            sm1[53]="۵";    en1[53]="5";
            sm1[54]="۶";    en1[54]="6";
            sm1[55]="۷";    en1[55]="7";
            sm1[56]="۸";    en1[56]="8";
            sm1[57]="۹";    en1[57]="9";
            sm1[48]="۰";    en1[48]="0";
            sm1[189]="-";   en1[189]="-";
            sm1[187]="=";   en1[187]="=";
            //sm1[8]="";    en1[8]="";//BACKSPACE
                
            var sm2 = [];   var en2 = [];
            sm2[9]="";      en2[9]="";//TAB
            sm2[81]="ق";    en2[81]="Q";
            sm2[87]="و";    en2[87]="W";
            sm2[69]="ع";    en2[69]="E";
            sm2[82]="ر";    en2[82]="R";
            sm2[84]="ت";    en2[84]="T";
            sm2[89]="ے";    en2[89]="Y";
            sm2[85]="ء";    en2[85]="U";
            sm2[73]="ی";    en2[73]="I";
            sm2[79]="ہ";    en2[79]="O";
            sm2[80]="پ";    en2[80]="P";
            sm2[219]="'";   en2[219]="{";
            sm2[221]="ﷲ";   en2[221]="}";
            sm2[220]="÷";   en2[220]="\\";
            
            var sm3 = [];   var en3 = [];
            //sm3[20]="";   en3[20]="";//CAPSLOCK
            sm3[65]="ا";     en3[65]="A";
            sm3[83]="س";    en3[83]="S";
            sm3[68]="د";     en3[68]="D";
            sm3[70]="ف";    en3[70]="F";
            sm3[71]="گ";    en3[71]="G";
            sm3[72]="ح";    en3[72]="H";
            sm3[74]="ج";    en3[74]="J";
            sm3[74]="ک";    en3[75]="K";
            sm3[76]="ل";    en3[76]="L";
            sm3[186]="؛";    en3[186]=":";
            sm3[222]=",";   en3[222]="\"";
            sm3[13]="";     en3[13]="";//ENTER
            
            var sm4 = [];   var en4 = [];
            //sm4[16]="";   en4[16]="";//SHIFT
            sm4[90]="ز";    en4[90]="Z";
            sm4[88]="ش";    en4[88]="X";
            sm4[67]="چ";    en4[67]="C";
            sm4[86]="ط";    en4[86]="V";
            sm4[66]="ب";    en4[66]="B";
            sm4[78]="ن";    en4[78]="N";
            sm4[77]="م";    en4[77]="M";
            sm4[188]="،";    en4[188]="<";
            sm4[190]="۔";    en4[190]=">";
            sm4[191]="/";   en4[191]="?";
            sm4[16]="";     en4[16]="";//SHIFT
                
            var keyBoard = {};
            keyBoard.Row1 = { "sm" : sm1, "en" : en1 };
            keyBoard.Row2 = { "sm" : sm2, "en" : en2 };
            keyBoard.Row3 = { "sm" : sm3, "en" : en3 };
            keyBoard.Row4 = { "sm" : sm4, "en" : en4 };

            function getMappedCharacter(code) {
                console.info(code);
                if (typeof keyBoard.Row1.sm[code] != 'undefined')
                    return keyBoard.Row1.sm[code] 
                else if (typeof keyBoard.Row2.sm[code] != 'undefined')
                    return keyBoard.Row2.sm[code]
                else if (typeof keyBoard.Row3.sm[code] != 'undefined')
                    return keyBoard.Row3.sm[code]
                else if (typeof keyBoard.Row4.sm[code] != 'undefined')
                    return keyBoard.Row4.sm[code]
                else
                    return false;
            }

            editor.on( 'key', function( event ) {
				var t = event.target;
                var mappedCode = getMappedCharacter(event.data.keyCode);
                if (mappedCode !== false && !isRegisteredKeystroke(event.data.keyCode)) {

                    event.cancel();

                    if(typeof mappedCode == 'function') {
                        return mappedCode.call(editor, editor);
                    }
                    editor.insertText(mappedCode);
                }
            } );
        }
    });

ユーザーがウルドゥー語のテキストを入力できるようにするために、ckeditor を使用しています。アラビア語と同様に、ウルドゥー語は筆記体であり、結合すると異なる合字を使用します。

私は使用しています

 editor.on( 'key', function( event )) 

傍受するイベント

event.data.keyCode 

を使用して置き換えます

 editor.insertText() 

関数。

たとえば、ユーザーが L と A を入力した場合、それをウルドゥー語に置き換えます。

ا (U+0627) 

ل (U+0644). 

入力後、これらは両方とも、互いに分離した別個の文字として表示されます。スペースを押すか、Enter を押しても、どちらもそのまま残ります。しかし、それらを適切な同等の合字 ﻻ に置き換えてほしいと思います。これは、このUnicode チャートでは FEFB です。

ソース ビューに切り替えると、ckeditor がこれを自動的に修正することがわかります。そこでは、ブロックの内側に<p>、バラバラのバラバラの文字がすでに適切な筆記体の合字に置き換えられていることが示されています。そして、ソースビューから戻ってもそのままです。しかし、これが発生する原因が何であれ、入力中にそれを発生させるにはどうすればよいですか?

画像も添付。

入力後 入力 ソースビューに移動した後 後 ソース ビューに移動し ソース ビューから戻った後 た後 ソース ビューから戻った後

4

1 に答える 1

0

L と A を入力するたびに、 editor.insertText() は、1 つに結合するのではなく、2 つの別個の文字列として追加するだけです。

<p>"ل"
     "ا"
<br>
</p>

そのため、目的の出力が得られません。

この2行を追加

var $pTag = editor.getSelection().getRanges()[0].startContainer.$; // accessing the p tag
$pTag.innerText = $pTag.innerText+mappedCode; // modifing the inner text

交換する

editor.insertText(mappedCode); // in editor.on( 'key', function( event )

として出力されます"لا"

上記の修正には、linebeak(改行) などの対処すべき問題がいくつかあります。

更新しました

以下のスニペットを置き換えます

var $pTag = editor.getSelection().getRanges()[0].startContainer.$;
var innerText =$pTag.innerText; // accessing the p tag data
$pTag.innerText = ""; // removing the existing data
editor.insertHtml(innerText+mappedCode); // concat with new string

editor.insertText(mappedCode); // in editor.on( 'key', function( event )

例:コードペン

于 2017-02-19T01:00:06.223 に答える