Add a file to create file dependency graph
This commit is contained in:
		
							parent
							
								
									21ca8e5e90
								
							
						
					
					
						commit
						7fb3c26633
					
				
							
								
								
									
										82
									
								
								analyze.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								analyze.rb
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,82 @@ | ||||
| require "pathname" | ||||
| require "set" | ||||
| require "json" | ||||
| 
 | ||||
| def resolve_path(bp, p) | ||||
|   path = nil | ||||
|   if bp.start_with? "." | ||||
|     path = Pathname.new(File.join(bp, p)).cleanpath.to_s | ||||
|   elsif p.start_with? "blog/" | ||||
|     path = File.join("content", p) | ||||
|   else | ||||
|     path = File.join("content", "blog", p) | ||||
|   end | ||||
|   if File.directory? path | ||||
|     path = File.join(path, "index.md")  | ||||
|   elsif !path.end_with? ".md" | ||||
|     path += ".md" | ||||
|   end | ||||
|   path.gsub("blog/blog/", "blog/") | ||||
| end | ||||
| 
 | ||||
| files = Set.new | ||||
| refs = {} | ||||
| ARGF.each do |file| | ||||
|   file = file.chomp | ||||
|   files << file | ||||
|   arr = refs[file] || (refs[file] = []) | ||||
|   File.open(file).read.scan(/< relref "([^"]+)" >/) do |ref| | ||||
|     ref = resolve_path(File.dirname(file), ref[0]) | ||||
|     arr << ref | ||||
|     files << ref | ||||
|   end | ||||
|   arr.uniq! | ||||
| end | ||||
| 
 | ||||
| data = {} | ||||
| id = 0 | ||||
| files.each do |file| | ||||
|   id += 1 | ||||
|   name = file | ||||
|   tags = [] | ||||
|   group = 1 | ||||
|   value = File.size(file) | ||||
|   url = file.gsub(/^content/, "https://danilafe.com").delete_suffix("/index.md").delete_suffix(".md") | ||||
|   File.readlines(file).each do |l| | ||||
|     if l =~ /^title: (.+)$/ | ||||
|       name = $~[1].delete_prefix('"').delete_suffix('"') | ||||
|     elsif l =~ /^tags: (.+)$/ | ||||
|       tags = $~[1].delete_prefix("[").delete_suffix("]").split(/,\s?/).map { |it| it.gsub('"', '') } | ||||
|       if tags.include? "Compilers" | ||||
|         group = 2 | ||||
|       elsif tags.include? "Coq" | ||||
|         group = 3 | ||||
|       elsif tags.include? "Programming Languages" | ||||
|         group = 4 | ||||
|       elsif tags.include? "Haskell" | ||||
|         group = 5 | ||||
|       elsif tags.include? "Crystal" | ||||
|         group = 6 | ||||
|       end | ||||
|     end | ||||
|   end | ||||
|   data[file] = { :id => id, :label => name, :group => group, :tags => tags, :url => url, :value => value } | ||||
| end | ||||
| 
 | ||||
| edges = [] | ||||
| files.each do |file1| | ||||
|   # files.each do |file2| | ||||
|   #   next if file1 == file2 | ||||
|   #   next unless data[file1][:tags].any? { |t| data[file2][:tags].include? t } | ||||
|   #   edges << { :from => data[file1][:id], :to => data[file2][:id] } | ||||
|   # end | ||||
|   next unless frefs = refs[file1] | ||||
|   frefs.each do |ref| | ||||
|     edges << { :from => data[file1][:id], :to => data[ref][:id] } | ||||
|   end | ||||
| end | ||||
| edges.uniq | ||||
| # edges.filter! { |e| e[:from] < e[:to] } | ||||
| 
 | ||||
| puts ("const nodes = " + JSON.pretty_unparse(data.values) + ";") | ||||
| puts ("const edges = " + JSON.pretty_unparse(edges) + ";") | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user