Skip to content

Instantly share code, notes, and snippets.

@bsa7
Last active July 6, 2016 18:57
Show Gist options
  • Save bsa7/fdb03cd48992579a49dc968e55acbd3f to your computer and use it in GitHub Desktop.
Save bsa7/fdb03cd48992579a49dc968e55acbd3f to your computer and use it in GitHub Desktop.
code marker

#create hooks in code. ##use if can't locate partial in rails

place this to some_path, add this path to PATH variable, run from root of project path or in other project subpath:

code_marker

this will be marks all partials: *.html.haml, *.html.erb, *.js.coffee, *.js in your app folder.

if you want to specify, call with params, separated by space:

code_marker haml erb js coffee

when you found partial - return back: remove all marks from code:

code_marker off

specify format, if you want:

code_marker haml erb js coffee off

this create code which you easy can find in your developer tools:

thes add a uniq digest string to each file at top. examples:

  • haml: #hook-bad7b97bda

  • erb: <div id="hook-ea9089ae98"></div>

  • js: var i_eb78c989a8 = null;

  • coffee: i_ab98abcb9a = null

  • rb: Rails.logger.debug anchor: "i_ab98abcb9a def ..." in each method definition

#!/usr/bin/env ruby
require 'digest'
require 'colorize'
def marker_templates
[
{param_key: 'rb', extension_regexp: '\.rb', marker: -> (digest){digest}},
{param_key: 'haml', extension_regexp: '\.html\.haml', marker: -> (digest){"#hook-#{digest}"}},
{param_key: 'erb', extension_regexp: '\.html\.erb', marker: -> (digest){"<div id=\"hook-#{digest}\"></div>"}},
{param_key: 'coffee', extension_regexp: '\.js\.coffee', marker: -> (digest){"i_#{digest} = null"}},
{param_key: 'js', extension_regexp: '\.js', marker: -> (digest){"var i_#{digest} = null;"}}
]
end
def mark_file(full_filename, file_content, hook_tag, digest, delete_markers_mode, key_format_regexp, marker_template)
mark_exist = file_content[Regexp.new digest]
digest_filename = "#{digest} #{full_filename}".white
puts "delete marks: #{delete_markers_mode}, file #{full_filename}".yellow + " - complies to extension_regexp".white + " #{key_format_regexp}".green
if delete_markers_mode && mark_exist
marker_regexp = Regexp.new("^[^\x0d\x0a]*?#{digest}[^\x0d\x0a]*?(\x0d?\x0a)", Regexp::MULTILINE)
File.write(full_filename, file_content.gsub(marker_regexp, ""))
puts "hook_tag = #{marker_regexp} unmarked - ".red + digest_filename
true
elsif delete_markers_mode && !mark_exist
puts " not yet marked - ".cyan + digest_filename
false
elsif !delete_markers_mode && !mark_exist
if marker_template[:param_key] == 'rb'
replace_regexp = /^([ \x09]*)(def [^\x0d\x0a]+)(\x0d?\x0a)/m
replacement = "\\1\\2\\3\\1 Rails.logger.debug anchor: '#{hook_tag.gsub("'", '"')}: \\2'\\3"
replaced_content = file_content.gsub(replace_regexp, replacement)
File.write(full_filename, replaced_content)
else
new_line = file_content[/\x0d\x0a/] ? "\x0d\x0a" : "\n"
File.write(full_filename, "#{hook_tag}#{new_line}#{file_content}")
end
puts " marked - ".green + digest_filename
true
elsif mark_exist
puts " already marked - ".cyan + digest_filename
false
end
end
puts '============== This id a code marker for Rails =============='
files = Dir.glob("#{Dir.pwd}/**/*")
filenames = []
filehashes = []
argv_string = ARGV.join(',')
marker_template_keys_regexp = Regexp.new( marker_templates.map { |template|
template[:param_key]
}.join('|'))
key_format_regexp = Regexp.new "#{argv_string.gsub(',', '|')}$"
arguments_has_format_keys = argv_string[marker_template_keys_regexp]
enabled_formats_regexps = []
marker_templates.each do |template|
if argv_string[template[:param_key]] || !arguments_has_format_keys
enabled_formats_regexps << template[:extension_regexp]
end
end
enabled_formats_regexp = Regexp.new enabled_formats_regexps.join('|') + '$'
marker_tempate_filenames_regexp = Regexp.new( marker_templates.map { |template|
template[:extension_regexp]
}.join('|')+'$')
delete_markers_mode = argv_string[/\boff\b/]
files.each do |full_filename|
if full_filename[enabled_formats_regexp]
filenames << full_filename
digest = Digest::SHA256.hexdigest(full_filename)[0..9]
filehashes << digest
marker_templates.each do |marker_template|
file_content = File.read(full_filename)
hook_tag = marker_template[:marker].call(digest)
that_template = full_filename[Regexp.new marker_template[:extension_regexp]]
if that_template
puts "that_template: #{that_template}"
if mark_file(full_filename, file_content, hook_tag, digest, delete_markers_mode, key_format_regexp, marker_template)
break
end
end
end
end
end
filehashes = filehashes.uniq
puts filenames.length == filehashes.length
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment