테마 컴포넌트를 사용하여 게시물 편집

게시글 수정 권한이 있는 사용자(TL4 이상)가 텍스트를 선택하여 해당 부분을 코드 블록으로 변환할 수 있도록 하는 아이디어를 떠올리게 되었습니다.

Discourse AI 플러그인 코드의 일부와 제가 사용하는 플러그인 아웃렛에 전달되는 데이터를 참고한 끝에, quote-share-buttons-before 아웃렛을 사용하여 선택된 텍스트를 가져오고 코드 펜스(code fence)로 감싸는 코드를 작성했습니다.

하지만 이제 막혀 있습니다. 체크리스트 플러그인은 checklistSyntax 함수의 postDecorator 인자를 통해 (어떤 방식으로든) 이것을 수행하며, 이를 통해 모델(아마도 post 모델일 것 같습니다)을 .getModel()로 가져올 수 있습니다. 이 인자가 어떻게 전달되는지는 알 수 없으며, 제 환경에서는 사용할 수 없을 것 같습니다.

만약 체크리스트 플러그인에서 실제로 post 모델을 사용하고 있다면, 다음 코드에 사용되는 단순한 ‘save’ 함수가 models/post.js 어디에 있는지 찾는 데 어려움을 겪고 있습니다. 제가 잘못 이해하고 있는 것이 아니라면 말입니다.

await postModel.save({
  raw: newRaw,
  edit_reason: i18n("checklist.edit_reason"),
});

현재 저는 this.args.outletArgs.data.editPost(this.post)를 사용 중입니다(기억이 맞다면 models/topic.js에 있는 함수인데, 틀렸다면 알려주세요). 이 함수는 게시글을 직접 편집하는 것이 아니라 편집기(composer)를 열어 게시글을 수정하게 합니다.

따라서 제 질문은 이렇습니다. 체크리스트 플러그인처럼 매끄럽게 게시글을 편집하려면 어떻게 해야 할까요? 체크리스트가 사용하는 api.decorateCookedElement 대신 아웃렛에 버튼을 넣는 경우에도 이를 수행할 수 있는 방법이 있을까요? 가능하면 REST API를 사용하지 않고 싶습니다.

제 저장소:

감사합니다!

음, 이제 더 가까워진 것 정말 거의 다 온 것 같아.

this.post.save()를 시도해 봤는데 겉보기에는 "동작"하는 것 같아 - PUT 요청이 통과되는 것 같아 (배경에서 ajax를 사용함), 하지만 거의 아무 정보도 없는 어떤 오류가 발생했어. 하지만 이건 이 … 이전의 일이었어.

this.post.save()가 작동해. 유일한 문제는 아래에 나열된 것뿐이야:

내 함수는 이제 이렇게 생겼어:

@action
async addCodeFences() {
  let selectedText = this.selectedText;
  let newText = "```" + "\n" + selectedText + "\n" + "```";

  let post = this.post;
  console.log(this.post.cooked); // 작동함

  let rawPost = post.raw; // 존재하지 않음!!
  console.log(rawPost); // undefined!

  rawPost.replace(selectedText, "\n" + newText + "\n"); // rawPost가 undefined이므로 오류!

  await this.post.save({
    raw: rawPost,
    edit_reason: I18n.t(themePrefix("add_code_fence_edit_reason"))
  });
}

어떤 이유에선지 포스트의 원본(raw) 콘텐츠를 가져올 수 없고, cooked만 가져올 수 있어. ajax 요청을 하는 것 외에는 다른 방법이 있을까? 포스트의 속성 중 raw를 찾을 수가 없는데… 포함되지 않는 이유가 있을까?

P.S. 여기서 Ask Discourse로 문의하지 않으려고 해. 도움이 정말로 고맙겠어!


수정: 각 포스트가 이 API 요청에 기반한 것 같아? 응답에는 raw가 JSON 키 중 하나로 보이지 않는 것 같아 :face_exhaling:.

네, 맞습니다 - 기본 응답에는 raw를 포함하지 않습니다. 일반 렌더링에는 필요하지 않으므로, 포함하면 데이터 전송량/속도 측면에서 다소 비효율적이기 때문입니다.

필요할 때 추가적인 ajax 요청을 보내는 것이 가장 좋은 방법입니다. 찾으신 대로, 체크리스트 플러그인이 이 방식의 좋은 예시입니다.

네, 알겠습니다! 그 ajax 요청을 처리해 보겠습니다.