특정 카테고리(서사 프로젝트 역할극)의 게시글 날짜를 변경하는 방법

안녕하세요. 다가오는 시즌의 근미래 SF 서사 프로젝트에서, 특정 카테고리의 모든 게시물 날짜를 특정 연/월/일로 다시 설정해 보고 싶습니다. 이상하게 들릴 수 있지만, 저희 커뮤니티는 세계관 내 역할극(RP)에 이 플랫폼을 사용하고 있어 실제 연도를 보면 몰입감이 다소 깨지기 때문에 저희 입장에서는 그럴 만한 이유가 있습니다. 기존 플러그인이나 다른 해결책을 찾아보았지만 큰 성과를 내지 못했습니다. 제가 파악한 바로는, 직접 플러그인을 작성하여 플러그인 아웃렛을 통해 날짜를 수정해야 할 것 같습니다. 아이디어나 기존에 활용할 수 있는 도구가 있으신 분 계신가요?

오, 재밌겠다! 이 기능에 대한 기존 솔루션은 아마 없을 테고, 실제 실제 타임스탬프를 변경하는 합당한 이유도 잘 상상되지 않는다. 대신 각 게시물마다 가짜 타임스탬프를 삽입하는 커스텀 테마 컴포넌트를 만들 수 있다.

[wrap] bbcode와 같은 범용 bbcode를 추가할 수 있는데, 이렇게 하면 원하는 게시물에서 아무 [wrap=] bbcode나 사용할 수 있다.

[wrap=timechange time='Apr 1'][/wrap]처럼 설정하면 게시물 자체에 <span class="d-wrap" data-time="Apr 1" data-wrap="timechange"></span>가 생성된다. 그런 다음 decorateCookedElement()를 사용하여 각 게시물에서 [data-wrap="timechange"]를 검색하여 타임스탬프를 변경할지 결정할 수 있다.

타임스탬프 위치에 플러그인 아울렛은 없다고 생각하지만, post-date 앵커 요소 안에 새로운 요소를 삽입하고 CSS를 사용하여 기존 요소를 숨기는 방식으로 구현할 수 있다.

현재 post-date의 구조는 다음과 같다.

<div class="post-info post-date">
  <a class="widget-link post-date" href="..." title="Post date">
    <span title="..." data-time="..." data-format="tiny" class="relative-date">...</span>
  </a>
</div>

.post-info a.post-date를 대상으로 삼아 거기에 span이나 비슷한 새로운 요소를 추가하면 된다. .post-info a.post-date span:first-child { display: none; }와 같은 CSS를 사용하면 실제 타임스탬프를 숨길 수 있다. 앵커 태그를 대상으로 삼아 유지하면 사용자가 이를 정상적으로 계속 사용할 수 있다(공유 기능이 포함되어 있음).

decorateCookedElement()와 연결하면, 이 함수가 쿠크된 게시물의 루트 요소를 제공하므로 element.closest()와 .querySelector()를 사용하여 거기서부터 DOM을 위로 빠르게 검색하여 올바른 .post-info에 도달할 수 있다.

bbcode를 사용하면 카테고리 관계없이 모든 게시물의 시각적 표시를 변경할 수 있다(나와 다른 사용자 모두). 또한 교묘한 CSS를 사용하여 실제로 표시되는 범위를 제한할 수도 있다. body에는 해당 토픽의 카테고리 이름을 가진 .category-* 클래스가 있으므로, CSS를 해당 카테고리들로 제한할 수 있다.

시작하기에 정말 유용한 정보네요. 저희는 각 게시물마다 별도로 설정해야 하는 방식이 아니라, 자동으로 처리되기를 원하고 있어서 BBCode가 꼭 필요한지는 모르겠어요. 다만, 게시물을 렌더링할 때 자동으로 생성해주는 기능이 있다면 작동할 수도 있겠네요. 제안을 꼭 검토해볼게요. 감사합니다!

조금 더 맥락을 설명드리자면, 이 기능은 Neurocracy를 위해 개발하는 것이며, 저희의 Discourse는 talk.omnipedia.app에 있습니다. 이곳에서는 각 세계관 내 날짜별로 하위 카테고리가 있는 ‘추측(Speculation)’ 카테고리를 볼 수 있어요. 저희 커뮤니티는 자연스럽게 미래 위키 사용자들의 관점에서 논쟁을 벌이는 역할극 형태로 발전했습니다.