点击编辑

:information_source: 摘要 在编辑器中的文本区域内单击将选择预览窗格中的相应行,反之亦然。
:hammer_and_wrench: 仓库链接 https://github.com/thijsbrilleman/discourse-click-to-edit
:open_book: 安装指南 如何在 Discourse 中安装插件

click-to-edit - 1080WebShareName-2

特性

在编辑器中的文本区域内单击将选择预览窗格中的相应行,反之亦然。

28 个赞

Discourse核心编辑功能的一个非常好的补充。感谢您的创作。

5 个赞

不过,这似乎是应该受到欢迎的事情,尽管我对此无权置喙。

6 个赞

你好 :waving_hand: 谢谢,这真的很酷 :tada: 我只是在想把它做成一个主题组件会很棒。:slightly_smiling_face:

7 个赞

在 iPad 上效果不太好,因为它在输入时会选择整个文本。看起来很奇怪。

3 个赞

谢谢,我同意。我一有时间就会研究一下。你随时欢迎提交一个拉取请求。

这目前是预期行为,但我当然也乐于接受更好的想法。你会推荐什么样的视觉提示?

2 个赞

当真正选中某项内容时,它会显示为粘贴的文本。然后会发生操作并得到响应。

好奇,为什么这是一个插件而不是主题组件?所有这些令牌不都可以在客户端生成吗?

另外,做得很好,喜欢你依赖于 Markdown 引擎注入的行号。

4 个赞

谢谢 Sam。

您可能已经注意到,data-ln 属性也存在于在服务器上生成和存储的已处理 HTML 中。

我实现了这个行为,以便稍后可以扩展插件,允许从主题视图页面可靠地插入/编辑片段,相当于下面显示的编辑按钮(但更健壮):

我写它已经一年了,但如果我没记错的话,为此,在 plugin.rb 中,这一行

register_asset "vendor/javascripts/markdown-it-line-numbers.js", :vendored_pretty_text

是必需的,以确保 MarkdownIt 扩展在处理 HTML 时也在服务器端运行。

不过,我还没有找到时间来实现扩展的编辑功能,所以如果这个需求被放弃,我想它可以被转换成一个组件。

5 个赞

@sam 我正在尝试将其转换为主题组件,但我无法弄清楚如何在 markdownit 插件的上下文中执行此代码:

// javascripts/lib/discourse-markdown/initialize_markdownit_plugin.js:

export function setup(helper) {
    helper.registerPlugin(markdownitLineNumbers); // markdownitLineNumbers 已经可用
}

我怀疑我之前编写的插件中的那一行也添加了一些客户端魔术:

# plugin.rb

register_asset "vendor/javascripts/markdown-it-line-numbers.js", :vendored_pretty_text

你有什么头绪吗?

不确定,我会联系团队。

2 个赞

我认为这是因为目前它仅限于插件范围。没有这项检查它也能工作。 (这段代码是在此 commit 中引入的)

https://github.com/discourse/discourse/blob/main/app/assets/javascripts/discourse/app/static/markdown-it/features.js#L5

我想为另一个组件集成行号,但又不想制作一个插件,所以我放弃了。如果主题组件能支持 markdown 功能,那就太棒了!

顺便说一句,你在这里提出的一个很棒的功能——非常好 :+1: :rocket:

4 个赞

啊是的,这下清楚了。

看看这段代码,也许可以在运行时手动注入主题组件中的 markdown 插件,但这会非常 hacky。在尝试实现它之前,我会等待核心团队的裁决。

4 个赞

我们的 markdown 管道在客户端(用于预览)和服务器(用于预渲染帖子的 HTML)上运行。因此,它仅为插件设计——它们是唯一可以在服务器端注入代码的插件。

现在……这种情况很不寻常,因为该扩展仅在编辑器中需要,而在服务器上不需要。因此,从主题组件进行操作应该是可行的。

您对此有什么特别的策略吗?

5 个赞

这似乎会引起广泛的共鸣。在一篇长文中很难找到自己的位置。这会不会是 pr-welcome

5 个赞

在原始代码库中覆盖此函数:

// discourse/app/assets/javascripts/discourse/app/components/d-editor.js
async cachedCookAsync(text, options) {
  this._cachedCookFunction ||= await generateCookFunction(options || {});
  return await this._cachedCookFunction(text);
}

使用主题组件初始化程序:

export default {
  name: "d-editor-cached-cook-async-override",
  initialize() {
    const dEditor = require("discourse/components/d-editor").default;
    dEditor.reopen({
      cachedCookAsync(text, options) {
        // 重复代码在此处返回一个修改后的 cook 函数
      },
    });
  },
};

如果它能起作用的话,这将意味着大量的代码重复。脏,脏。

4 个赞

嗯,是的,同意——这绝对不是理想情况。复制代码甚至可能不可行,因为 markdown-it 模块是异步加载的,并且不属于主题/插件可以直接访问的 AMD 模块系统。:thinking:

构建一个允许主题贡献仅限客户端的 md 转换的系统可能很酷,尽管用例相当有限。在 99% 的情况下,人们希望 md 转换也能在服务器端应用。

所以我想,目前,坚持使用插件可能是最好的方法。

5 个赞

我想知道这种装饰是否应该被应用?

例如:

<p data-source-line="0">.....</p>

额外的 data 属性将极大地帮助我们内部的许多实现,例如,当您在代码块中时,不显示自动完成。引用和快速编辑也变得更加容易。

简单的实现几乎没有额外的开销,但可以让我们删除大量源代码。

7 个赞

我们过去曾有过这个功能(隐藏在标志后面),但它已被在此提交中移除。我找到了这张截图,来自一些关于该功能的内部讨论:

也就是说,性能问题出在滚动同步代码上,而不是行号注入 :ok_hand:

所以,我没有意见将 data-source-line 注入核心,只要它只在预览中添加。你是否有兴趣为此提交一个 PR,@pipkin

4 个赞

我很乐意!很高兴能为你们做些贡献。

6 个赞