zxkmm / siyuan_auto_codeblock

auto put code block language from code
MIT License
55 stars 1 forks source link

在代码块内粘贴代码,不需要识别语言 #7

Closed TCOTC closed 2 weeks ago

TCOTC commented 1 month ago

image

zxkmm commented 1 month ago

这个目前可能无法规避,因为我没找到读当前光标所在块内容的方法,所以插件没办法判断你是不是在代码块内部。对于这个解决方法就是只能关掉自动识别,然后需要识别时候就用斜杠菜单来处理。

TCOTC commented 1 month ago

那就先这样吧,不过我发现这个保存不起作用,要手动重载才会生效:

image

zxkmm commented 1 month ago

这个有点怪,理论上每次粘贴都读一次插件存储的

choyy commented 1 month ago

这个目前可能无法规避,因为我没找到读当前光标所在块内容的方法,所以插件没办法判断你是不是在代码块内部。对于这个解决方法就是只能关掉自动识别,然后需要识别时候就用斜杠菜单来处理。

光标所在元素的class名称会多一个block-focus,光标在代码块内的话,代码块元素的class会变成"code-block block-focus",所以可以通过document.getElementsByClassName("code-block block-focus")这种方式来判断是否在代码块内

zxkmm commented 1 month ago

这个目前可能无法规避,因为我没找到读当前光标所在块内容的方法,所以插件没办法判断你是不是在代码块内部。对于这个解决方法就是只能关掉自动识别,然后需要识别时候就用斜杠菜单来处理。

光标所在元素的class名称会多一个block-focus,光标在代码块内的话,代码块元素的class会变成"code-block block-focus",所以可以通过document.getElementsByClassName("code-block block-focus")这种方式来判断是否在代码块内

感谢大佬!我今天下午试一下

zxkmm commented 1 month ago

我这边根据这个css获取到的obj是这个,似乎没办法提取有用的信息 image

TCOTC commented 1 month ago

光标所在元素的 class 名称会多一个 block-focus

会吗?我这里没有

TCOTC commented 1 month ago

我提供一个不同的思路,看当前编辑器面包屑:

image

p.s. 但我刚刚发现如果是用键盘移动光标的话这个 icon 不会变

choyy commented 1 month ago

我这边根据这个css获取到的obj是这个,似乎没办法提取有用的信息 image

光标不在代码快内是没有内容的,光标在代码块内会返回该代码块的

zxkmm commented 1 month ago

光标不在代码快内是没有内容的,光标在代码块内会返回该代码块的

我这边尝试了如下操作: 光标在空代码块内部 光标在空块内部 光标在有内容的代码块内部 光标在空普通块内部 光标在有内容普通块内部 似乎都是一样的

zxkmm commented 1 month ago

我提供一个不同的思路,看当前编辑器面包屑:

image

p.s. 但我刚刚发现如果是用键盘移动光标的话这个 icon 不会变

确实,这个问题有点麻烦

choyy commented 1 month ago

光标不在代码快内是没有内容的,光标在代码块内会返回该代码块的

我这边尝试了如下操作: 光标在空代码块内部 光标在空块内部 光标在有内容的代码块内部 光标在空普通块内部 光标在有内容普通块内部 似乎都是一样的

不可能啊我都试过的,可惜现在手头没有电脑

TCOTC commented 1 month ago

@zxkmm 要不你看看打字机插件是怎么获取到当前焦点块的?

https://github.com/Zuoqiu-Yingyi/siyuan-plugin-typewriter

image

zxkmm commented 1 month ago

@choyy @TCOTC 感谢两位大佬,我再看看。因为这个粘贴事件是思源控制的,所以顺序可能有点难以处理(或者根本没法处理)我尽量看看

choyy commented 1 month ago

@zxkmm 图片

TCOTC commented 1 month ago

我有个疑问啊,你的 .block-focus 是从哪来的?我这里最多也就是 .protyle-wysiwyg--select 和 .protyle-wysiwyg--hl

思源的代码里我也没找到 block-focus 。

https://github.com/user-attachments/assets/50191513-4a39-461a-8be1-680e0b8b7470

choyy commented 1 month ago

确实默认没有...才发现是主题自己加的,不过也发现选择光标所在的块也很简单,下面几行代码就能获得(block):

    let block = window.getSelection()
        && window.getSelection().focusNode
        && window.getSelection().focusNode.parentElement; // 当前光标
    while (block != null && block.dataset.nodeId == null) block = block.parentElement;