Страницы

Поиск по вопросам

Показаны сообщения с ярлыком редактор-текста. Показать все сообщения
Показаны сообщения с ярлыком редактор-текста. Показать все сообщения

суббота, 8 февраля 2020 г.

Автоматическая табуляция в NotePad++

#редактор_текста #html #notepad++


Очень часто, работая в NotePad++, приходится вручную табулировать html-файл. В принципе,
это занимает всего 1-2 минуты, но сумарно затрачивается некое время, которое можно
продуктивно использовать на благо работы :)
Есть ли какая-то функция/плагин, который автоматически табулирует html-файл? 

Например:




name



text






    
        
            name
        
    
    
        text
    

    


Ответы

Ответ 1



Для написания кода можете использовать плагин NppAutoIndent(довольно удобно), для автоматического табулирования файлов вы можете использовать плагин IdentByFold. После установки плагина - открываем "плохой файл", жмем - Плагины->Ident By Fold->Reindent File И файл становится хорошим =)

Ответ 2



https://indentbyfold.googlecode.com/files/IndentByFold-071.zip Это прямая ссылка на плагин . Ставить сюда : C:\Program Files (x86)\Notepad++\Plugins\ или сюда : C:\Program Files\Notepad++\Plugins.

Ответ 3



Автоформатирование html - зло. Особенно когда inline-блоки попадутся.

CKEditor: прикрепить файл

#редактор_текста #ckeditor #редактор


Добрый день! Нужно сделать возможность прикрепления файлов. Возможно кто-нибудь сталкивался
с этим? В самом CKE не найду этой функции. У меня используется связка CKEditor + CKFinder.. 
Подскажите, пожалуйста!    


Ответы

Ответ 1



Не понял, в чем проблема? Подключаем ckeditor и ckfinder и загружаем файлы на сервер. Сам недавно подключал. Все без проблем. Сейчас только надо настроить конкретную дерикторию для загрузки файлов. Если надо можем обсудить, подскажу - что смогу.

Ответ 2



Нет! Я решил эту проблему. Нашел информацию на каком-то из сайтов. Сейчас расскажу: Подключаем JS файл на необходимую нам страницу Далее две JS функции: И кнопочка: Добавление файлов происходит в элемент с ID 'attachment'. В примере для добавления используется jQuery

вторник, 7 января 2020 г.

Редактор с разбиением окна на буферы как в vim или emacs

#редактор_текста #vim #emacs #linux


Интересует вопрос - существуют ли редакторы, под Linux, в которых есть возможность
разбить одно окно редактирования файла, на два, как это можно в vim или emacs, потому
что очень часто полезно видеть перед собой одновременно два исходника. 
И ещё хотел бы узнать, чтобы не создавать новый вопрос - чем emacs или vim лучше
(особенно в наше время)? Все говорят, что они настраиваемы до неузнаваемости, но в
чем выражаются эти настройки. Что можно полезного извлечь (для веб-мастера к примеру)
из этих редакторов, чего нет в других? 
P.S. Для себя я пока усвоил только разбиение окна на буферы.    


Ответы

Ответ 1



Из известных мне редакторов под линукс это умеют делать ещё два - QtCreator и Code::Blocks. Это конечно грубо, назвать IDE редактором, но мы же на форуме программистов, здесь в основном для кода и используются редакторы. Эти два умеют как просто сделать "два (и более) окна просмотра одного файла", так и разделить рабочее пространство для редактирования нескольких файлов. Также это умеет делать SublimeText (он платный, если что). Но там эта функция немного специфичная. Нужно в меню View->Layout выбрать способ разделения рабочего пространства, а после этого можно перетаскивать вкладки. Кстати, IDEA также умеет разделять рабочее пространство (меню Window->Editor Tabs). чем emacs или vim лучше (особенно в наше время)? Авторы этих редакторов в свое время поняли, что напихать все в один редактор сложно и не нужно и сделали гибкую систему плугинов (хотя это очень спорный вопрос - в эмаксе это своя модификация лиспа, а в виме ещё до недавно свой язык. Сейчас можно на питоне дописывать, но не полностью все). В других редакторах пытаются втиснуть все и сразу.

суббота, 4 января 2020 г.

Перенос rich текста между редакторами

#cpp #редактор_текста


Подскажите, как переносится форматирование и rich текст при копировании между совершенно
разными редакторами, например Google Docs в браузере и Word на ПК. Что за технология?
Более конкретно: есть html в буфере обмена, надо его преобразовать так, чтобы при
вставке в редактор был уже текст.
    


Ответы

Ответ 1



В буфере обмена данные могут храниться в нескольких представлениях (mime-type) одновременно. Приложение-источник (copy) помещает в буфер отдельную копию данных для каждого из поддерживаемых представлений, а потребитель (paste) выбирает наиболее удобный для себя формат, из тех которые понимает. В некоторых приложениях доступен выбор представления, которое будет использовано (см. Paste Special в ворде). Пример на Qt: QByteArray svg=BOOST_PP_STRINGIZE( Foo ); QImage image; image.loadFromData( svg ); auto*mime=new QMimeData(); mime->setText("Foo"); // Как текст (будет понимать notepad). mime->setData( "text/html" , "Foo" ); // Поймет ворд mime->setData( "image/svg+xml" ,svg ); mime->setImageData( image ); // заполняет сразу несколько графических форматов auto*clip=QApplication::clipboard(); clip->clear(); clip->setMimeData(mime);

среда, 25 декабря 2019 г.

Текстовой редактор: хранение и изменение текста

#cpp #строки #text #редактор_текста


Хочу написать свой текстовой редактор (в образовательных целях). Сразу столкнулся
с такой проблемой как хранить редактируемый текст?

Если в одной переменной типа string, то будет уходить много времени на вставку символов.
Если использовать list, то обращение к произвольному символу будет сложной задачей,
да и выделять память отдельно для каждого символа тоже не хорошо. vector - это считай
почти тоже самое, что и string. Понимаю, что на небольших файл это не имеет особого
значения. Можно также делить редактируемый текст на строки и работать с каждой по отдельности
(как в kilo). Но тут будут проблемы с производительностью, если весь текст это одна
большая строка. Хотелось бы найти универсальное решение.

Как реализована данная функция в других редакторах? Порылся в исходниках vim'a, но
так и не смог найти структур и функций, которые бы за это отвечали.

Буду благодарен как за объяснения возможных способов решения данной задачи, так и
за ссылки на исходные коды других текстовых редакторов с указанием мест где можно найти
способ решения этой задачи.
    


Ответы

Ответ 1



Есть следующая книга: Э.Гамма. Р. Хелм. Приемы объектно-ориентированного проектирования. Паттерны проектирования. Там как раз рассматривается пример проектирования редактора документов. Вам точно туда стоит заглянуть, найдете там много ответов.

вторник, 17 декабря 2019 г.

Навигация каретки в Text Formatter API

#c_sharp #net #wpf #редактор_текста


Используя Text Formatter API в WPF для проектирования простого текстового редактора,
понадобилось добавить управление кареткой. В документации нашёл в описании класса TextLine
методы GetNextCaretCharacterHit, GetPreviousCaretCharacterHit и GetBackspaceCaretCharacterHit.
Но только вот все 3 метода - абстрактные. Примеров их реализации толком и не нашёл
(разве что пару в исходниках .NET). 

Может ли кто-нибудь объяснить/привести пример, что представляет из себя рабочая реализация
этих методов и как они работают? Или же работу с кареткой можно реализовать другим
способом? Буду рад любой помощи!


  P.S.: Ранее я задал такой же вопрос на основном Stackoverflow, но там он уже затерялся.
Так что если считаете этот вопрос полезным и голосуете за него здесь, то, пожалуйста,
проголосуйте и там, если не сложно, ибо так вероятность, что на вопрос ответят, будет
больше. Надеюсь, моя просьба не является некорректной.


UPD:

Кратко о решаемой задаче:
Мне нужно добавить обычную навигацию каретки по тексту, т.е. управление ею клавишами
перемещения курсора, её смещение при удалении и вводе текста (последние два пункта
кое-как реализовал через методы GetCharacterHitFromDistance и GetDistanceFromCharacterHit,
правда всё это как-то кривовато получилось, т.к. в случае смещения каретки при вводе
текста я непосредственно создаю экземпляр CharacterHit, указывая в конструкторе вторым
аргументом (который представляет trailingLength - что это, см. ниже) единицу:
CharacterHit chHit = new CharacterHit(CurrentPosition, 1); (CurrentPosition здесь
просто свойство типа int.


  Что такое trailingLength в данном случае? В документации о trailingLength сказано:
"В случае переднего края значение равно 0. В случае заднего края это значение равно
количеству кодовых точек до следующей допустимой позиции курсора. " Почитав о том,
что такое кодовые точки и о Юникоде в целом, всё становится понятно: большинство часто
используемых символов состоят из одной кодовой точки. Пример составных - комбинирование
символов с диакретическими знаками, например: \u0418\u0306 = Й в Юникоде (хотя \u0419
= Й также).


К слову, я так и не разобрался, как обеспечить корректную работу каретки (то бишь
с использованием тех встроенных методов Get*CaretCharacterHit). Я пробовал хранить
текущую позицию не как int-значение, а как CharacterHit, чтобы пользоваться теми методами
(все они принимают текущий CharacterHit и возвращают новый). Но в итоге всё практически
перестало адекватно работать.
    


Ответы

Ответ 1



методы GetNextCaretCharacterHit, GetPreviousCaretCharacterHit и GetBackspaceCaretCharacterHit Может ли кто-нибудь объяснить/привести пример, что представляет из себя рабочая реализация этих методов и как они работают? реализация GetPreviousCaretCharacterHit. остальные реализации можно найти там же, на http://referencesource.microsoft.com

четверг, 11 июля 2019 г.

WPF, Text Formatter API - Пример реализации абстрактного класса TextSource

Данный вопрос тесно связан с этим. Но ещё раз вкратце о реальной задаче: реализую текстовый редактор с поддержкой форматирования текста (выделение фрагмента текста, изменение гарнитуры его шрифта, размера и т.п.). Для решения сей задачи выбрал Text Formatter. Сейчас же меня интересует реализация текстового хранилища, для чего надо наследовать и реализовать абстрактный класс TextSource. Чтобы разобраться, как это сделать, хотелось бы увидеть какие-то примеры. Желательно, более сложные, нежели в официальном примере


Ответ

Ответ на вопрос получил на форуме MSDN - ссылка. Код примера привожу ниже:
class SampleTextSource : TextSource { string text = "Foo Bar
Next Line";
List spans = new List { new Span { Start = 0, Length = 3, Color = Brushes.Blue }, new Span { Start = 3, Length = 1, Color = Brushes.Black }, new Span { Start = 4, Length = 3, Color = Brushes.Red }, new Span { Start = 7, Length = 1, Color = Brushes.Black }, new Span { Start = 8, Length = 4, Color = Brushes.Green }, new Span { Start = 12, Length = 5, Color = Brushes.Black }, };
class Span { public int Start; public int Length; public Brush Color;
public bool Contains(int index) { return Start <= index && index < Start + Length; } }
public int Length { get { return text.Length; } }
public override TextRun GetTextRun(int textSourceCharacterIndex) { var span = spans.Find(s => s.Contains(textSourceCharacterIndex));
if (span == null) return new TextEndOfParagraph(1);
if (span.Length == 1 && text[span.Start] == '
') return new TextEndOfLine(1);
return new TextCharacters(text, span.Start, span.Length, new SampleTextRunProperties(span.Color)); }
public override TextSpan GetPrecedingText(int textSourceCharacterIndexLimit) { throw new NotImplementedException(); }
public override int GetTextEffectCharacterIndexFromTextSourceCharacterIndex(int textSourceCharacterIndex) { throw new NotImplementedException(); } }
class SampleTextRunProperties : TextRunProperties { private readonly Brush foregroundBrush;
public SampleTextRunProperties(Brush foregroundBrush) { this.foregroundBrush = foregroundBrush; } ...реализация остальных необходимых свойств (можно взять из SDK-примера) }
class SampleTextParagraphProperties : TextParagraphProperties { ...реализация остальных необходимых свойств (можно взять из SDK-примера) }
class SampleTextElement : UIElement { protected override void OnRender(DrawingContext drawingContext) { TextFormatter text = TextFormatter.Create(); SampleTextSource source = new SampleTextSource(); SampleTextParagraphProperties paraProps = new SampleTextParagraphProperties(); int index = 0; double y = 0.0;
while (index < source.Length) { TextLine line = text.FormatLine(source, index, RenderSize.Width, paraProps, null); line.Draw(drawingContext, new Point(0.0, y), InvertAxes.None); index += line.Length; y += line.TextHeight; } } }
SDK-пример можно скачать здесь
Если необходимо, чтобы текст отображался с переносом (а это зачастую и требуется), то нужно, во-первых, в реализации TextParagraphProperties переопределить свойство TextWrapping, а во-вторых, в реализации метода TextRun GetTextRun(int textSourceCharacterIndex) в последнем выражении return использовать следующий фрагмент кода, вместо выше приведённого:
return new TextCharacters(text, textSourceCharacterIndex, span.Length - (textSourceCharacterIndex - span.Start), new SampleTextRunProperties(span.Color));
Это делается для поддержки возможности разбивать span на несколько строк.

воскресенье, 14 апреля 2019 г.

Автоматическая табуляция в NotePad++

Очень часто, работая в NotePad++, приходится вручную табулировать html-файл. В принципе, это занимает всего 1-2 минуты, но сумарно затрачивается некое время, которое можно продуктивно использовать на благо работы :) Есть ли какая-то функция/плагин, который автоматически табулирует html-файл? Например: name text name text


Ответ

Для написания кода можете использовать плагин NppAutoIndent(довольно удобно), для автоматического табулирования файлов вы можете использовать плагин IdentByFold. После установки плагина - открываем "плохой файл", жмем - Плагины->Ident By Fold->Reindent File И файл становится хорошим =)

вторник, 29 января 2019 г.

Перенос rich текста между редакторами

Подскажите, как переносится форматирование и rich текст при копировании между совершенно разными редакторами, например Google Docs в браузере и Word на ПК. Что за технология? Более конкретно: есть html в буфере обмена, надо его преобразовать так, чтобы при вставке в редактор был уже текст.


Ответ

В буфере обмена данные могут храниться в нескольких представлениях (mime-type) одновременно. Приложение-источник (copy) помещает в буфер отдельную копию данных для каждого из поддерживаемых представлений, а потребитель (paste) выбирает наиболее удобный для себя формат, из тех которые понимает. В некоторых приложениях доступен выбор представления, которое будет использовано (см. Paste Special в ворде). Пример на Qt:
QByteArray svg=BOOST_PP_STRINGIZE( Foo ); QImage image; image.loadFromData( svg );
auto*mime=new QMimeData(); mime->setText("Foo"); // Как текст (будет понимать notepad). mime->setData( "text/html" , "Foo" ); // Поймет ворд mime->setData( "image/svg+xml" ,svg ); mime->setImageData( image ); // заполняет сразу несколько графических форматов auto*clip=QApplication::clipboard(); clip->clear(); clip->setMimeData(mime);

понедельник, 29 октября 2018 г.

Навигация каретки в Text Formatter API

Используя Text Formatter API в WPF для проектирования простого текстового редактора, понадобилось добавить управление кареткой. В документации нашёл в описании класса TextLine методы GetNextCaretCharacterHit, GetPreviousCaretCharacterHit и GetBackspaceCaretCharacterHit. Но только вот все 3 метода - абстрактные. Примеров их реализации толком и не нашёл (разве что пару в исходниках .NET).
Может ли кто-нибудь объяснить/привести пример, что представляет из себя рабочая реализация этих методов и как они работают? Или же работу с кареткой можно реализовать другим способом? Буду рад любой помощи!
P.S.: Ранее я задал такой же вопрос на основном Stackoverflow, но там он уже затерялся. Так что если считаете этот вопрос полезным и голосуете за него здесь, то, пожалуйста, проголосуйте и там, если не сложно, ибо так вероятность, что на вопрос ответят, будет больше. Надеюсь, моя просьба не является некорректной.
UPD:
Кратко о решаемой задаче: Мне нужно добавить обычную навигацию каретки по тексту, т.е. управление ею клавишами перемещения курсора, её смещение при удалении и вводе текста (последние два пункта кое-как реализовал через методы GetCharacterHitFromDistance и GetDistanceFromCharacterHit, правда всё это как-то кривовато получилось, т.к. в случае смещения каретки при вводе текста я непосредственно создаю экземпляр CharacterHit, указывая в конструкторе вторым аргументом (который представляет trailingLength - что это, см. ниже) единицу: CharacterHit chHit = new CharacterHit(CurrentPosition, 1); (CurrentPosition здесь просто свойство типа int.
Что такое trailingLength в данном случае? В документации о trailingLength сказано: "В случае переднего края значение равно 0. В случае заднего края это значение равно количеству кодовых точек до следующей допустимой позиции курсора. " Почитав о том, что такое кодовые точки и о Юникоде в целом, всё становится понятно: большинство часто используемых символов состоят из одной кодовой точки. Пример составных - комбинирование символов с диакретическими знаками, например: \u0418\u0306 = Й в Юникоде (хотя \u0419 = Й также).
К слову, я так и не разобрался, как обеспечить корректную работу каретки (то бишь с использованием тех встроенных методов Get*CaretCharacterHit). Я пробовал хранить текущую позицию не как int-значение, а как CharacterHit, чтобы пользоваться теми методами (все они принимают текущий CharacterHit и возвращают новый). Но в итоге всё практически перестало адекватно работать.


Ответ

методы GetNextCaretCharacterHit, GetPreviousCaretCharacterHit и GetBackspaceCaretCharacterHit Может ли кто-нибудь объяснить/привести пример, что представляет из себя рабочая реализация этих методов и как они работают?
реализация GetPreviousCaretCharacterHit остальные реализации можно найти там же, на http://referencesource.microsoft.com