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
|
module MarkdownLint
# defines a single rule
class Rule
attr_accessor :id, :description
def initialize(id, description, fallback_docs: nil, &)
@id = id
@description = description
@generate_docs = fallback_docs
@docs_overridden = false
@aliases = []
@tags = []
@params = {}
instance_eval(&)
end
def check(&block)
@check = block unless block.nil?
@check
end
def tags(*tags)
@tags = tags.flatten.map(&:to_sym) unless tags.empty?
@tags
end
def aliases(*aliases)
@aliases.concat(aliases)
@aliases
end
def params(params = nil)
@params.update(params) unless params.nil?
@params
end
def docs(url = nil, &block)
if block_given? != url.nil?
raise ArgumentError, 'Give either a URL or a block, not both'
end
raise 'A docs url is already set within this rule' if @docs_overridden
@generate_docs = block_given? ? block : lambda { |_, _| url }
@docs_overridden = true
end
def docs_url
@generate_docs&.call(id, description)
end
end
# defines a ruleset
class RuleSet
attr_reader :rules
def initialize
@rules = {}
end
def rule(id, description, &)
@rules[id] =
Rule.new(id, description, :fallback_docs => @fallback_docs, &)
end
def load(rules_file)
instance_eval(File.read(rules_file), rules_file)
@rules
end
def docs(url = nil, &block)
if block_given? != url.nil?
raise ArgumentError, 'Give either a URL or a block, not both'
end
@fallback_docs = block_given? ? block : lambda { |_, _| url }
end
def load_default
load(File.expand_path('rules.rb', __dir__))
end
end
end
|