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

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

在编辑器中的文本区域内单击将选择预览窗格中的相应行,反之亦然。
Discourse核心编辑功能的一个非常好的补充。感谢您的创作。
不过,这似乎是应该受到欢迎的事情,尽管我对此无权置喙。
你好
谢谢,这真的很酷
我只是在想把它做成一个主题组件会很棒。![]()
谢谢,我同意。我一有时间就会研究一下。你随时欢迎提交一个拉取请求。
这目前是预期行为,但我当然也乐于接受更好的想法。你会推荐什么样的视觉提示?
当真正选中某项内容时,它会显示为粘贴的文本。然后会发生操作并得到响应。
好奇,为什么这是一个插件而不是主题组件?所有这些令牌不都可以在客户端生成吗?
另外,做得很好,喜欢你依赖于 Markdown 引擎注入的行号。
谢谢 Sam。
您可能已经注意到,data-ln 属性也存在于在服务器上生成和存储的已处理 HTML 中。
我实现了这个行为,以便稍后可以扩展插件,允许从主题视图页面可靠地插入/编辑片段,相当于下面显示的编辑按钮(但更健壮):
我写它已经一年了,但如果我没记错的话,为此,在 plugin.rb 中,这一行
register_asset "vendor/javascripts/markdown-it-line-numbers.js", :vendored_pretty_text
是必需的,以确保 MarkdownIt 扩展在处理 HTML 时也在服务器端运行。
不过,我还没有找到时间来实现扩展的编辑功能,所以如果这个需求被放弃,我想它可以被转换成一个组件。
@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
你有什么头绪吗?
不确定,我会联系团队。
我认为这是因为目前它仅限于插件范围。没有这项检查它也能工作。 (这段代码是在此 commit 中引入的)
我想为另一个组件集成行号,但又不想制作一个插件,所以我放弃了。如果主题组件能支持 markdown 功能,那就太棒了!
顺便说一句,你在这里提出的一个很棒的功能——非常好
![]()
啊是的,这下清楚了。
看看这段代码,也许可以在运行时手动注入主题组件中的 markdown 插件,但这会非常 hacky。在尝试实现它之前,我会等待核心团队的裁决。
我们的 markdown 管道在客户端(用于预览)和服务器(用于预渲染帖子的 HTML)上运行。因此,它仅为插件设计——它们是唯一可以在服务器端注入代码的插件。
现在……这种情况很不寻常,因为该扩展仅在编辑器中需要,而在服务器上不需要。因此,从主题组件进行操作应该是可行的。
您对此有什么特别的策略吗?
这似乎会引起广泛的共鸣。在一篇长文中很难找到自己的位置。这会不会是 pr-welcome ?
在原始代码库中覆盖此函数:
// 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 函数
},
});
},
};
如果它能起作用的话,这将意味着大量的代码重复。脏,脏。
嗯,是的,同意——这绝对不是理想情况。复制代码甚至可能不可行,因为 markdown-it 模块是异步加载的,并且不属于主题/插件可以直接访问的 AMD 模块系统。![]()
构建一个允许主题贡献仅限客户端的 md 转换的系统可能很酷,尽管用例相当有限。在 99% 的情况下,人们希望 md 转换也能在服务器端应用。
所以我想,目前,坚持使用插件可能是最好的方法。
我想知道这种装饰是否应该被应用?
例如:
<p data-source-line="0">.....</p>
额外的 data 属性将极大地帮助我们内部的许多实现,例如,当您在代码块中时,不显示自动完成。引用和快速编辑也变得更加容易。
简单的实现几乎没有额外的开销,但可以让我们删除大量源代码。
我们过去曾有过这个功能(隐藏在标志后面),但它已被在此提交中移除。我找到了这张截图,来自一些关于该功能的内部讨论:
也就是说,性能问题出在滚动同步代码上,而不是行号注入 ![]()
所以,我没有意见将 data-source-line 注入核心,只要它只在预览中添加。你是否有兴趣为此提交一个 PR,@pipkin?
我很乐意!很高兴能为你们做些贡献。