나만의 스타일로 게시물 내용을 커스터마이징하기

요구 사항

:information_source: 이 팁과 트릭을 사용하려면 자체 호스팅 Discourse 인스턴스 또는 Basic보다 높은 Discourse 호스팅 플랜의 관리자가여야 합니다.

소개

Discourse는 게시물의 내용을 포맷팅하고 커스터마이징하는 여러 방법을 지원합니다. 목록은 여기서 확인할 수 있습니다:

하지만 때로는 버튼처럼 보이는 링크와 같이 더 구체적인 것이 필요할 수 있습니다.

Green button

이 가이드에서는 이러한 종류의 수정 사항을 배웁니다.

논리 구조

뒤에 있는 논리를 간략히 설명하겠습니다. 다음 단계로 건너뛰어 실용적인 예제를 바로 살펴볼 수도 있습니다. :slight_smile:

Discourse는 게시물 콘텐츠에서 data-로 시작하는 모든 HTML 속성을 허용합니다.
이러한 속성들은 CSS를 통해 콘텐츠를 커스터마이징할 때 대상이 됩니다.

이 튜토리얼에서는 이를 data- 속성이라고 부르겠습니다. :slight_smile:

이러한 속성을 가진 요소를 만드는 방법 중 하나는 BBcode와 유사한 태그인 [wrap]를 사용하는 것입니다. 여기에 원하는 값을 추가합니다. 여기서는 "button"을 선택했습니다(이것은 무엇이든 될 수 있으며, 심지어 당신의 강아지 이름일 수도 있습니다 :dog:):

[wrap=button]some text[/wrap]

이것은 다음 속성을 가진 HTML 요소를 출력합니다: data-wrap="button".

첫 번째 예제: 분홍색 배경

실용적인 예제로 시작해 보겠습니다. 분홍색 배경을 가진 텍스트를 만들어 보겠습니다.

블록 요소로

게시물에서 빈 줄에 다음을 입력하세요:

[wrap=pink]pink text[/wrap]

이것은 data-wrap="pink" 속성을 가진 div 요소를 생성합니다.

그런 다음, 다음 CSS를 테마에 추가하세요.
관리자 패널 → 커스터마이징 → 테마 → 내 테마 → CSS/HTML 편집 → CSS 로 이동합니다.

다음과 같은 CSS 코드를 입력하세요:

[data-wrap="pink"] {
  background: pink;
}

그런 다음 저장 버튼을 클릭하세요.

게시물로 돌아가서 결과를 확인해 보세요:

네, 이미 아름답습니다. :cherry_blossom:

배경이 게시물의 전체 폭을 덮는 것을 알 수 있을 것입니다. 우리의 wrap이 해당 줄의 유일한 요소이기 때문에 블록 요소로 출력됩니다.
블록인라인 HTML 요소의 차이에 대해서는 여기서 더 자세히 배울 수 있습니다: HTML Block and Inline Elements.

여러 줄에 걸쳐 분홍색 배경을 원한다면(여전히 블록으로), [wrap] 태그가 같은 줄에 다른 콘텐츠나 텍스트가 없어야 합니다:

[wrap=pink]
pink text
pink text
pink text
pink text
[/wrap]

이것은 다음과 같이 보입니다:

인라인 요소로

이제, [wrap] 앞에, 뒤에, 또는 양쪽에 텍스트를 추가해 보겠습니다. :smile: 예를 들어:

Here is some [wrap=pink]pink text[/wrap] and it's awesome ✨

다음은 결과입니다:

텍스트나 다른 요소가 [wrap] 태그 중 하나와 같은 줄에 있으면, 그것은 인라인 요소로 출력됩니다.

두 번째 예제: 버튼 모양의 링크

[wrap] 태그를 다룰 때 맥락에 따라 블록 또는 인라인 요소가 될 수 있기 때문에, 다양한 이유로 원치 않는 결과가 나올 수 있습니다.
따라서 동일한 결과를 달성하는 두 가지 다른 방법을 설명하겠습니다. 가장 마음에 드는 방법을 선택할 수 있습니다. :v:

[wrap]를 사용한 인라인 버튼 링크

마크다운을 사용하여 링크를 만드는 문법은 다음과 같습니다: [some text](https://some-link.etc).
텍스트를 커스터마이징하여 버튼처럼 보이게 하려면, 대괄호 안에 wrap을 삽입합니다. 다음은 예제입니다:

This [[wrap=button]nice link[/wrap]](https://discourse.org/) is a blue button 🐳 !

이 코드가 무엇을 출력하는지에 대해 언급하지 않겠습니다. [wrap=button]을 작성했으므로 CSS에서 [data-wrap="button"]을 대상으로 해야 한다는 것을 알고 있기 때문입니다.

자, 가자, 멋있는 CSS를 추가하여 예쁘게 만들어 보겠습니다! :sparkles:

[data-wrap="button"] {
  display: inline-block;
  padding: 0.5em 1em;
  background: DodgerBlue;
  color: White;
}

여기서는 CSS 규칙을 자세히 설명하지 않겠습니다. 인터넷에는 많은 CSS 리소스가 있으므로, 더 구체적인 수정을 하려면 먼저 학습이 필요합니다. :slight_smile:

결과 :magic_wand: :

좋아 보이죠?

일반 HTML 콘텐츠를 사용한 인라인 버튼 링크

Discourse가 HTML 코드를 허용하므로, [wrap] 태그를 사용하지 않고 data- 속성을 가진 HTML을 사용할 수 있습니다. 이 예제에서는 링크에 대한 일반 마크다운 문법을 사용하고 <span> 태그로 감싸겠습니다.
:information_source: <a> 태그는 예외 사항이므로 data- 속성을 허용하지 않아 직접 사용할 수 없습니다.

다음과 같이 입력하세요:

This <span data-button>[link](https://discourse.org/)</span> is a green button 🐸 !

이것은 data-button 속성을 가진 <span> 태그 안쪽에 링크를 출력하므로, CSS가 약간 더 복잡해집니다. data-button과 링크 모두를 대상으로 해야 합니다:

[data-button] {
  display: inline-block;
  padding: 0.5em 1em;
  background: ForestGreen;
  a {
    color: White;
  }
}

그리고 이것이 결과입니다!

더 나아가기

[wrap]를 사용한 커스터마이징된 목록

[wrap] 태그와 data- 속성은 많은 컨텍스트에서 사용할 수 있으며, 더 고급 콘텐츠를 커스터마이징할 수 있습니다. 한계는 주로 CSS 지식(그리고 HTML은 그보다 적은 정도)입니다.

설명 없이 하나의 예제만 제시하겠습니다. 각 요소 앞에 고양이 이모지가 붙는 목록을 커스터마이징하는 것입니다:

텍스트:

[wrap=cat]

- Felix
- Garfield
- Nat's cat
  [/wrap]

CSS:

[data-wrap="cat"] ul {
  list-style: none;
  li:before {
    content: "🐈";
    margin-right: 0.25em;
  }
}

결과:

사용자 정의 테마 색상 변수 사용

사용자가 다른 테마나 색상을 사용할 수 있도록 허용한 경우, 특히 라이트와 다크 컬러 스키마를 선택할 수 있는 경우, 수정 사항이 모든 테마에서 잘 보이지 않을 수 있습니다.

좋은 관행은 red, #FF0000 또는 rgb(255,0,0)와 같이 "하드코딩"된 색상 대신 Discourse의 색상 변수를 사용하는 것입니다.

다음은 버튼의 배경색이 현재 팔레트의 기본 색상을 사용하고, 텍스트가 보조 색상을 사용하는 예제입니다:

텍스트:

This [[wrap=button]nice link[/wrap]](https://discourse.org/) is a button 🌈 !

CSS:

[data-wrap="button"] {
  display: inline-block;
  padding: 0.5em 1em;
  background: var(--primary);
  color: var(--secondary);
}

Solarized Light 컬러 스키마를 사용하는 사용자에게는 다음과 같이 보입니다:

그리고 Solarized Dark 컬러 스키마를 사용하는 경우:

결론

이제 [wrap] 요소와 data- 속성을 사용하여 사용자 정의 요소를 만드는 기본기를 갖추었습니다.

더 고급스러운 커스터마이징을 하려면 CSS 학습이 필수적입니다. 인터넷에서 많은 튜토리얼을 찾을 수 있습니다.

다음과 같은 Discourse 가이드도 도움이 될 수 있습니다: Making custom CSS changes on your site.
인터넷 브라우저의 개발자 도구를 사용하면 Discourse의 색상 변수 목록과 각 변수의 모습을 쉽게 확인할 수 있습니다:


:raised_hand_with_fingers_splayed: 이 가이드에 대한 수정 사항을 제안하는 것을 주저하지 마세요!


이 문서는 버전 관리됩니다 - 변경 사항을 github에서 제안하세요.

23개의 좋아요

Thank you @Canapin

A good example of a Theme Component using some of these concepts is this one:

4개의 좋아요

Nice work!

Im curious to see what other creative solutions users come up with using the data attribute.


Is there any advantage of using HTML <span data-button> over BBCode [wrap="button"] ?

2개의 좋아요

Without having thought about it too much, I’d say using a <span> allows you to put an inline element as the only content on a single line.

Using a [wrap] on a single line without any other content next to it will automatically output a block element. The text inside will also be wrapped with paragraph <p> tags.

Other than that, it’s probably a matter of taste. I also didn’t mention that a [wrap] and an HTML element can have multiple -data attributes as I don’t think it’s very useful for most purposes.

3개의 좋아요

How to add Bootstrap “Cards” in your Posts/Topics

…some might say this is crazy, to complicated, or overboard but I love it :smiley:

  • Added some colours to better see the nesting of the BBCode.

STOP! Don’t use my code

Instead, use the improved code posted by @Canapin CLICK HERE

BBCode to include in Topic/Post

[wrap="card"]
[wrap="card-header"]**Card Header**[/wrap]
[wrap="card-body"]
[wrap="card-title"]**Card Title**[/wrap]
[wrap="card-text"]Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text[/wrap]
[/wrap]
[/wrap]

CSS Code to add to theme.

// Bootstrap Card Box
[data-wrap="card"] {
    position: relative;
    display: flex;
    flex-direction: column;
    min-width: 0;
    word-wrap: break-word;
    background-color: #fff;
    background-clip: border-box;
    border: 1px solid rgba(0,0,0,.125);
    border-radius: 0.25rem;
}

// Bootstrap Card Header
[data-wrap="card-header"] {
    padding: 0.5rem 1rem;
    margin-bottom: 0;
    border-bottom: 1px solid rgba(0,0,0,.125);
    background: #007bff;
    color: #fff;
    border-radius: 5px 5px 0px 0px;
    
}

// Bootstrap Card Body
[data-wrap="card-body"] {
    flex: 1 1 auto;
    padding: 1rem 1rem;
}

// Bootstrap Card Title
[data-wrap="card-title"] {
    margin-bottom: 0.5rem;
}

// Bootstrap Card Text
[data-wrap="card-text"] {
    margin-top: 0;
    margin-bottom: 1rem;
}
4개의 좋아요

Of course, it depends on what you intend to put in it, but to achieve the same exact visual as your example, you can optimize your code a lot:

[wrap="card-header"]**Card Header**[/wrap]
[wrap="card-body"]
**Card Title**

Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text, Card Text
[/wrap]
[data-wrap="card-header"] {
    padding: 0.5em 1em;
    border: 1px solid rgba(0,0,0,.125);
    border-bottom: 0;
    background: #007bff;
    color: #fff;
    border-radius: 5px 5px 0 0;
}

[data-wrap="card-body"] {
    padding: 1em;    
    border: 1px solid rgba(0,0,0,.125);
    border-radius: 0 0 5px 5px;
}

5개의 좋아요

Ahhh! Thats so much better! Thank you so much for making the improvements! <3

Nice! When is the markdown in the [wrap]...[/wrap] element processed, or is there a trick to getting it to render before it’s included in the wrap?

For example, I’ve tried formatting some text in the element as bold or italic, and it doesn’t render like that - I just see _text_ or **text** on the page in my browser, once I save it :frowning:

1개의 좋아요

It indeed seems formatting (whether it’s HTML, Markdow or BBcode) won’t work in [wrap] if it’s an inline element (if there’s other content on the same line):

You’ll need to create a <span> for this.

2개의 좋아요