JavaScript редактор текста для SVG
Рис 1. Текстовый редактор SVG с поддержкой выделения, копирования, вставки. Работает на пк и мобильных.
Demo | GitHub
<< предыдущая статья
Статья про редактор текста как на рисунке. Исходный код прилагается.
Многострочный текст в SVG
В SVG нет символа переноса строки. Для многострочного текста в SVG используется
Рис 2. Многострочный текст, третья строка пустая
Line 1
Line 2
Line 4
Листинг 1. Многострочный текст в SVG. Третья строка пустая. Высота строки 20 px.
Положение элементов
Расчетов атрибута «y» можно избежать. Листинг 2 дает тот же результат. Используется атрибут «dy» с фиксированным значением. «dy» указывает положение относительно предыдущего элемента.
Line 1
Line 2
.
Line 4
Листинг 2. Многострочный текст в SVG. Третья строка пустая. Высота строки 20 px. Отступ задается относительно предыдущего элемента.
Формируем многострочную разметку на JavaScript
Функция ниже делает разметку с фиксированным атрибутом «dy». Разметка получается как в листинге 2.
/**
* create multiline tspan markup
* @param {string} str
* @param {number} lineHeight
* @returns {string}
*/
function svgStrToTspan(str, lineHeight) {
return str.split('\n').map((t, i) => {
return `
${t.length === 0
? '.'
: escapeHtml(t).replaceAll(' ', ' ')}
`;
}).join('');
}
Листинг 3. Функция делает многострочную разметку
На рисунке 1 при добавлении строки текст смещается вверх. Таким образом текст всегда по центру круга. Листинге 4 показывает как это реализовано:
/**
* @param {SVGTextElement} textEl target text element
* @param {string} str
* @param {{lineHeight:number, verticalMiddle?:number}} param
* @returns {void}
*/
export function svgTextDraw(textEl, str, param) {
textEl.innerHTML = svgStrToTspan(str, param.lineHeight);
if (param.verticalMiddle != null) {
textEl.y.baseVal[0].value =
param.verticalMiddle - textEl.getBBox().height / 2;
}
}
Листинг 4. Функция вставляет текст в SVG. При указании verticalMiddle текст центрируется по вертикали.
Редактор текста
Редактор должен поддерживать все стандартные возможности:
навигацию по тексту, выделение, вставку, копирование;
автозамену, проверку правописания;
работать на пк и мобильных.
Для стандартных возможностей есть стандартная
Алгоритм работы редактора:
Прозрачная
При вводе вызывается svgTextDraw из листинга 4;
Размеры и положение
пересчитываются.
Алгоритм реализован в функции textareaCreate. Код функции в отдельном файле на GitHub.
Редактор можно сделать для любого элемента
const textEditor = textareaCreate(
// {SVGTextElement}
textEl,
// text params
{ lineHeight: 20, verticalMiddle: 10 },
// init value
'init text',
// onchange
val => {...},
// onblur
val => {...});
…
// delete textarea
textEditor.remove();
Листинг 5. Создание редактора текста для
Другие статьи про dgrm.net
Как поддержать проект
Начните использовать редактор блок схем Dgrm.net.
Расскажите что думаете. Любым способом: комментарии, личные сообщения, на GitHub.
Все читаю, веду список предложений.Расскажите знакомым.
Ставьте звездочки на GitHub.