Markdown 如何将ProseMirror状态下的位置投影为标记字符串

Markdown 如何将ProseMirror状态下的位置投影为标记字符串,markdown,caret,prose-mirror,Markdown,Caret,Prose Mirror,假设我们有WISYWIG/Markdown编辑器,可以在模式之间切换,如中所示 请注意,在切换模式时,它不会保留插入符号/滚动/选择。如果我们要进一步改进它的用户体验,我们必须在切换模式时保持插入符号的位置 问题在于WISYWIG中的光标位置,比如说:“foob|ar”是“5”,而原始降价位置是“foo**b|ar**”–“7” 在切换模式时,这些位置如何前后投影 如果我们解决了位置投影问题,“滚动”和“选择”同步只是一个小小的调整。我找到了这个问题的解决方案: 我们只需要用一些非常特殊的符号标

假设我们有WISYWIG/Markdown编辑器,可以在模式之间切换,如中所示

请注意,在切换模式时,它不会保留插入符号/滚动/选择。如果我们要进一步改进它的用户体验,我们必须在切换模式时保持插入符号的位置

问题在于WISYWIG中的光标位置,比如说:“foob|ar”是“5”,而原始降价位置是“foo**b|ar**”–“7”

在切换模式时,这些位置如何前后投影


如果我们解决了位置投影问题,“滚动”和“选择”同步只是一个小小的调整。

我找到了这个问题的解决方案: 我们只需要用一些非常特殊的符号标记目标位置,通过转换器,找到这个标记现在的位置。这是一个相对简单、健壮和直接的解决方案

import{schema,defaultMarkdownParser,
“prosemirror markdown”中的DefaultMarkdowSerializer}
从“prosemirror模型”导入{Node,Slice,Fragment};
//我们需要一个特殊的符号,它可能不会在文本中使用
常数标记█';
函数ProjectTopRoseMirr(mdText:string,position:number):数字{
常量withMarker=mdText.substr(0,位置)+MARKER+mdText.substr(位置);
const node=defaultMarkdownParser.parse(带标记);
返回node.textContent.indexOf(MARKER);
}
功能项目标记(节点:节点,位置:编号):编号{
const pos=node.resolve(位置+1/*prosemiror从“1”*/开始计算位置);
const marker=Fragment.from(schema.text(marker,pos.marks());
const with marker=node.replace(pos.pos,pos.pos,新切片(marker,0,0));
const markdown=defaultmarkdowserializer.serialize(withMarker);
返回markdown.indexOf(MARKER);
}
用法:
projectTopRosemirr('some**formatted**text',8);//=6