编程语言
首页 > 编程语言> > javascript – 有没有人找到一种方法来愉快地处理WYSIHTML5中的代码?

javascript – 有没有人找到一种方法来愉快地处理WYSIHTML5中的代码?

作者:互联网

我正在使用基于WYSIHTML5(https://github.com/xing/wysihtml5)的WYSIHTML5 Bootstrap(http://jhollingworth.github.com/bootstrap-wysihtml5),这在从网站复制粘贴时清理HTML非常棒.

我希望能够将代码处理到编辑器中,然后使用HighlightJS突出显示语法.

我创建了一个新按钮,并复制了wysihtml5.js中使用的方法来切换粗体< b>打开和关闭,使用< pre>代替:

(function(wysihtml5) {
var undef;

wysihtml5.commands.pre = {
    exec: function(composer, command) {

        return wysihtml5.commands.formatInline.exec(composer, command, "pre");
    },

    state: function(composer, command, color) {

        return wysihtml5.commands.formatInline.state(composer, command, "pre");
    },

    value: function() {
        return undef;
    }
};
})(wysihtml5)

但这还不够.编辑时编辑器会隐藏标签.我需要能够将我的内容包含在< pre>和< code>中. &LT预&GT&LT代码&GT&LT /代码&GT&LT /预取代.

这意味着编写一个与wysihtml5使用的函数不同的函数,我不知道如何……有人可以帮助我吗?

这是wysihtml5中formatInline函数的代码:

 wysihtml5.commands.formatInline = {
exec: function(composer, command, tagName, className, classRegExp) {
  var range = composer.selection.getRange();
  if (!range) {
    return false;
  }
  _getApplier(tagName, className, classRegExp).toggleRange(range);
  composer.selection.setSelection(range);
},

state: function(composer, command, tagName, className, classRegExp) {
  var doc           = composer.doc,
      aliasTagName  = ALIAS_MAPPING[tagName] || tagName,
      range;

  // Check whether the document contains a node with the desired tagName
  if (!wysihtml5.dom.hasElementWithTagName(doc, tagName) &&
      !wysihtml5.dom.hasElementWithTagName(doc, aliasTagName)) {
    return false;
  }

   // Check whether the document contains a node with the desired className
  if (className && !wysihtml5.dom.hasElementWithClassName(doc, className)) {
     return false;
  }

  range = composer.selection.getRange();
  if (!range) {
    return false;
  }

  return _getApplier(tagName, className, classRegExp).isAppliedToRange(range);
},

value: function() {
  return undef;
}
};
})(wysihtml5);

解决方法:

得到了wysihtml5开发人员Christopher的答案:

wysihtml5.commands.formatCode = function() {
exec: function(composer) {
var pre = this.state(composer);
if (pre) {
  // caret is already within a <pre><code>...</code></pre>
  composer.selection.executeAndRestore(function() {
    var code = pre.querySelector("code");
    wysihtml5.dom.replaceWithChildNodes(pre);
    if (code) {
      wysihtml5.dom.replaceWithChildNodes(pre);
    }
  });
} else {
  // Wrap in <pre><code>...</code></pre>
  var range = composer.selection.getRange(),
      selectedNodes = range.extractContents(),
      pre = composer.doc.createElement("pre"),
      code = composer.doc.createElement("code");
  pre.appendChild(code);
  code.appendChild(selectedNodes);
  range.insertNode(pre);
  composer.selection.selectNode(pre);
}
},
state: function(composer) {
var selectedNode = composer.selection.getSelectedNode();
return wysihtml5.dom.getParentElement(selectedNode, { nodeName: "CODE" }) && wysihtml5.dom.getParentElement(selectedNode, { nodeName: "PRE" });
}
};

…并将其添加到您的工具栏:

<a data-wysihtml5-command="formatCode">highlight code</a>

非常感谢克里斯托弗!

标签:javascript,syntax,parsing,wysihtml5
来源: https://codeday.me/bug/20190613/1231688.html