module DirectchatMircCatalog
Constants
- FEATURE_PATTERNS
- IBIS_GLOB
- POPUP_GLOB
- SCRIPT_DIR_CANDIDATES
Public Instance Methods
Source
# File lib/directchat/mirc_catalog.rb, line 45 def analyze(root:) root = File.expand_path(root.to_s) script_dirs = resolve_script_dirs(root) files = collect_files(root, script_dirs) contents = files.transform_values { |path| safe_read(path) } combined = contents.values.join("\n") reference_root = reference_root_for(root) { root: root, script_dirs: script_dirs, files: files.keys.sort, popups: files.keys.select { |name| name.match?(/\Apopups_.*\.ibis\z/i) }.sort, features: detect_features(combined, files), event_handlers: count_matches(combined, /\bon\s+\^?\d*:/i), popup_items: count_popup_items(contents), dialogs: extract_dialogs(combined), aliases: count_matches(combined, /\balias\s+\S+/i), mirc_pdf: File.file?(File.join(reference_root, "mirc.pdf")) || File.file?(File.join(root, "mirc.pdf")), references: build_references(reference_root, root, files) } end
Source
# File lib/directchat/mirc_catalog.rb, line 125 def build_references(reference_root, project_root, files) refs = [] refs << "mirc.pdf" if File.file?(File.join(reference_root, "mirc.pdf")) refs << "mirc.pdf" if refs.empty? && File.file?(File.join(project_root, "mirc.pdf")) %w[style.ibis popups_chat.ibis popups_channel.ibis popups_nicklist.ibis popups_status.ibis popups_menubar.ibis].each do |name| refs << name if files.key?(name) end refs.uniq end
Source
# File lib/directchat/mirc_catalog.rb, line 84 def collect_files(root, script_dirs) collected = {} script_dirs.each do |dir_name| dir = File.join(root, dir_name) Dir.glob(File.join(dir, IBIS_GLOB)).each do |path| collected[File.basename(path)] ||= path end end collected end
Source
# File lib/directchat/mirc_catalog.rb, line 121 def count_matches(text, pattern) text.scan(pattern).length end
Source
# File lib/directchat/mirc_catalog.rb, line 105 def count_popup_items(contents) contents.sum do |name, body| next 0 unless name.start_with?("popups_") body.lines.count { |line| DirectchatMircParse.popup_item_line?(line) } end end
Source
# File lib/directchat/mirc_catalog.rb, line 95 def detect_features(combined, files) detected = FEATURE_PATTERNS.each_with_object([]) do |(feature, pattern), list| list << feature if combined.match?(pattern) end detected << :context_menus if files.keys.any? { |name| name.start_with?("popups_") } detected << :style_reference if files.key?("style.ibis") detected.uniq.sort end
Source
# File lib/directchat/mirc_catalog.rb, line 117 def extract_dialogs(combined) combined.scan(/\bdialog\s+(\w+)/i).flatten.map(&:downcase).uniq.sort end
Source
# File lib/directchat/mirc_catalog.rb, line 113 def popup_item_line?(line) DirectchatMircParse.popup_item_line?(line) end
Source
# File lib/directchat/mirc_catalog.rb, line 68 def reference_root_for(root) return root if File.directory?(File.join(root, "stuff")) || File.file?(File.join(root, "mirc.pdf")) candidate = File.join(root, "reference") File.directory?(candidate) ? candidate : root end
Source
# File lib/directchat/mirc_catalog.rb, line 75 def resolve_script_dirs(root) SCRIPT_DIR_CANDIDATES.filter_map do |relative| path = File.join(root, relative) next unless File.directory?(path) relative end end
Source
# File lib/directchat/mirc_catalog.rb, line 135 def safe_read(path) DirectchatMircParse.safe_read(path) end