如何使用极其简单的突出显示规则来突出显示单个文本区域的最佳语法?
基于Javascript的代码编辑器庞大而且臃肿 - 我不想要多行编辑,行号或类似的东西。只是简单的东西解析输入的文本,并允许格式化。
例如,如果用户正在创建消息模板并且具有可用的令牌firstName
和lastName
,并且有一个HTML单行输入字段可用,如果他们键入:
Hello, {{firstName}} {{lastName}}!
将样式(颜色,边框等)应用于定义明确的标记,同时仍允许用户编辑整个文本字符串的最佳方法是什么?
好吧,我有一个我创建的功能,当它在[...]
内部时突出显示单词,我为你做了调整然后它得到了{{...}}
里面的内容。
但问题是,您无法在输入字段中设置HTML,因此您无法在输入或textareas中以简单的方式突出显示单词,您需要将高位文本添加到另一种元素。
一个可能的解决方案是,有一个div
与contentEditable=true
,所以也许更容易在同一输入中键入和突出显示。
如果你正在寻找的话,请查看以下代码(基于简单输入,而不是contentEditable div)。
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;
}
<span id="txt" contentEditable="true" oninput="setHighlight(this)">type a {{token}} here</span>