こんにちは、
サイトの管理者がブログ投稿のマークダウンを入力できるように、javascript ベースのエディター (EpicEditor) を使用しようとしています。送信ボタンをクリックすると、エディターによって生成された文字列が Ruby/Rails サーバーに送信され、RDiscount を介して HTML に処理されます。
、スペースなどと関係があることを除いて、ほとんどが機能しているようです。EpicEditor で「プレビュー」ボタンをクリックすると、期待どおりの出力が得られるので、文字列がサーバーに送信される方法に関係があることがわかりました。私はまだ Ruby にかなり慣れていないので、文字列エンコーディングなどはあまり得意ではありません。適切な人にとっては、これはかなり単純な質問だと確信しています。
問題を説明するには、コードを表示するだけがおそらく最善です。番号付きリストの下に箇条書きリストを入力しようとしています。そのため、マークダウンは次のようになります。
1. Hello
2. Goodbye
- a list
- entry
3. For something
私の問題は、順序付きリストエントリの後の改行内とその周辺にあるようです。データベースに保存された文字列と、javascript エディターに表示された文字列はまったく同じように見えました。
"\n - had\n"
しかし、さらに調べてみると、「動作中の文字列」(EpicEditor のプレビュー ビューで使用されていたもの) と「失敗した文字列」 (フォームによって渡されたデータベースに保存されている正確な文字列) の間にわずかな違いがありました。 :
working_string.each_byte {|c| puts c}
--> 10, 32, 32, 45, 32, 104, 97, 100, 10
failing_string.each_byte {|c| puts c}
--> 10, 194, 160, 32, 45, 32, 104, 97, 100, 10
どういうわけか/どういうわけか、 の32
バイトが変更されていました194 160
。さらに調査すると、これは文字列内の通常のスペースと a\xC2
またはの問題の\xA0
ようであり、 と関係がある (と思います)
。
文字列が EpicEditor から Rails サーバー、そしてデータベースに正しく渡されることを確認する簡単な方法はありますか? 役立つ場合は、サーバー側で文字列の置換を行うこともできます....
ありがとう!
更新 1
私は調べて、正確な問題を見つけようとしました。Epiceditor からミラーリングしているテキストエリア (フォームで送信するため) から、Epiceditor からのテキスト、ネットワークを経由したパラメーター、およびデータベース内の文字列を取得しました。マークダウンは次のとおりです (エピセディターのテキスト領域から直接コピー:
## Testing this yet again
Because I want more!! More things to have a good time....
1. Everywhere!
2. Anywhere!
- happy place
- sad place
3. Goodbye
これをこの入力に直接貼り付けると、適切にレンダリングされることがわかります。
これをもう一度テストする
もっと欲しいから!!楽しい時間を過ごすためのより多くのこと....
- どこにでも!
- どこでも!
- 幸せな場所
- 悲しい場所
- さようなら
この文字列の ASCII 文字は次のとおりです。
[35, 35, 32, 84, 101, 115, 116, 105, 110, 103, 32, 116, 104, 105, 115, 32, 121, 101, 116, 32, 97, 103, 97, 105, 110, 10, 10, 66, 101, 99, 97, 117, 115, 101, 32, 73, 32, 119, 97, 110, 116, 32, 109, 111, 114, 101, 33, 33, 32, 77, 111, 114, 101, 32, 116, 104, 105, 110, 103, 115, 32, 116, 111, 32, 104, 97, 118, 101, 32, 97, 32, 103, 111, 111, 100, 32, 116, 105, 109, 101, 46, 46, 46, 46, 10, 10, 49, 46, 32, 32, 69, 118, 101, 114, 121, 119, 104, 101, 114, 101, 33, 10, 50, 46, 32, 32, 65, 110, 121, 119, 104, 101, 114, 101, 33, 10, 32, 32, 45, 32, 104, 97, 112, 112, 121, 32, 112, 108, 97, 99, 101, 10, 32, 32, 45, 32, 115, 97, 100, 32, 112, 108, 97, 99, 101, 10, 51, 46, 32, 32, 71, 111, 111, 100, 98, 121, 101]
exportFile() を介してエディターの内容をテキストエリアにコピーしています。そのテキストエリアの ASCII 文字は次のとおりです。
[35,35,32,84,101,115,116,105,110,103,32,116,104,105,115,32,121,101,116,32,97,103,97,105,110,10,10,66,101,99,97,117,115,101,32,73,32,119,97,110,116,32,109,111,114,101,33,33,32,77,111,114,101,32,116,104,105,110,103,115,32,116,111,32,104,97,118,101,32,97,32,103,111,111,100,32,116,105,109,101,46,46,46,46,10,10,49,46,32,160,69,118,101,114,121,119,104,101,114,101,33,10,50,46,32,160,65,110,121,119,104,101,114,101,33,10,160,32,45,32,104,97,112,112,121,32,112,108,97,99,101,10,160,32,45,32,115,97,100,32,112,108,97,99,101,10,51,46,32,160,71,111,111,100,98,121,101]
これらの配列を比較すると、次のようになります。
textarea - epiceditor
=> [160, 160, 160, 160, 160]
つまり、 exportFile() で EpicEditor からまだ出力されている余分なものがあるようです。これがどこから来ているのかについて何か考えはありますか?次のようにミラーリングを完了します。
var post_body = $("#post_body");
var content = post_body.val();
var editor = new EpicEditor(opts);
editor.on('load', function () {
editor.importFile(window.location.href, content); //Imports a file when the user clicks this button
});
editor.on('save', function () {
post_body.val(editor.exportFile());
});
更新 2
PS 以下は exportFile() 出力を修正します。少なくとも私はそれを理解できたことをうれしく思いますが、EpicEditor でネイティブに動作するものを手に入れたいと思っていました!
bad = "#{194.chr}#{160.chr}".force_encoding('utf-8')
good = 32.chr
self.body = body.gsub(bad, good)