yes
This commit is contained in:
commit
e3ff2331ad
|
@ -0,0 +1,22 @@
|
||||||
|
---
|
||||||
|
include:
|
||||||
|
- "**/*.rb"
|
||||||
|
exclude:
|
||||||
|
- spec/**/*
|
||||||
|
- test/**/*
|
||||||
|
- vendor/**/*
|
||||||
|
- ".bundle/**/*"
|
||||||
|
require: ["minitest"]
|
||||||
|
domains: []
|
||||||
|
reporters:
|
||||||
|
- rubocop
|
||||||
|
- require_not_found
|
||||||
|
formatter:
|
||||||
|
rubocop:
|
||||||
|
cops: safe
|
||||||
|
except: []
|
||||||
|
only: []
|
||||||
|
extra_args: []
|
||||||
|
require_paths: []
|
||||||
|
plugins: []
|
||||||
|
max_files: 5000
|
|
@ -0,0 +1,94 @@
|
||||||
|
## Filter-based Markdown translator.
|
||||||
|
module Markdown
|
||||||
|
## Translator for linear tags in Markdown.
|
||||||
|
# A linear tag is any tag that starts anywhere on the line, and closes on the same exact line.
|
||||||
|
class LinearTagTranslator
|
||||||
|
def initialize(text)
|
||||||
|
@input = text
|
||||||
|
end
|
||||||
|
def escape(text)
|
||||||
|
text.sub /([*`~_!\[])/,"\\\1"
|
||||||
|
end
|
||||||
|
def to_html
|
||||||
|
@input
|
||||||
|
# Newline
|
||||||
|
.sub /\s{2}[\n\r]/,"<br/>"
|
||||||
|
# Inline code (discord style)
|
||||||
|
.sub /(?<!\\)``(.*?[^\\])``/, { |code|
|
||||||
|
"<code>#{self.escape code}</code>"
|
||||||
|
}
|
||||||
|
# Inline code (Markdown style)
|
||||||
|
.sub /(?<!\\)`(.*?[^\\])`/, { |code|
|
||||||
|
"<code>#{self.escape code}</code>"
|
||||||
|
}
|
||||||
|
# Bold-italics
|
||||||
|
.sub /(?<!\\)\*\*\*(.*?[^\\])\*\*\*/,"<i><b>\1</b></i>"
|
||||||
|
# Bold
|
||||||
|
.sub /(?<!\\)\*\*(.*?[^\\])\*\*/,"<b>\1</b>"
|
||||||
|
# Italics
|
||||||
|
.sub /(?<!\\)\*(.*?[^\\])\*/,"<i>\1</i>"
|
||||||
|
# Strikethrough
|
||||||
|
.sub /(?<!\\)~~(.*?[^\\])~~/,"<s>\1</s>"
|
||||||
|
# Underline
|
||||||
|
.sub /(?<!\\)__(.*?[^\\])__/,"<span style=\"text-decoration: underline\">\1</span>"
|
||||||
|
# Image
|
||||||
|
.sub /(?<!\\)!\[(.*)\]\((.*)\)/,"<img src=\"\2\" alt=\"\1\" />"
|
||||||
|
# Link
|
||||||
|
.sub /(?<!\\)\[(.*)\]\((.*)\)/,"<a href=\"\2\">\1</a>"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
## Translator for linear leftmost tags.
|
||||||
|
# Leftmost linear tags open on the leftmost end of the string, and close once the line ends. These tags do not need to be explicitly closed.
|
||||||
|
class LeftmostTagTranslator
|
||||||
|
def initalize(text)
|
||||||
|
@input = text
|
||||||
|
end
|
||||||
|
def to_html
|
||||||
|
# Headers
|
||||||
|
@input.sub(/(?<!\\)(\#{1,4})([^\n\r]*)/) { |level,content|
|
||||||
|
"<h#{level.length}>"+content+"</h#{level.length}>"
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
## Translator for code blocks in Markdown.
|
||||||
|
# First in terms of precedence.
|
||||||
|
class CodeBlocksTranslator
|
||||||
|
def initialize(text
|
||||||
|
end
|
||||||
|
## Translator for quotes in Markdown.
|
||||||
|
# These deserve their own place in hell.
|
||||||
|
class QuoteTranslator
|
||||||
|
def initialize(text, level: 0)
|
||||||
|
if text.is_a? Array then
|
||||||
|
@lines = text
|
||||||
|
elsif text.is_a? String then
|
||||||
|
@lines = text.split("\n\n")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
def to_html
|
||||||
|
stack = []
|
||||||
|
range = []
|
||||||
|
state = false
|
||||||
|
@lines.each_with_index { |x,index|
|
||||||
|
if x.match(/^\s{0,1}>/) and state == false then
|
||||||
|
range.append index
|
||||||
|
state = true
|
||||||
|
end
|
||||||
|
if (not x.match /^\s{0,1}>/) and state == true then
|
||||||
|
range.append index-1
|
||||||
|
state = false
|
||||||
|
stack.append(range[0]..range[1])
|
||||||
|
range = []
|
||||||
|
end
|
||||||
|
}
|
||||||
|
range.each { |r|
|
||||||
|
@lines[r] = QuoteTranslator.new(@lines[r]).to_html
|
||||||
|
}
|
||||||
|
@lines = @lines.map { |x|
|
||||||
|
(x.sub /^\s{0,1}>/,"")
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue