文本区域,可以做语法高亮在飞行?

为了便于维护,我在CMS中存储了许多HTML块。它们由__abc表示。

有人知道某种JavaScript小部件,可以在textarea或类似的HTML中做语法高亮显示,同时仍然是纯文本编辑器(没有所见即所见或高级功能)吗?

207207 次浏览

为什么要将它们表示为文本区域?这是我最喜欢的:

http://alexgorbatchev.com/wiki/SyntaxHighlighter

但如果你使用的是CMS,可能有更好的插件。例如,wordpress有一个进化的版本:

http://www.viper007bond.com/wordpress-plugins/syntaxhighlighter/

在常规textarea中实现对表示的所需级别的控制是不可能的。

如果你觉得没问题,试试CodeMirror王牌摩纳哥(在MS VSCode中使用)。

来自重复的线程-一个强制性的维基百科链接:基于javascript的源代码编辑器比较

我所知道的唯一具有语法高亮显示和回退到文本区域的编辑器是Mozilla Bespin。谷歌来嵌入Bespin,以了解如何嵌入编辑器。我所知道的唯一一个使用这个的网站现在是非常alpha Mozilla Jetpack图库(在提交一个Jetpack页面),你可能想看看他们是如何包括它的。

还有一个关于嵌入和重用Bespin编辑器的博文可以帮助你。

我建议使用EditArea来实时编辑语法高亮显示的文本区域。

更新: Bespin现在是ACE,这是在这里最高评分的答案中提到的。使用ACE代替。

Mozilla必须使用Bespin。它是用HTML5的特性构建的(所以它又快又快,但不支持传统浏览器),但使用起来绝对令人惊叹,打败了我遇到的所有东西——可能是因为它是Mozilla支持的,他们开发了Firefox,所以是的……还有一个jQuery插件,它包含了一个扩展使它更容易与jQuery一起使用。

CodePress做到这一点,就像EditArea一样。两者都是开源的。

下面是程序员上的我对类似问题的回答 (在线代码编辑器):

首先,你可以看看这篇文章 Wikipedia -基于javascript的源代码编辑器的比较 . < / p >

为了了解更多,这里有一些工具似乎适合你的要求:

  • EditArea - Demo as FileEditor谁是一个Yii扩展 - (Apache软件许可证,BSD, LGPL)

    这是EditArea,一个免费的javascript源代码编辑器。它允许编写格式良好的源代码与行编号,制表符支持,搜索&Replace(使用regexp)和实时语法高亮显示(可定制)。

    李< /引用> < / >
  • CodePress - Joomla演示!CodePress插件< / em > - (LGPL) -它在Chrome中不起作用,看起来开发已经停止。

    CodePress是基于web的源代码编辑器,使用JavaScript编写的语法高亮显示,当在浏览器中输入文本时,可以实时为文本着色。

    李< /引用> < / >
  • CodeMirror - 众多demo中的一个 - ( mit风格许可+可选商业支持)

    CodeMirror是一个JavaScript库,可用于为类似代码的内容(计算机程序、HTML标记等)创建一个相对友好的编辑器界面。如果已经为您正在编辑的语言编写了模式,则代码将被着色,编辑器将可选地帮助您使用缩进

    李< /引用> < / >
  • Ace Ajax.org Cloud9编辑器 - < em > < / em >演示 - (Mozilla三许可证(MPL/GPL/LGPL))

    Ace是一个用JavaScript编写的独立代码编辑器。我们的目标是创建一个基于网络的代码编辑器,它可以匹配并扩展现有本地编辑器(如TextMate、Vim或Eclipse)的功能、可用性和性能。它可以很容易地嵌入到任何网页和JavaScript应用程序中。Ace是作为Cloud9 IDE的主要编辑器开发的,也是Mozilla Skywriter (Bespin)项目的继承者。

    李< /引用> < / >

你可以在<textarea>突出文本,使用一个小心地放在后面的<div>

检查突出文本区域内的文本

你不能在文本区域中渲染标记。

但是,你可以通过小心地在文本区域后面放置一个div并在那里添加高亮标记来伪造它。

JavaScript负责同步内容和滚动位置。

var $container = $('.container');
var $backdrop = $('.backdrop');
var $highlights = $('.highlights');
var $textarea = $('textarea');
var $toggle = $('button');




var ua = window.navigator.userAgent.toLowerCase();
var isIE = !!ua.match(/msie|trident\/7|edge/);
var isWinPhone = ua.indexOf('windows phone') !== -1;
var isIOS = !isWinPhone && !!ua.match(/ipad|iphone|ipod/);


function applyHighlights(text) {
text = text
.replace(/\n$/g, '\n\n')
.replace(/[A-Z].*?\b/g, '<mark>$&</mark>');


if (isIE) {
// IE wraps whitespace differently in a div vs textarea, this fixes it
text = text.replace(/ /g, ' <wbr>');
}


return text;
}


function handleInput() {
var text = $textarea.val();
var highlightedText = applyHighlights(text);
$highlights.html(highlightedText);
}


function handleScroll() {
var scrollTop = $textarea.scrollTop();
$backdrop.scrollTop(scrollTop);


var scrollLeft = $textarea.scrollLeft();
$backdrop.scrollLeft(scrollLeft);
}


function fixIOS() {
$highlights.css({
'padding-left': '+=3px',
'padding-right': '+=3px'
});
}


function bindEvents() {
$textarea.on({
'input': handleInput,
'scroll': handleScroll
});
}


if (isIOS) {
fixIOS();
}


bindEvents();
handleInput();
@import url(https://fonts.googleapis.com/css?family=Open+Sans);
*,
*::before,
*::after {
box-sizing: border-box;
}


body {
margin: 30px;
background-color: #fff;
caret-color: #000;
}


.container,
.backdrop,
textarea {
width: 460px;
height: 180px;
}


.highlights,
textarea {
padding: 10px;
font: 20px/28px 'Open Sans', sans-serif;
letter-spacing: 1px;
}


.container {
display: block;
margin: 0 auto;
transform: translateZ(0);
-webkit-text-size-adjust: none;
}


.backdrop {
position: absolute;
z-index: 1;
border: 2px solid #685972;
background-color: #fff;
overflow: auto;
pointer-events: none;
transition: transform 1s;
}


.highlights {
white-space: pre-wrap;
word-wrap: break-word;
color: #000;
}


textarea {
display: block;
position: absolute;
z-index: 2;
margin: 0;
border: 2px solid #74637f;
border-radius: 0;
color: transparent;
background-color: transparent;
overflow: auto;
resize: none;
transition: transform 1s;
}


mark {
border-radius: 3px;
color: red;
background-color: transparent;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container">
<div class="backdrop">
<div class="highlights"></div>
</div>
<textarea>All capitalized Words will be highlighted. Try Typing to see how it Works</textarea>
</div>

原笔:https://codepen.io/lonekorean/pen/gaLEMR

总之,以下是我们可以选择的:

为了节省您的时间和精力,最好在这些范围内进一步调查。

这可以通过在textarea前面添加一个覆盖code块来实现,并使用它来应用其他几个人提到的语法高亮显示。

然而,有一些边缘情况需要注意。 本文将详细介绍它们: https://css-tricks.com/creating-an-editable-textarea-that-supports-syntax-highlighted-code < / p > 值得庆幸的是,作者将其创建为自定义元素 https://github.com/WebCoder49/code-input < / p > < p >用法的例子 https://codepen.io/WebCoder49/pen/jOypJOx < / p >

demo of content editable