【问题标题】:How can I syntax highlight a single text input field? [closed]如何语法突出显示单个文本输入字段? [关闭]
【发布时间】:2018-08-29 19:57:29
【问题描述】:

如何使用极其简单的高亮规则以最佳语法高亮单个文本区域?

基于 Javascript 的代码编辑器庞大而臃肿——我不想要多行编辑、行号或类似的东西。只是一些简单的东西,可以解析输入的文本并允许对其进行格式化。

例如,如果用户正在创建一个消息模板,并且有名为 firstNamelastName 的可用令牌,并且如果他们键入以下内容,则有一个可用的 HTML 单行输入字段:

Hello, {{firstName}} {{lastName}}!

将样式(颜色、边框等)应用于明确定义的标记,同时仍允许用户编辑整个文本字符串的最佳方法是什么?

【问题讨论】:

    标签: javascript html input token syntax-highlighting


    【解决方案1】:

    好吧,我创建了一个函数,当它在 [...] 内时突出显示单词,我为你做了调整,然后它得到 {{...}} 内的内容。

    但问题是,您不能在输入字段中设置 HTML,因此您无法在输入或文本区域内以简单的方式突出显示单词,您需要将突出显示的文本添加到另一种元素。

    一个可能的解决方案是使用divcontentEditable=true,这样在同一输入中键入和突出显示可能会更容易。

    看看下面的代码(我基于一个简单的输入,而不是 contentEditable div)如果它是你要找的。​​p>

    function setHighlight(input){  
      let newText = Highlight(input.value);
      document.getElementById("result").innerHTML = newText;
    }
    
    function Highlight(text){
      var htmlText = text;
      var attrs = htmlText.match(/\{{(.*?)\}}/g);
    
      if (attrs != null) {
          var stringAttrs = attrs.join(" ")
          attrs = stringAttrs.replace(/}}/g, '').replace(/\{{/g, '').split(" ");
          for (var i = 0; i < attrs.length; i++) {
              var attr = attrs[i];
              if (attr.length > 0) {
                  attr = "{{" + attr + "}}";
                  if (htmlText.indexOf(attr) > -1) {                  
                      htmlText = htmlText.replace(attr, "<span class='highlight'>" + attr + "</span>");
                  }
              }
          }
      }
      return htmlText;
    }
    input{
      width: 320px;
      height: 40px;
    }
    
    .highlight{
      font-weight: bold;
      color: #14e;
    }
    <input id="txt" oninput="setHighlight(this)" value="type a {{token}} here">
    
    <div id="result"></div>

    在这里,我做了一个 contentEditable,看起来更多的是你在寻找什么:

    function setHighlight(inputSpan){  
      let newText = Highlight(inputSpan.textContent);
      inputSpan.innerHTML = newText;
      setCaretToEnd(inputSpan);
    }
    
    function Highlight(text){
      var htmlText = text;
      var attrs = htmlText.match(/\{{(.*?)\}}/g);
    
      if (attrs != null) {
          var stringAttrs = attrs.join(" ")
          attrs = stringAttrs.replace(/}}/g, '').replace(/\{{/g, '').split(" ");
          for (var i = 0; i < attrs.length; i++) {
              var attr = attrs[i];
              if (attr.length > 0) {
                  attr = "{{" + attr + "}}";
                  if (htmlText.indexOf(attr) > -1) {                  
                      htmlText = htmlText.replace(attr, "<span class='highlight'>" + attr + "</span>");
                  }
              }
          }
      }
      return htmlText;
    }
    
    function setCaretToEnd(elem){
      let range = document.createRange();
      range.selectNodeContents(elem);
      range.collapse(false);
      let selection = window.getSelection();
      selection.removeAllRanges();
      selection.addRange(range);
    }
    #txt{
      width: 320px;
      height: 30px;
      padding: 4px;
      border: 1px solid #777;
      display: block;
      border-radius: 4px;
      color: #222;
    }
    
    .highlight{
      font-weight: bold;
      color: #14e;
    }
    &lt;span id="txt" contentEditable="true" oninput="setHighlight(this)"&gt;type a {{token}} here&lt;/span&gt;

    【讨论】:

    • 我希望有人为此编写了某种类型的库,但经过大量搜索,我没有找到任何东西。尽管如此,这是一个非常好的开始,contentEditable 的建议是个好主意。我会试着拿你的样品,看看我能不能让它工作。感谢您的建议!
    猜你喜欢
    • 2016-01-17
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多