diff options
| author | Adam Stankiewicz <sheerun@sher.pl> | 2020-10-06 18:54:19 +0200 | 
|---|---|---|
| committer | Adam Stankiewicz <sheerun@sher.pl> | 2020-10-06 18:54:19 +0200 | 
| commit | bc9757916ed09763d96283ee62dbed58bd713a11 (patch) | |
| tree | 07fbb58e9a4f4cbf5206d89f61e4d570e64d2c1a /scripts | |
| parent | c6fa4d2bf5eb5301f4d3f123031cf34839a5508d (diff) | |
| download | vim-polyglot-bc9757916ed09763d96283ee62dbed58bd713a11.tar.gz vim-polyglot-bc9757916ed09763d96283ee62dbed58bd713a11.zip | |
Add all vim filetypes
Diffstat (limited to '')
| -rwxr-xr-x | scripts/build | 16 | ||||
| -rwxr-xr-x | scripts/import_vim | 122 | 
2 files changed, 135 insertions, 3 deletions
| diff --git a/scripts/build b/scripts/build index 948da115..deee269e 100755 --- a/scripts/build +++ b/scripts/build @@ -108,6 +108,19 @@ def load_data()    for package in packages      for filetype in package["filetypes"] +      if filetype["patterns"] +        for pattern in filetype["patterns"] +          for p in comma_expanson(pattern["pattern"]) +            if p.match(/^\*\.[^\*]+$/) +              filetype["extensions"] ||= [] +              filetype["extensions"]  << p[2..-1] +            else +              filetype["filenames"] ||= [] +              filetype["filenames"]  << p +            end +          end +        end +      end        if filetype["linguist"]          if filetype["extensions"]            raise "#{package["name"]} #{filetype["name"]}: extensions can't be set when linguist is defined" @@ -460,9 +473,6 @@ def extract(packages)          globs.each do |glob|            Dir.glob("#{subdir}/#{glob}", base: subtree).each do |p|              next unless File.file?("#{subtree}/#{p}") -            if p.include?("samba") -              raise package["name"] -            end              copy_file(package, "#{subtree}/#{p}", p)            end          end diff --git a/scripts/import_vim b/scripts/import_vim new file mode 100755 index 00000000..0cf9231c --- /dev/null +++ b/scripts/import_vim @@ -0,0 +1,122 @@ +#!/usr/bin/env ruby + +require 'yaml' + +def comma_expanson(s) +  s.scan(/{[^{]+}|[^{]+/).map { |a| a[0] == "{" ? a : a.split(",", -1) }.reduce([]) do |a, b| +    a.size > 0 ? +      (b.is_a?(String) ? +         a[0..-2] + [a[-1] + b] : +         a[0..-2] + [a[-1] + b[0]] + b[1..-1]) : +      [b].flatten +  end +end + +def import_autocommands +  cmd = <<~EOF +vim -es -u DEFAULTS -c 'exe("func! Capture() \\n redir => capture \\n silent autocmd filetypedetect BufRead \\n redir END \\n return capture \\n endfunc") | let a = Capture() | put =a | %print | :q!' +  EOF +  filetypes = Hash.new { |h, k| h[k] = [] } +  autocommands = `#{cmd}` +  for pattern, cmd in autocommands.scan(/^    ([^ ]+)\s*(.*)\n/) +    cmd = cmd.strip + +    what = {} +    if match = cmd.match(/^setf\s+(.*)$/) +      what[:ft] = match[1] +    elsif match = cmd.match(/^call s:StarSetf\(\'(.*)\'\)$/) +      what[:ft] = match[1] +    elsif match = cmd.match(/^set filetype=(.*)$/) +      what[:ft] = match[1] +    end + +    if what != {} +      for p in comma_expanson(pattern.strip) +        filetypes[what[:ft].strip] << p +      end +    end +  end + + +  filetypes +end + +$with_special_char = /#{[".", ":", "{", "}", "[", "]", ",", "&", "*", "#", "?", "|", "-", "<", ">", "=", "!", "%", "@", "\\"].map { |e| Regexp.escape(e) }.join("|")}/ +def print_pattern(p) +  if p.match($with_special_char) +    p.gsub("'", "\\'") +  end + +  return p +end + +def generate_packages_entries(filetypes, comments) +  entries = [] + +  current_filetypes = YAML.load_stream(File.read('packages.yaml')).flat_map do |p| +    p["filetypes"].map { |a| a["name"] } +  end + +  for ft, patterns in filetypes +    if current_filetypes.include?(ft) +      next +    end + +    output = { +      "name" => ft, +      "remote" => "vim/vim:runtime", +      "glob" => "**/" + ft + ".vim", +      "filetypes" => [{ +        "name" => ft, +        "patterns" => [] +      }] +    } +    paths_with_comments = patterns.group_by { |p| (comments[ft] || {})[p] || "" } +    for comment, paths in paths_with_comments +      output["filetypes"][0]["patterns"] << { +        "pattern" => paths.join(","), +      } + +      if comment.strip.size > 0 +        output["filetypes"][0]["patterns"].last["description"] = comment +      end +    end +    entries << YAML.dump(output) +  end + +  return entries +end + +filetypes = import_autocommands + +def fix_quotes(a) +  a = a.gsub(/\\/) { '\\\\' } +  a.scan(/^.*?"(.+?)"\n/m).each { |p| a[p[0]] = p[0].gsub('"') { '\\"'} } +  a +end + +def get_comments +  comments_cmd = <<~'EOF' +  awk '/^"/ { comment = $0; next } match($0, "(\\S+)\\s+setf (\\S*)$", a) { print "- filetype: \"" a[2] "\"\n  description: \"" substr(comment, 3) "\"\n  patterns: \"" a[1] "\"" }' 'tmp/vim/vim/runtime/filetype.vim' +  EOF + +  comments = YAML.load(fix_quotes(`#{comments_cmd}`)) + +  comments.reject! { |c| c["patterns"].strip == "" || c["patterns"].include?('\\') } +  result = {} +  comments = comments.flat_map do |c|  +    result[c["filetype"]] ||= {} + +    for p in comma_expanson(c["patterns"]) +      result[c["filetype"]][p] = c["description"] +    end +  end +  result +end + +comments = get_comments() +autocommands = import_autocommands() +entries = generate_packages_entries(autocommands, comments) +print(entries.join("")) + + | 
