diff options
author | Stan Hu <stanhu@gmail.com> | 2019-05-22 05:49:14 +0300 |
---|---|---|
committer | Stan Hu <stanhu@gmail.com> | 2019-05-22 05:49:14 +0300 |
commit | 27381e22a92453b23f1ed75406970b37d926f1ec (patch) | |
tree | bdb46c358c8028493f3e69d8adb2cdaaf2f766fe /haml_lint/linter/no_plain_nodes.rb | |
parent | 0ded86570c10d24ad4fff7e4fcd4b562bcd397fd (diff) |
Move files from lib/haml_lint to haml_lint
Files in lib will be eager loaded and hence will require haml_lint to be
loaded. Since this is only a development dependency, we can't assume
this gem will be available in production, so it should never be loaded
in production.
Diffstat (limited to 'haml_lint/linter/no_plain_nodes.rb')
-rw-r--r-- | haml_lint/linter/no_plain_nodes.rb | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/haml_lint/linter/no_plain_nodes.rb b/haml_lint/linter/no_plain_nodes.rb new file mode 100644 index 00000000000..c39f61fa80d --- /dev/null +++ b/haml_lint/linter/no_plain_nodes.rb @@ -0,0 +1,84 @@ +# frozen_string_literal: true + +require 'active_support/core_ext/array/grouping' + +module HamlLint + class Linter + class NoPlainNodes < Linter + include ::HamlLint::LinterRegistry + + def visit_tag(node) + if inline_plain_node?(node) + check_inline(node) + elsif !node.script.empty? + check_script(node) + else + check(node) + end + end + + private + + def check(node) + text_in_node(node).each { |string| record(node, string) } + end + + def check_inline(node) + text = inline_text(node) + record(node, text) unless text.empty? + end + + def check_script(node) + text = inline_text(node) + record(node, text) unless text.start_with?('=') || text.empty? + end + + # Build an array of all strings in child text nodes. + # non text nodes are nil, where we'll split the sentences. + def text_in_node(node) + texts = node.children.map do |child| + child.text.strip if text_node?(child) + end + + texts.split(nil).map { |sentence| sentence.join(' ') unless sentence.empty? }.compact + end + + # Removes a node's attributes and tag from the source code, + # returning the inline text of a node. + def inline_text(node) + text = node.source_code.gsub("%#{node.tag_name}", '') + + attributes = node.attributes_source.map(&:last) + attributes.each { |attribute| text = text.gsub(attribute, '') } + + text.strip + end + + def record(node, string) + record_lint(node, message(string)) + end + + def message(string) + "`#{string}` is a plain node. Please use an i18n method like `#{fixed(string)}`" + end + + def fixed(string) + "= _('#{string}')" + end + + def inline_plain_node?(node) + node.children.empty? && node.script.empty? + end + + def plain_node?(node) + node.is_a?(::HamlLint::Tree::PlainNode) + end + + def text_node?(node) + return false unless plain_node?(node) + + !node.text.empty? + end + end + end +end |