独自のスタイルで投稿内容をカスタマイズ

要件

: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] タグの一つと同じ行にある場合、インライン 要素として出力されます。

2番目の例:ボタンの外観を持つリンク。

[wrap] タグをいじると、文脈によってブロック要素またはインライン要素になる可能性があるため、望ましくない結果につながる場合があります。
したがって、同じ結果を達成する2つの異なる方法を説明しますが、最も適したものを選ぶことができます :v:

[wrap] を使用したインラインボタンリンク

Markdownを使用してリンクを作成する構文は:[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を使用することもできます。この例では、リンクの通常のMarkdown構文を使用し、<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

@Canapin 様、ありがとうございます。

これらの概念のいくつかを活用したテーマコンポーネントの良い例は、こちらです。

「いいね!」 4

素晴らしい!\n\nユーザーが data 属性を使ってどのようなクリエイティブなソリューションを生み出すのか、興味があります。\n\n—\n\nHTML の \u003cspan data-button\u003e を使用することに、BBCode の [wrap=\"button\"] を使用することに対する利点はありますか?

「いいね!」 2

あまり深く考えずに言うと、<span>を使用すると、1行にインライン要素のみを配置できます。

1行に他のコンテンツがない状態で[wrap]を使用すると、自動的にブロック要素が出力されます。また、その中のテキストは段落<p>タグで囲まれます。

それ以外は、おそらく好みの問題でしょう。また、[wrap]とHTML要素は複数の-data属性を持つことができることにも触れていませんが、ほとんどの目的にはあまり役立たないと思います。

「いいね!」 3

Bootstrapの「カード」を投稿/トピックに追加する方法

…これはクレイジーだ、複雑すぎる、あるいはやりすぎだと言う人もいるかもしれませんが、私はそれが大好きです :smiley:

image

  • BBCodeのネストをより見やすくするために、いくつかの色を追加しました。

停止! 私のコードを使用しないでください

代わりに、@Canapinが投稿した改善されたコードを使用してください ここをクリック

トピック/投稿に含めるBBCode

[wrap="card"]
[wrap="card-header"]**カードヘッダー**[/wrap]
[wrap="card-body"]
[wrap="card-title"]**カードタイトル**[/wrap]
[wrap="card-text"]カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト[/wrap]
[/wrap]
[/wrap]

テーマに追加するCSSコード。

// 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

もちろん、何を入れるかによりますが、例と同じような見た目を実現するには、コードを大幅に最適化できます。

[wrap="card-header"]**カードヘッダー**[/wrap]
[wrap="card-body"]
**カードタイトル**

カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト、カードテキスト
[/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

ああ!ずっと良くなりました!改善してくれて本当にありがとう!:heart:

素晴らしいですね! [wrap]...[/wrap] 要素内のマークダウンはいつ処理されるのでしょうか、それともラップされる前にレンダリングさせるためのコツはありますか?

例えば、要素内で一部のテキストを太字やイタリックでフォーマットしようとしましたが、ブラウザで保存したときにページに表示されるのは、単に _text_ や **text** となり、そのようにはレンダリングされませんでした。 :frowning:

「いいね!」 1

[wrap] 内では、インライン要素(同じ行に他のコンテンツがある場合)の場合、フォーマット(HTML、Markdown、BBcodeのいずれであっても)は機能しないようです。

このためには <span> を作成する必要があります。

「いいね!」 2