Add markdown support

This commit is contained in:
KMY 2023-03-04 15:25:24 +09:00
parent bc64450455
commit 44ef5a6173
3 changed files with 147 additions and 1 deletions

View file

@ -23,3 +23,4 @@
@import 'mastodon/dashboard';
@import 'mastodon/rtl';
@import 'mastodon/accessibility';
@import 'mastodon/rich_text';

View file

@ -0,0 +1,97 @@
.account__header__bio,
.status__content__text,
.e-content,
.reply-indicator__content {
pre,
blockquote {
margin-bottom: 20px;
white-space: pre-wrap;
unicode-bidi: plaintext;
&:last-child {
margin-bottom: 0;
}
}
code, pre {
border: 1px solid $ui-primary-color;
font-family: monospace;
}
code {
margin: 0 4px;
}
pre {
padding: 4px 8px;
span.ellipsis::after {
content: "";
}
span.invisible {
display: inline;
font-size: inherit;
line-height: inherit;
width: inherit;
height: inherit;
position: static;
}
}
blockquote {
padding-left: 10px;
border-left: 3px solid $darker-text-color;
color: $darker-text-color;
white-space: normal;
p:last-child {
margin-bottom: 0;
}
}
& > ul,
& > ol {
margin-bottom: 20px;
}
b,
strong {
font-weight: 700;
}
em,
i {
font-style: italic;
}
ul,
ol {
margin-left: 2em;
p {
margin: 0;
}
}
ul {
list-style-type: disc;
}
ol {
list-style-type: decimal;
}
mark {
background-color: $ui-highlight-color;
color: $ui-secondary-color;
padding: 0 2px;
}
}
.reply-indicator__content {
blockquote {
border-left-color: $inverted-text-color;
color: $inverted-text-color;
}
}

View file

@ -43,7 +43,9 @@ class TextFormatter
end
end
html = simple_format(html, {}, sanitize: false).delete("\n") if multiline?
html = markdownify(html)
# html = simple_format(html, {}, sanitize: false).delete("\n") if multiline?
html.html_safe # rubocop:disable Rails/OutputSafety
end
@ -155,4 +157,50 @@ class TextFormatter
def preloaded_accounts?
preloaded_accounts.present?
end
def markdownify(html)
# not need filter_html because escape is already done
@htmlobj ||= MyMarkdownHTML.new(
filter_html: false,
hard_wrap: false,
no_styles: true
)
@markdown ||= Redcarpet::Markdown.new(@htmlobj,
autolink: false,
tables: false,
underline: true,
disable_indented_code_blocks: false,
fenced_code_blocks: true,
highlight: false
)
@markdown.render(html)
end
class MyMarkdownHTML < Redcarpet::Render::HTML
def link(link, title, content)
nil
end
def linebreak
nil
end
def block_code(code, language)
"<pre>#{code}</pre>"
end
def codespan(code)
"<code>#{escape_tags(code)}</code>"
end
def header(text, header_level)
"<p>#{text}</p>"
end
private
def escape_tags(code)
code.gsub(/</, '&lt;').gsub(/>/, '&gt;')
end
end
end