From 27381e22a92453b23f1ed75406970b37d926f1ec Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Tue, 21 May 2019 19:49:14 -0700 Subject: 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. --- haml_lint/inline_javascript.rb | 25 ++++++++++++ haml_lint/linter/no_plain_nodes.rb | 84 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 haml_lint/inline_javascript.rb create mode 100644 haml_lint/linter/no_plain_nodes.rb (limited to 'haml_lint') 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 -- cgit v1.2.3