Как переопределить функцию buildQuote?

Привет!

Я хотел бы попробовать изменить функцию buildQuote, чтобы она добавляла новую строку перед открывающим тегом [quote].

По сути, изменить это:

  return `[quote="${params.join(", ")}"]\n${contents.trim()}\n[/quote]\n\n`;

на это:

  return `\n[quote="${params.join(", ")}"]\n${contents.trim()}\n[/quote]\n\n`;

Возможно ли сделать что-то подобное с компонентом темы? Как переопределить эту функцию? :smiley:

Мне удалось это реализовать, но есть ли более изящное решение?

<script type="text/discourse-plugin" version="0.8.23">
    function buildQuote(post, contents, opts = {}) {
      if (!post || !contents) {
        return "";
      }
    
      const params = [
        opts.username || post.username,
        `post:${opts.post || post.post_number}`,
        `topic:${opts.topic || post.topic_id}`
      ];
    
      if (opts.full) params.push("full:true");
    
      return `\n[quote="${params.join(", ")}"]\n${contents.trim()}\n[/quote]\n\n`;
    }
    api.modifyClass('controller:composer', {
        actions: {
            importQuote(toolbarEvent) {
              const postStream = this.get("topic.postStream");
              let postId = this.get("model.post.id");
        
              // Если текущего поста нет, используем ID первого поста из потока
              if (!postId && postStream) {
                postId = postStream.get("stream.firstObject");
              }
        
              // Если мы редактируем пост, при импорте цитаты получаем ответ
              if (this.get("model.editingPost")) {
                const replyToPostNumber = this.get("model.post.reply_to_post_number");
                if (replyToPostNumber) {
                  const replyPost = postStream.posts.findBy(
                    "post_number",
                    replyToPostNumber
                  );
        
                  if (replyPost) {
                    postId = replyPost.id;
                  }
                }
              }
        
              if (postId) {
                this.set("model.loading", true);
        
                return this.store.find("post", postId).then(post => {
                  const quote = buildQuote(post, post.raw, {
                    full: true
                  });
        
                  toolbarEvent.addText(quote);
                  this.set("model.loading", false);
                });
              }
            }
        }
    });
</script>

Извините, что поднимаю старую тему, но это у вас всё ещё работает / приходилось ли вам что-то обновлять? Я пытаюсь заставить это работать, но у меня ничего не получается, и я уже совсем запутался во всём, что связано с modifyClass.

Я только что проверил, и это всё ещё работает :+1:

Я буквально скопировал и вставил это в свою тему, и оно сработало без каких-либо изменений.

Смотрите: api.modifyClass sometimes(!) not working - #12 by RGJ

Не уверен, что это уже исправлено?

Также посмотрите на связанную, но другую тему: Issues overriding getters in a controller (3.0.0)

Спасибо @merefield и @Canapin. Я пытаюсь изучить API плагинов Discourse, возясь с тем, что кажется простыми вещами, но modifyClass работает настолько непоследовательно: то срабатывает, то нет. У меня есть небольшой компонент темы (тот самый, о котором вы упоминали, @merefield), где два вызова modifyClass работают, а третий — нет. Очень раздражает пытаться понять, ошибаюсь ли я или проблема именно в modifyClass.

Извините за оффтоп в вашей теме и спасибо за быстрый ответ, @Canapin.

Обновление:

Ничего страшного, я не знаю, что означает ОФТ, но мы здесь, чтобы помочь!