Нужна помощь с **getSelected** и **replace** из Toolbarevent

Я пытаюсь написать простой компонент кнопки, который вызывает функцию toUni для обработки либо всего текста, либо выделенного текста (выделенный вариант предпочтительнее). Я могу создать простую кнопку по примеру из руководства, обработать весь текст в редакторе и добавить обработанный текст обратно в редактор. (В результате получается дублирование текста).

Как заменить весь текст в окне редактора (после обработки)?
Как получить выделенный текст из окна редактора?
Как заменить выделенный текст в окне редактора (после обработки)?

Я вижу некоторый код, где используются:

    getSelected();
     replaceText();

Но при попытке использовать e.getSelected(); или e.replaceText(old, new); ничего не работает. Я предполагаю, что возникает несоответствие функций или ошибка, так как мое всплывающее окно с уведомлением (alert) не появляется.

Я успешно использую getText(); и addText() из вашего кода в репозитории здесь. Однако я не могу понять, как удалить содержимое после обработки, чтобы затем использовать addText() и заменить всё.

Но я предпочитаю находить выделенный текст и заменять его.

В настоящее время мой код ниже добавляет вторую копию всего текста редактора сразу под оригиналом с некоторыми изменениями. Это сбивает пользователя с толку.

Мне нужно либо полностью заменить весь текст, либо обрабатывать только «выделенные» слова (или оба варианта).

Я создал рабочую версию здесь

 


<script type="text/discourse-plugin" version="0.8">

  api.onToolbarCreate(function(toolbar) {
      
    toolbar.addButton({

      trimLeading: true,
      id: "buttonID",
      group: "insertions",
      label: "Pāḷi", // почему это отображается как en.pali?
      title: "add pali",  
      perform: function(e) {
      const sel = e.getText();
      //alert(sel);
      const vel = toUni(sel);
        return   e.addText("\n--------------------new text--------------------\n" + vel + "\n--------------------end text--------------------");
      }
    });
  });
      //e.replaceText(sel,"hello");
      //e.replaceSeelc
  
      //const  sel = e.selected();
     
      //let txt = "hello"; 
      //const sel = e.getSelected(0,100 );
  
function toUni(input) {
	if(!input || input == '') return input;
	//var nigahita = (DPR_prefs['nigahita']?'ṁ':'ṃ');
	//var Nigahita = (DPR_prefs['nigahita']?'Ṁ':'Ṃ');

	var nigahita = 'ṃ';
	var Nigahita = 'Ṃ';

	input = input.replace(/aa/g, 'ā').replace(/ii/g, 'ī').replace(/uu/g, 'ū').replace(/\.t/g, 'ṭ').replace(/\.d/g, 'ḍ').replace(/\"nk/g, 'ṅk').replace(/\"ng/g, 'ṅg').replace(/\.n/g, 'ṇ').replace(/\.m/g, nigahita).replace(/\u1E41/g, nigahita).replace(/\~n/g, 'ñ').replace(/\.l/g, 'ḷ').replace(/AA/g, 'Ā').replace(/II/g, 'Ī').replace(/UU/g, 'Ū').replace(/\.T/g, 'Ṭ').replace(/\.D/g, 'Ḍ').replace(/\"N/g, 'Ṅ').replace(/\.N/g, 'Ṇ').replace(/\.M/g, Nigahita).replace(/\~N/g, 'Ñ').replace(/\.L/g, 'Ḷ').replace(/\.ll/g,'ḹ').replace(/\.r/g,'ṛ').replace(/\.rr/g,'ṝ').replace(/\.s/g,'ṣ').replace(/"s/g,'ś').replace(/\.h/g,'ḥ');

	return input;
}
  
</script>
  

Есть ли какая-либо справочная документация по API?

Мои навыки работы с API ещё только формируются, поэтому, возможно, я что-то неправильно понял, но вы ищете как провести реверс-инжиниринг API Discourse?

Я не уверен, что это то, что мне нужно. Мне просто нужно вызвать несколько функций JavaScript. Мне кажется, я вижу их, но toolevent предоставляет доступ только к небольшому набору вызовов.

Я могу использовать gettext и addtext, но больше ничего.
Я ищу функции, которые имитируют следующую функциональность:
getselectedtext
replaceselectedtext

Думаю, это должно быть доступно.

Я действительно думал, что это довольно маловероятно. :slightly_smiling_face: Я увидел «справку по API» и решил рискнуть.

Думаю, мой крайне неточный ответ уже выдал мою неопытность в этой области, но (на свой страх и риск, сделав то же самое ещё раз :slight_smile:) — в статье Developing Discourse Themes & Theme Components есть несколько полезных общих советов, если вы её ещё не видели?

Но надеюсь, что появится кто-то более knowledgeable и сможет предложить что-то действительно полезное. :crossed_fingers: :slight_smile:

Ну… я немного прошел по этому руководству. Именно так я дошел до части с кнопками. Надеюсь, кто-нибудь ответит, как получить getSelected и заменить replaceSelected из класса события панели инструментов.