2015-04-23 74 views
4

我们使用管理平台(https://github.com/a-ono/redmine_ckeditor)的CKEditor的插件,遇到以下问题:实体编码 - 没有完美的解决方案?

作为插件的开发者,它说:“似乎没有完美的解决方案。”

我发现了http://komlenic.com/246/encoding-entities-to-work-with-ckeditor-3/,http://ckeditor.com/forums/Support/inside-tries-create-paragraph#comment-54348和一些关于“forceSimpleAmpersand:true”以及config.entities_latin = false的附加信息,但我不太确定如何继续。我们正在将其他用户迁移到Redmine,但如果他们无法发布链接或xml/html内容(例如,作为错误报告的一部分),那么它就会成为一个表现障碍(例如,作为错误报告的一部分)

因此,所有CKEditor的优点。任何提示?

+0

现在应该解决。 https://github.com/a-ono/redmine_ckeditor/issues/158 –

回答

2

对不起,但看起来Redmine的插件已损坏。 CKEditor本身在这里没有任何关系 - 它可以正确读写实体如果数据加载正确。如果某些实体在将它们保存到数据库中并加载它们后被解码或编码太多,则意味着后端已损坏。而不是触及CKEditor的默认选项,后端应该是固定的(意思是Redmine的插件,或者不太可能,Redmine本身)。

让我们考虑下面的情况。你想写你的评论关于<xml>标签。它的HTML将是:

<p>This is a tag: <code>&lt;xml&gt;</code>.</p> 

而这也将editor.getData()返回什么,或者会发布到服务器,如果是使用<textarea>自动集成。

现在,如果你这样做(在demo例如):

editor.setData('<p>This is a tag: <code>&lt;xml&gt;</code>.</p>'); 

一切都会完全罚款。相同的内容会显示:

Loading data using editor.setData()

然而,许多开发人员使用CKEditor的整合与<textarea> S和,不幸的是,他们并不完全了解它是如何工作的。让我们来加载存储在一个数据库到一个textarea的确切数据:

<textarea><p>This is a tag: <code>&lt;xml&gt;</code>.</p></textarea> 

如果您现在尝试读取使用textarea.value从JavaScript这个textarea的价值,你会得到:

<p>This is a tag: <code><xml></code>.</p> 

正如你可以看到,<xml>标记的编码丢失了,因为在HTML中,&lt;被读为<

所以,你需要做的就是把它们装到一个文本才重新对数据进行编码:

<textarea>&lt;p&gt;This is a tag: &lt;code&gt;&amp;lt;xml&amp;gt;&lt;/code&gt;.&lt;/p&gt;</textarea> 

现在检查所有<字符成为&lt;,但已编码&lt;成为&amp;lt;。这将确保在将数据打印到HTML时所有实体都能正确保存。正如你所看到的,它与CKEditor无关。这同样适用于显示在CKEditor中创建的数据 - 编码必须保留。如果丢失了某些东西,这意味着后端将对数据进行编码或解码,而不应该这样做。

+0

感谢您的详细解答。我希望我们会在这里取得一些进展。 –

+0

我不明白这一点:'''正如你所看到的那样,标记的编码丢失了,因为在HTML中,<被读为<.''';为什么会被解释为HTML,因为不是[textarea应该只包含纯文本](https://www.w3.org/TR/html5/sec-forms.html#elementdef-textarea)。为什么该值会被解码为HTML实体?而且,首先,执行该解码的是什么?浏览器的Javascript实现?对不起,也许微不足道的问题。 – Kamafeather

0

我们有一个用户坚持在wiki的python代码块中放入python解释器“>>>”。 这些被转换为HTML实体& gt; & gt; & gt;当保存到wiki数据库。查看时,它们不会转换回“>>>”,因为它位于<前>区块内。

我发现,改变的插件/ redmine_ckeditor/lib中/ redmine_ckeditor/wiki_formatting/formatter.rb线17:

%Q[<pre>\n<code class="#{lang} syntaxhl">#{ 
     Redmine::SyntaxHighlighting.highlight_by_language(code, lang) 
    }</code>\n</pre>] 

%Q[<pre>\n<code class="#{lang} syntaxhl">#{ 
     Redmine::SyntaxHighlighting.highlight_by_language(CGI.unescapeHTML(code), lang) 
    }</code>\n</pre>] 

解决我们的问题与代码HTML实体。

相关问题