Textarea, которая может выполнять подсветку синтаксиса на лету?

Я храню несколько HTML-блоков внутри CMS для упрощения обслуживания. Они представлены <textarea>s.

Кто-нибудь знает какой-либо виджет JavaScript, который может выделять синтаксис для HTML в textarea или аналогичном, оставаясь при этом простым текстовым редактором (без WYSIWYG или дополнительных функций)?


person Pekka    schedule 24.10.2009    source источник
comment
Возможно ли, что W3C сможет сделать textarea более универсальным и расширяемым в будущей версии спецификации (X) HTML и связанных стандартов?   -  person James Haigh    schedule 29.08.2013
comment
@ FabienMénager, ваша повторяющаяся ссылка удалена.   -  person Patrick Roberts    schedule 10.06.2015
comment
Это поможет codepen.io/kazzkiq/pen/xGXaKR   -  person Shan Eapen Koshy    schedule 27.08.2015


Ответы (10)


Невозможно достичь необходимого уровня контроля над представлением в обычном textarea.

Если вас это устраивает, попробуйте CodeMirror или Ace или Monaco (используется в MS VSCode) .

Из дублирующей ветки - обязательная ссылка на Википедию: Сравнение редакторов исходного кода на основе JavaScript

person Nickolay    schedule 24.10.2009
comment
Фактически, Беспин использует обычное резервное текстовое поле для добавления поддержки программ чтения с экрана (так что люди с ограниченными возможностями тоже могут легко его использовать). - person Eli Grey; 25.10.2009
comment
CodeMirror выглядит именно так, как мне нужно. Пока он ведет себя как текстовое поле, мне комфортно, что он не таковой. - person Pekka; 25.10.2009
comment
Спасибо за ответ. Нашел это после прочтения вашего ответа и поразил меня! :) github.com/securingsincity/react-ace - person Casey; 21.02.2018

Вот ответ, который я дал на аналогичный вопрос (Онлайн-редактор кода) для программистов:

Во-первых, вы можете взглянуть на эту статью:
Википедия - Сравнение исходного кода на основе JavaScript редакторы.

Для получения дополнительной информации, вот несколько инструментов, которые подходят для вашего запроса:

  • # P4 #
    # P5 #
  • # P6 #
    # P7 #
  • # P8 #
    # P9 #
  • # P10 #
    # P11 #
person Pascal Qyy    schedule 24.02.2012
comment
О, это так удручающе ... Сотня проектов, которые должны это делать, и ни один из них не работает просто так. - person RobinJ; 24.02.2013
comment
Лицензия редактора Ace была изменена на BSD github.com/ajaxorg/ace/blob/master/ ЛИЦЕНЗИЯ - person S.Krishna; 27.07.2017

CodePress делает это, как и EditArea. Оба имеют открытый исходный код.

person Anonymous    schedule 06.02.2011

Я бы порекомендовал EditArea для редактирования текстовой области с синтаксической подсветкой в ​​реальном времени.

person Daniel Bardi    schedule 14.06.2010

Вы можете выделить текст в <textarea>, аккуратно поместив за ним <div>.

ознакомьтесь с Выделением текста внутри текстового поля.

person E99    schedule 10.06.2018

Обновление: Беспин теперь является ACE, что упоминается здесь в самом высоком рейтинге. Вместо этого используйте ACE.

Надо использовать Bespin от Mozilla. Он построен с использованием функций HTML5 (так что он быстрый и быстрый, но не поддерживает устаревшие браузеры), но определенно великолепен в использовании и превосходит все, с чем я сталкивался - вероятно, потому, что его поддерживает Mozilla, и они разрабатывают Firefox, так что да. .. Существует также плагин jQuery, который содержит расширение для него, чтобы сделать его немного проще в использовании с jQuery.

person balupton    schedule 29.07.2010

Единственный известный мне редактор, который имеет подсветку синтаксиса и замену текстового поля, - это Mozilla Bespin. Погуглите, чтобы встроить Bespin, чтобы узнать, как встроить редактор. Единственный известный мне сайт, который использует это прямо сейчас, это альфа-версия Mozilla Jetpack Gallery (в отправьте страницу Jetpack), и вы можете посмотреть, как они ее включают.

Также есть запись в блоге о встраивании и повторном использовании редактора Bespin это может вам помочь.

person Eli Grey    schedule 24.10.2009
comment
Ace является преемником проекта Mozilla Bespin. - person hbd; 06.10.2018

Вы не можете визуализировать разметку внутри текстового поля.

Но вы можете подделать это, аккуратно разместив 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

person A5H1Q    schedule 05.02.2021
comment
По крайней мере, отдать должное, когда его должное заносит, я видел этот точный код где-то еще на сайте. - person Crimin4L; 07.02.2021
comment
Это немного модифицированная версия пера в коде - person A5H1Q; 07.02.2021
comment
В оригинале выделяется фон, а в этом - текст. - person A5H1Q; 07.02.2021

Почему вы представляете их как текстовые поля? Это мой любимый:

http://alexgorbatchev.com/wiki/SyntaxHighlighter

Но если вы используете CMS, вероятно, есть плагин получше. Например, у wordpress есть развитая версия:

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

person Matrym    schedule 24.10.2009
comment
Эти плагины не позволяют выделять синтаксис на лету, как в текстовом поле. - person Fabien Ménager; 25.10.2009
comment
Ссылка не работает. - person mimic; 31.01.2018

Таким образом, мы можем пойти с этим:

Чтобы сэкономить ваше время и энергию, рекомендуется продолжить исследование в этой области.

person Ritesh Aryal    schedule 28.06.2021