BBCode용 마크다운 확장

이 가이드를 사용하여 마크다운 규칙을 작성하여 새로운 bbcode 기능을 구현하는 방법을 배우고자 합니다. 그러나 설명되지 않은 부분이 너무 많아 무슨 일이 일어나고 있는지 따라가기에 큰 어려움을 겪고 있습니다:

markdown-it 문서도 확인해 보았지만, 내용이 매우 간략하며 시스템 기능의 매우 고수준 개요에 머무는 것 같습니다. 구체적인 질문이 몇 가지 있습니다:

  • 가이드에 다음과 같은 줄이 있습니다: // standard markdown it inline extension goes here.
    표준 인라인 확장(standard inline extension)이란 무엇인가요? 이것이 ruler에 push되는 규칙을 정의하는 곳인가요? 왜 false를 반환하나요?

  • 토큰 타입(token types)이란 무엇인가요? 'link_open'이나 'html_inline' 같은 예시를 볼 수 있는데, 이 것들은 어디에서 온 것인가요? 사용 가능한 항목에 대한 정적 목록(static list)이 어딘가에 있나요? 새로운 항목을 추가할 수 있나요? 파서는 이 것들에 대해 무엇을 해야 하는지 어떻게 알까요?

이것은 어떻게 작동하나요? 파서는 'code_inline'이 무엇을 하는지 어떻게 알까요? state.push() 함수는 무엇을 하며, 어떻게 사용하도록 의도된 것인가요?

"이해했다"고 느낄 만큼 가까워진 것 같지만, 몇 가지 개념을 놓치고 있는 것 같습니다. 가장 기본적인 규칙을 작성해 보았고 작동하는 것으로 보이지만, 앞으로 나아가기 위해 더 나은 이해가 필요합니다. 도움이 주시면 감사하겠습니다!

이미 [color] 지원 등을 추가하는 기존 공식 BBCode 플러그인을 확인하지 않는 이유는 무엇인가요?

공식 BBCode 플러그인(GitHub - discourse/discourse-bbcode: vBulletin BBCode plugin · GitHub)을 여러 번 검토해 보았지만, 아직까지 큰 진전이 없으며 내부 작동 방식에 대한 명확한 이해도 부족한 상태입니다.

우선, 시작점으로 [table] bbcode를 구축하고 있습니다. 마크다운은 이미 테이블을 지원하고 있지만, (다른 bbcode에 대한 지원이 가능하다고 가정하면) 약 2,000만 개의 게시물을 Discourse로 마이그레이션할 예정이므로 기존 bbcode에 대한 하위 호환성이 올바르게 작동하도록 해야 합니다. 마크다운에서 파이프 문자가 사용되는 방식 때문에 게시물을 긁어모아(raking) 테이블을 변환하는 것은 사실상 불가능합니다.

현재까지 구축한 테이블 태그는 계속 삭제되고 있습니다. 게시물에는 존재하지만, (추측컨대) 스크리버(scrubber)에 의해 계속 제거되는 것 같습니다. 현재까지 작성한 코드는 다음과 같습니다:

md.block.bbcode.ruler.push("table", {
    tag: "table",
    wrap: function(token, tagInfo) {
      token.attrs = [['class', "bbcode-table table-style-" + tagInfo.attrs['_default']]];
      return true;
    }
  });

helper.whiteList([
    "table.bbcode-table",
    "table.table-style-*"

다른 예제들을 참고하여 화이트리스트와 wrap 함수의 다른 포맷을 시도해 보았지만, 아직까지 아무것도 작동하지 않아 시스템이 어떻게 작동하는지에 대해 제가 이해하지 못하는 근본적인 부분이 있는 것 같습니다. 앞으로 일관되게 문제를 해결할 수 있도록 더 나은 이해를 얻고자 합니다.

표는 만들 수 있는 것 중 아마 가장 복잡한 것일 겁니다. 훨씬 더 간단한 것부터 시작하는 것을 강력히 권장합니다.

사실 작성할 수 있다 해도 bbcode 표 지원을 하는 것을 반대합니다.

@Ghan 님이 설명하신 대로, 우리는 2,000만 명 이상의 규모를 가진 커뮤니티이기 때문에 지원하려는 bbcode 목록이 단순합니다. 우리는 결코 작은 커뮤니티가 아니며, 이 결정은 결코 쉬운 것이 아니었습니다. 하지만 앞으로 우리에게 가장 적합한 소프트웨어가 Discourse라고 판단했습니다. 이미 가져오기(import) 문제를 해결했으며, 이주를 막고 있는 유일한 요인은 이 마지막 단계인 bbcode 변환 방식을 파악하는 것입니다. Discourse나 Markdown이 완전히 지원하는 bbcode는 제거하는 방향으로 마음을 바꿀 수 있습니다. 다만, 테이블은 td, tr 등을 올바른 Markdown 문법으로 대체하는 것이 쉽지 않거나, 제 판단으로는 거의 불가능하기 때문에 Markdown 버전으로 쉽게 재변환(rebake)할 수 없었습니다. 따라서 쉽게 재변환할 수 없더라도 테이블을 제거하는 것은 괜찮습니다. 다만, 어떻게 해야 하는지 배우는 과정 자체가 나머지 모든 문제를 해결하는 데 도움이 될 가능성이 높습니다.

예를 들어 [h1]은 모든 H 태그가 동일한 수의 #로 대체되면 되므로 변경이 확실히 쉬워 제거할 수 있었습니다.

전체 목록은 Making sure you're not a bot! 에 있으며, 이 스레드에 언급된 것 외에도 이미 매우 단순한 find/replace로 Markdown equivalent로 변환할 수 있었던 몇 가지 bbcode는 이미 제거했습니다.

이 게시글이 2020년 것인 걸 알지만, 아무도 답변하지 않았으니(단, "다른 코드를 참고하라"거나 "테이블은 너무 어렵다"는 식의 답변만 있었던 것을 제외하고는) 제가 현재 직접 bbcode 플러그인을 작성하고 있어서 문서가 전혀 없어 고생했던 경험을 바탕으로, 제가 할 수 있는 한 설명을 덧붙이고 싶었습니다.

질문자님의 [table] bbcode 문법을 살펴봤는데, 만들 플러그인으로서 충분히 합리적인 요청입니다. 단순히 감싸는 작업만 하면 되니까요. 솔직히 말씀드리면 sam은 질문자님이 보낸 링크를 제대로 보지 않은 것 같습니다. 질문자님의 테이블 bbcode 형식은 사실상 html 테이블 형식과 거의 동일하며, 단지 bbcode 태그를 사용했을 뿐이니까요.

이 게시글이 이 작업 방식을 조금이나마 이해하는 데 도움이 될 것입니다.

지금 당장 질문자님이 하려는 일을 어떻게 해야 하는지(그리고 실제로 작동하는지 테스트해 보는 것까지) 설명할 시간이 없습니다. 다만, html_raw와 html_block 토큰 유형이 꽤 유용하다는 점은 말씀드릴 수 있습니다. 또한, 실제로 작동하는지 확인하는 가장 좋은 방법은 wrap 함수 안에 console.log()를 넣고, 콘솔에서 실제로 어떤 값이 반환되는지 확인하는 것입니다(이렇게 하면 discourse의 강력한 sanitizer를 걱정하지 않고도 작업이 제대로 되는지 확인할 수 있습니다).

마크다운 확장 기능에서 일부 진전을 이룬 후 새로운 bbcode 플러그인 개발을 시작했지만, 결국 기대했던 만큼 잘 작동하지 않을 것 같다는 결론을 내렸습니다. 이번 여름까지 남은 3개 정도를 정리한 뒤, 곧바로 마이그레이션을 진행할 예정입니다.

다만, 테이블은 bbcode 버전으로 제공되지 않을 가능성이 높으며, 사용자에게는 마크다운 버전을 사용하도록 안내할 예정입니다. 아무도 테이블을 좋아하지 않으니까요.

정말 좋은 것 같아요. bbcode 테이블을 포기하셨다는 건 알지만, 원하신다면 작동하도록 만들 스크립트를 작성하는 데 도움을 드릴 수 있어요.

리포지토리를 직접 확인해 보거나, PR을 보내거나, 하고 싶은 다른 일을 자유롭게 해 주세요 :)!