在古腾堡代码块中键入制表符

问题描述 投票:0回答:3

古腾堡代码块用于在 WordPress 帖子和页面中显示代码块。在理想情况下,大多数人只是将代码直接复制并粘贴到这些块中。但我希望能够将代码输入到块中。

如何输入制表符?我希望能够在输入代码时缩进。如果我复制并粘贴一段代码,它不会丢失选项卡。但是,我一直无法输入。

键入 Tab 键会将焦点更改到下一个块。 Shift-tab 将焦点更改到前一个块。 CTRL-tab 不执行任何操作。

我进行了搜索和谷歌搜索,但我只能找到其他人问同样的问题,但没有答案。

wordpress wordpress-gutenberg gutenberg-blocks
3个回答
0
投票

尝试将以下内容添加到页脚之前的脚本标记中(通过根据正确的过程将其排队):

var codeAreas = document.querySelectorAll('code.block-editor-rich-text__editable');
if (codeAreas) {
    for (area of codeAreas) {
        area.addEventListener('keydown', (e) => {
            var TABKEY = 9;
            if (e.keyCode == TABKEY) {

                if (e.preventDefault) {
                    e.preventDefault();
                }

                var text = "\t";
                var selection = document.getSelection();
                var range = selection.getRangeAt(0);
                var startPos = range.startOffset;
                var endPos = range.endOffset;

                area.innerText = area.innerText.substring(0, startPos)
                    + text
                    + area.innerText.substring(endPos, area.innerText.length);

                range = document.createRange();
                range.setStart(area.firstChild, endPos + text.length);
                selection.removeAllRanges();
                selection.addRange(range);

                return false;
            }
        }
            , false);
    }
}

我会尝试分解每个部分的作用。

首先,我们当然会找到任何可编辑的代码标签(如果存在)并添加一个 keydown 事件。

var codeAreas = document.querySelectorAll('code.block-editor-rich-text__editable');
if (codeAreas) {
    for (area of codeAreas) {
        area.addEventListener('keydown', (e) => {
...

我们检查它是否是一个选项卡

...
var TABKEY = 9;
    if(e.keyCode == TABKEY) {

...

如果是,首先我们阻止 keydown 事件的默认行为(选择下一个元素)

...
if (e.preventDefault) {
    e.preventDefault();
}
...

然后设置我们想要插入的文本 - 在本例中是一个制表符,但可以是四个空格或其他任何内容 - 并且还获取当前选择的位置。如果没有突出显示任何内容,则选择范围的起点和终点将相同

...
var text = "    ";
var selection = document.getSelection();
var range = selection.getRangeAt(0);
var startPos = range.startOffset;
var endPos = range.endOffset;
...

现在我们在光标处插入文本,

...
area.innerText = area.innerText.substring(0, startPos)
    + text
    + area.innerText.substring(endPos, area.innerText.length);
...

然后我们将选择重置为插入文本的末尾

...
range = document.createRange();
range.setStart(area.firstChild, endPos + text.length);
selection.removeAllRanges();
selection.addRange(range);
...

然后我们返回 false 以防万一,所以该事件肯定不会触发其他处理程序


0
投票

我通过安装“Enlighter - 可自定义语法荧光笔”插件解决了这个问题。我的代码现在已根据需要进行了良好的格式化。


0
投票

您可以使用剪贴板。 一旦您的块中包含 TAB 字符,您就可以突出显示复制,然后将其粘贴到需要 TAB 的任何位置 - 所有这些都在古腾堡编辑器中进行。 (要获取第一个制表符,您可以从任何文本编辑器中剪切和粘贴)。 这并不理想,但我发现它已经足够好了。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.