提问人:Pekka 提问时间:10/25/2009 最后编辑:Volker E.Pekka 更新时间:5/17/2023 访问量:216915
Text区域可以即时进行语法突出显示?
Textarea that can do syntax highlighting on the fly?
问:
为了便于维护,我在 CMS 中存储了许多 HTML 块。它们用 s 表示。<textarea>
有没有人知道某种 JavaScript 小部件,它可以在 HTML 或类似内容中对 HTML 进行语法高亮显示,同时仍然保持纯文本编辑器(没有所见即所得或高级功能)?textarea
答:
为什么要将它们表示为文本区域?这是我的最爱:
http://alexgorbatchev.com/wiki/SyntaxHighlighter
但是,如果您使用的是 CMS,则可能有一个更好的插件。例如,wordpress 有一个进化版本:
http://www.viper007bond.com/wordpress-plugins/syntaxhighlighter/
评论
在常规 <textarea>
中,不可能实现对演示文稿所需的控制级别。
如果你对此感到满意,请尝试 CodeMirror 或 Ace 或 Monaco(在 VS Code 中使用)。
请参阅维基百科上的基于 JavaScript 的源代码编辑器的比较。
评论
据我所知,唯一具有语法高亮和回退到文本区域的编辑器是 Mozilla Bespin。谷歌嵌入 Bespin 看看如何嵌入编辑器。据我所知,目前唯一使用它的网站是非常阿尔法的Mozilla Jetpack Gallery(在提交Jetpack页面中),您可能想看看它们是如何包含它的。
还有一篇关于嵌入和重用 Bespin 编辑器的博客文章可能会对您有所帮助。
评论
我建议使用 EditArea 对语法突出显示的文本区域进行实时编辑。
更新:Bespin 现在是 ACE,这里评分最高的答案提到了这一点。请改用 ACE。
必须选择Mozilla的Bespin。它是使用 HTML5 功能构建的(所以它又快又快,但不支持传统浏览器),但绝对令人惊叹,并且击败了我遇到的一切 - 可能是因为它是 Mozilla 支持的,他们开发了 Firefox,所以是的......还有一个jQuery插件,其中包含一个扩展,使其更容易与jQuery一起使用。
CodePress 和 EditArea 都这样做。两者都是开源的。
首先,你可以看看这篇文章:
维基百科 ― 基于 JavaScript 的源代码编辑器的比较。
有关更多信息,以下是一些似乎适合您要求的工具:
EditArea ― 作为 Yii 扩展的 FileEditor 演示 ― (Apache Software License, BSD, LGPL )
这里是 EditArea,一个免费的源代码 javascript 编辑器。它允许编写格式良好的源代码,包括行 numerotation、制表符支持、搜索和替换(使用正则表达式)和实时语法突出显示(可定制)。
CodePress ― Joomla的演示!CodePress 插件 ― (LGPL) ― 它在 Chrome 中不起作用,看起来开发已经停止。
CodePress 是基于 Web 的源代码编辑器,其语法突出显示是用 JavaScript 编写的,可在浏览器中键入文本时实时着色。
CodeMirror ― 众多演示之一 ― (MIT 风格的许可证 + 可选的商业支持)
CodeMirror 是一个 JavaScript 库,可用于为类似代码的内容(计算机程序、HTML 标记等)创建相对愉快的编辑器界面。如果已针对您正在编辑的语言编写了模式,则代码将着色,编辑器将选择性地帮助您缩进
Ace Ajax.org Cloud9 Editor ― 演示 ― (Mozilla tri-license (MPL/GPL/LGPL))
Ace 是一个用 JavaScript 编写的独立代码编辑器。我们的目标是创建一个基于 Web 的代码编辑器,它匹配并扩展现有原生编辑器(如 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
评论
总而言之,这些是我们可以选择的:
- 突出显示 .js
- 棱镜.js &
- 微光.js
- 谷歌漂亮的印刷品
- Pygments.org
- Hilite.me
- 微光.js
- 否则,您可以尝试轻量级的自定义 - https://css-tricks.com/creating-an-editable-textarea-that-supports-syntax-highlighted-code/
为了节省您的时间和精力,最好在这些范围内进一步调查。
这可以通过在 textarea 前面添加一个覆盖块来实现,并使用它来应用语法高亮,正如其他几个人所提到的。code
但是,有一些边缘情况需要注意。 本文详细介绍了它们: https://css-tricks.com/creating-an-editable-textarea-that-supports-syntax-highlighted-code
值得庆幸的是,作者已将其创建为自定义元素 https://github.com/WebCoder49/code-input
下一个:仅限 CSS 的砌体布局
评论
textarea