为了更容易的维护,我将许多HTML块存储在CMS中。它们由<textarea>
表示。
有没有人知道某种JavaScript小部件能够在<textarea>
或类似元素中对HTML进行语法高亮,同时仍然保持纯文本编辑器(无所见即所得或高级功能)?
为了更容易的维护,我将许多HTML块存储在CMS中。它们由<textarea>
表示。
有没有人知道某种JavaScript小部件能够在<textarea>
或类似元素中对HTML进行语法高亮,同时仍然保持纯文本编辑器(无所见即所得或高级功能)?
在常规的<textarea>
中,无法实现所需的演示控制水平。
如果您可以接受这一点,请尝试CodeMirror或Ace或Monaco(用于VS Code)。
请参见维基百科上的基于JavaScript的源代码编辑器比较。
这是我对类似问题所做出的回答(链接1),使用在线代码编辑器(链接2),发布在程序员(链接3)上:
首先,您可以参考这篇文章:
维基百科 ― 基于JavaScript的源代码编辑器比较。
此外,以下是一些看起来符合您需求的工具:
EditArea ― 文件编辑器演示 是一个Yii扩展 ― (Apache软件许可证,BSD,LGPL)
这是EditArea,一个用于源代码的免费JavaScript编辑器。它允许编写格式良好的源代码,具有行号、制表符支持、搜索和替换(使用正则表达式)以及实时语法高亮显示(可自定义)。
CodePress ― Joomla! CodePress插件演示 ― (LGPL) ― 它在Chrome中不起作用,而且看起来开发已经停止了。
CodePress是一款基于Web的源代码编辑器,具有JavaScript编写的语法高亮显示功能,可以在文本在浏览器中输入时进行实时着色。
CodeMirror ― 众多演示之一 ― (MIT-style许可证+可选商业支持)
CodeMirror是一个JavaScript库,可用于为类似代码的内容(计算机程序、HTML标记等)创建相对愉悦的编辑器界面。如果已为您正在编辑的语言编写了模式,代码将被着色,并且编辑器将可选择地帮助您缩进。
Ace Ajax.org Cloud9 Editor ― 演示 ― (Mozilla三重许可证(MPL/GPL/LGPL))
Ace是一个独立的JavaScript代码编辑器。我们的目标是创建一个与现有本机编辑器(如TextMate、Vim或Eclipse)匹配并扩展其功能、易用性和性能的基于Web的代码编辑器。它可以轻松地嵌入任何Web页面和JavaScript应用程序中。Ace是Cloud9 IDE的主要编辑器,并且是Mozilla Skywriter(Bespin)项目的继承者。
在文本域内实际上无法呈现标记语言。
但是,您可以通过仔细地将一个 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>
更新:现在Bespin已经更名为ACE,这也是本文中最高评分答案提到的。请使用ACE。
我选择Mozilla的Bespin。它使用HTML5特性构建(因此速度快,但不支持旧版浏览器),但绝对好用,击败了我所遇到的所有工具 - 可能是因为Mozilla支持它,并且他们开发Firefox,所以...还有一个jQuery插件包含它的扩展功能,使其与jQuery一起使用更加容易。
为什么你要用文本区表示它们?这是我的最爱:
http://alexgorbatchev.com/wiki/SyntaxHighlighter
但是如果你正在使用CMS,可能有更好的插件。例如,WordPress有一个进化版:
http://www.viper007bond.com/wordpress-plugins/syntaxhighlighter/
textarea
更加多才多艺和可扩展? - James Haigh