diff options
author | Stan Hu <stanhu@gmail.com> | 2019-05-21 19:49:14 -0700 |
---|---|---|
committer | Stan Hu <stanhu@gmail.com> | 2019-05-21 19:49:14 -0700 |
commit | 27381e22a92453b23f1ed75406970b37d926f1ec (patch) | |
tree | bdb46c358c8028493f3e69d8adb2cdaaf2f766fe /haml_lint | |
parent | 0ded86570c10d24ad4fff7e4fcd4b562bcd397fd (diff) | |
download | gitlab-ce-27381e22a92453b23f1ed75406970b37d926f1ec.tar.gz |
Move files from lib/haml_lint to haml_lintsh-fix-linter-registry-haml
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')
-rw-r--r-- | haml_lint/inline_javascript.rb | 25 | ||||
-rw-r--r-- | haml_lint/linter/no_plain_nodes.rb | 84 |
2 files changed, 109 insertions, 0 deletions
diff --git a/haml_lint/inline_javascript.rb b/haml_lint/inline_javascript.rb new file mode 100644 index 00000000000..da6af92e82b --- /dev/null +++ b/haml_lint/inline_javascript.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +unless Rails.env.production? + require_dependency 'haml_lint/haml_visitor' + require_dependency 'haml_lint/linter' + require_dependency 'haml_lint/linter_registry' + + module HamlLint + class Linter::InlineJavaScript < Linter + include ::HamlLint::LinterRegistry + + def visit_filter(node) + return unless node.filter_type == 'javascript' + + record_lint(node, 'Inline JavaScript is discouraged (https://docs.gitlab.com/ee/development/gotchas.html#do-not-use-inline-javascript-in-views)') + end + + def visit_tag(node) + return unless node.tag_name == 'script' + + record_lint(node, 'Inline JavaScript is discouraged (https://docs.gitlab.com/ee/development/gotchas.html#do-not-use-inline-javascript-in-views)') + end + end + end +end 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 |