【问题标题】:Why does text copied from a set of pre tags have double line-breaks?为什么从一组 pre 标签复制的文本有双换行符?
【发布时间】:2014-10-17 01:08:28
【问题描述】:

我正在编写一个小型库,以 ​​HTML 格式以并排格式呈现 Git 差异。正如人们所期望的那样,左侧面板代表上一次提交,右侧面板代表当前提交。

我希望任一面板都能够使用浏览器的复制和粘贴功能,以便用户可以抓取其中的数据。我发现我排列 HTML 的方式(至少在 Firefox/Ubuntu 中)会导致粘贴的输出在每行末尾有两个换行符,而不是我预期的零或一个。

这是来自我的渲染器的代码演示文稿:

                <div class="line diff-line ">
                    <pre> */</pre>
                </div>
                <div class="line diff-line ">
                    <pre>function deletePost(PDO $pdo, $postId)</pre>
                </div>
                <div class="line diff-line ">
                    <pre>{</pre>
                </div>
                <div class="line diff-line diff-line-added">
                    <pre>   $sqls = array(</pre>
                </div>
                <div class="line diff-line diff-line-added">
                    <pre>       // Delete comments first, to remove the foreign key objection</pre>
                </div>
                <div class="line diff-line diff-line-added">
                    <pre>       &quot;DELETE FROM</pre>
                </div>
                <div class="line diff-line diff-line-added">
                    <pre>           comment</pre>
                </div>
                <div class="line diff-line diff-line-added">
                    <pre>       WHERE</pre>
                </div>
                <div class="line diff-line diff-line-added">
                    <pre>           post_id = :id&quot;,</pre>
                </div>
                <div class="line diff-line diff-line-added">
                    <pre>       // Now we can delete the post</pre>
                </div>

&lt;div&gt; 块是红鲱鱼,事实证明 - 如果它们被剥离,会遇到相同的行为:

                    <pre> */</pre>
                    <pre>function deletePost(PDO $pdo, $postId)</pre>
                    <pre>{</pre>
                    <pre>   $sqls = array(</pre>
                    <pre>       // Delete comments first, to remove the foreign key objection</pre>
                    <pre>       &quot;DELETE FROM</pre>
                    <pre>           comment</pre>
                    <pre>       WHERE</pre>
                    <pre>           post_id = :id&quot;,</pre>
                    <pre>       // Now we can delete the post</pre>

(我不建议将&lt;div&gt;s 从最终解决方案中删除 - 我将它们删除,因为我相信它们不是问题的根源)。

现在,我怀疑一个解决方法是让一组&lt;pre&gt; 标记包裹所有内容,并注意所呈现的差异之外的空白。但是,按照我的安排,我想知道是否有一个 CSS 设置可以放在&lt;pre&gt; 标签上,以防止它们添加不属于那里的空行?

无论如何我都对这种行为感到困惑——因为它们是块级的,我可以理解为什么它们最终会生成一个 NL,但是两个相当奇怪。

There's an illustrative Fiddle here.

【问题讨论】:

  • 你在用什么编辑器粘贴文本。我刚试过我的,看起来还可以。我没有得到 2 条断线
  • 防止他们添加不属于那里的空行? - 浏览器将呈现那里的内容,所以这有点荒谬。
  • 我刚刚用 Chrome 检查了小提琴。每行有 16 像素高度,我没有看到添加任何额外的空白行。你在火狐上吗?
  • 你的小提琴没有多余的线条,但我不知道我应该使用什么文本编辑器? (我尝试了 jsfiddle、SO 答案和记事本。)
  • 这正是块元素的作用,所以是的,将整个内容包裹在 &lt;pre&gt; 中,并用 &lt;span&gt; 包裹每一行。顺便说一句,我认为 GitHub 使用了一个表格,这似乎可行。

标签: html css copy-paste pre


【解决方案1】:

我为火狐安装了这个插件来将文本复制为纯文本。这解决了复制和粘贴问题。所以在我看来,问题在于火狐正在复制某种格式。

https://addons.mozilla.org/en-us/firefox/addon/copy-plain-text-2/developers

 pre {
   display: block;
   margin: 0;
}

http://jsfiddle.net/bp4m6baq/2/

并使用插件,然后它才会起作用。

【讨论】:

  • 感谢您的回答,但不幸的是,这又增加了一个问题。现在删除了故意的换行符,并且在复制和粘贴双 CR 时仍然存在。我认为这是 FF 中长期存在的错误。
  • 是的,我想插件会修复它,但这对我网站的用户没有好处。我通过完全删除&lt;pre&gt; 并在&lt;code&gt; 上使用white-space: pre 来修复它。 (原帖下的一位评论者暗示 Github 被驱使使用表格进行代码格式化,所以他们可能遇到了同样的问题!)
猜你喜欢
  • 2012-07-01
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
相关资源
最近更新 更多