/usr/lib/ruby/vendor_ruby/rugments/lexers/markdown.rb is in ruby-rugments 1.0.0~beta8-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | module Rugments
module Lexers
class Markdown < RegexLexer
title 'Markdown'
desc 'Markdown, a light-weight markup language for authors'
tag 'markdown'
aliases 'md', 'mkd'
filenames '*.markdown', '*.md', '*.mkd'
mimetypes 'text/x-markdown'
def html
@html ||= HTML.new(options)
end
start { html.reset! }
edot = /\\.|[^\\\n]/
state :root do
# YAML frontmatter
rule(/\A(---\s*\n.*?\n?)^(---\s*$\n?)/m) { delegate YAML }
rule /\\./, Str::Escape
rule /^[\S ]+\n(?:---*)\n/, Generic::Heading
rule /^[\S ]+\n(?:===*)\n/, Generic::Subheading
rule /^#(?=[^#]).*?$/, Generic::Heading
rule /^##*.*?$/, Generic::Subheading
# TODO: syntax highlight the code block, github style
rule /(\n[ \t]*)(```|~~~)(.*?)(\n.*?)(\2)/m do |m|
sublexer = Lexer.find_fancy(m[3].strip, m[4])
sublexer ||= PlainText.new(token: Str::Backtick)
token Text, m[1]
token Punctuation, m[2]
token Name::Label, m[3]
delegate sublexer, m[4]
token Punctuation, m[5]
end
rule /\n\n(( |\t).*?\n|\n)+/, Str::Backtick
rule /(`+)#{edot}*\1/, Str::Backtick
# various uses of * are in order of precedence
# line breaks
rule /^(\s*[*]){3,}\s*$/, Punctuation
rule /^(\s*[-]){3,}\s*$/, Punctuation
# bulleted lists
rule /^\s*[*+-](?=\s)/, Punctuation
# numbered lists
rule /^\s*\d+\./, Punctuation
# blockquotes
rule /^\s*>.*?$/, Generic::Traceback
# link references
# [foo]: bar "baz"
rule %r{^
(\s*) # leading whitespace
(\[) (#{edot}+?) (\]) # the reference
(\s*) (:) # colon
}x do
groups Text, Punctuation, Str::Symbol, Punctuation, Text, Punctuation
push :title
push :url
end
# links and images
rule /(!?\[)(#{edot}+?)(\])/ do
groups Punctuation, Name::Variable, Punctuation
push :link
end
rule /[*][*]#{edot}*?[*][*]/, Generic::Strong
rule /__#{edot}*?__/, Generic::Strong
rule /[*]#{edot}*?[*]/, Generic::Emph
rule /_#{edot}*?_/, Generic::Emph
# Automatic links
rule /<.*?@.+[.].+>/, Name::Variable
rule %r{<(https?|mailto|ftp)://#{edot}*?>}, Name::Variable
rule /[^\\`\[*\n&<]+/, Text
# inline html
rule(/&\S*;/) { delegate html }
rule(/<#{edot}*?>/) { delegate html }
rule /[&<]/, Text
rule /\n/, Text
end
state :link do
rule /(\[)(#{edot}*?)(\])/ do
groups Punctuation, Str::Symbol, Punctuation
pop!
end
rule /[(]/ do
token Punctuation
push :inline_title
push :inline_url
end
rule /[ \t]+/, Text
rule(//) { pop! }
end
state :url do
rule /[ \t]+/, Text
# the url
rule /(<)(#{edot}*?)(>)/ do
groups Name::Tag, Str::Other, Name::Tag
pop!
end
rule /\S+/, Str::Other, :pop!
end
state :title do
rule /"#{edot}*?"/, Name::Namespace
rule /'#{edot}*?'/, Name::Namespace
rule /[(]#{edot}*?[)]/, Name::Namespace
rule /\s*(?=["'()])/, Text
rule(//) { pop! }
end
state :inline_title do
rule /[)]/, Punctuation, :pop!
mixin :title
end
state :inline_url do
rule /[^<\s)]+/, Str::Other, :pop!
rule /\s+/m, Text
mixin :url
end
end
end
end
|