|
1 | 1 | #!/usr/bin/env ruby
|
2 | 2 |
|
3 |
| -require 'httparty' |
4 |
| -require 'fileutils' |
| 3 | +require "httparty" |
| 4 | +require "fileutils" |
| 5 | +require "nokogiri" |
5 | 6 |
|
6 | 7 | CONTENT_DIR = "./content"
|
7 |
| -FILE_NAME_OVERRIDES = { |
8 |
| - "excessiveclasscomplexity" => "weightedmethodcount", |
9 |
| -} |
10 |
| - |
11 |
| -categories = { |
12 |
| - cleancode: "http://phpmd.org/rules/cleancode.txt", |
13 |
| - codesize: "http://phpmd.org/rules/codesize.txt", |
14 |
| - controversial: "http://phpmd.org/rules/controversial.txt", |
15 |
| - design: "http://phpmd.org/rules/design.txt", |
16 |
| - naming: "http://phpmd.org/rules/naming.txt", |
17 |
| - unused: "http://phpmd.org/rules/unusedcode.txt" |
18 |
| -} |
| 8 | +CATEGORIES = %w(cleancode codesize controversial design naming unusedcode) |
19 | 9 |
|
20 |
| -FileUtils.rm_rf(CONTENT_DIR) |
21 |
| -FileUtils.mkdir_p(CONTENT_DIR) |
| 10 | +class Rule |
| 11 | + attr_accessor :name, :since, :source, :description, :example |
| 12 | +end |
22 | 13 |
|
23 |
| -def file_name(header) |
24 |
| - file_name = header.gsub(" ", "_").downcase |
25 |
| - FILE_NAME_OVERRIDES.fetch(file_name, file_name) |
| 14 | +def fetch_category_rules(category) |
| 15 | + base_url = "https://raw.githubusercontent.com/phpmd/phpmd/master/src/main/resources/rulesets" |
| 16 | + HTTParty.get("#{base_url}/#{category}.xml").body |
26 | 17 | end
|
27 | 18 |
|
28 |
| -categories.each do |category, url| |
29 |
| - text = HTTParty.get(url).body |
| 19 | +def process_category_rules(xml_rules) |
| 20 | + rules = [] |
| 21 | + rules_node_set = Nokogiri::XML.parse(xml_rules).children.children |
| 22 | + rules_node_set.each do |node| |
| 23 | + next unless node.name.eql?("rule") |
| 24 | + rule = Rule.new |
| 25 | + rule.name = node.get_attribute("name") |
| 26 | + rule.since = node.get_attribute("since") |
| 27 | + rule.source = node.get_attribute("externalInfoUrl") |
| 28 | + node.children.each do |child_node| |
| 29 | + if child_node.name.eql?("description") |
| 30 | + rule.description = child_node.text.strip |
| 31 | + end |
| 32 | + if child_node.name.eql?("example") |
| 33 | + rule.example = child_node.text |
| 34 | + end |
| 35 | + end |
| 36 | + rules << rule |
| 37 | + end |
| 38 | + rules |
| 39 | +end |
30 | 40 |
|
31 |
| - matches = text.split(/=+\n.*?\n=+/, 2).pop |
32 |
| - matches = matches.split(/^=+\n$/) |
| 41 | +FileUtils.rm_rf(CONTENT_DIR) |
| 42 | +FileUtils.mkdir_p(CONTENT_DIR) |
33 | 43 |
|
34 |
| - sections = matches.each_with_object([]) do |match, array| |
35 |
| - split = match.split(/\n/) |
36 |
| - title = split.pop |
37 |
| - body = split.join("\n") |
| 44 | +rules = [] |
38 | 45 |
|
39 |
| - body.gsub!(/(?<=Example:) ::/, "\n\n```php") |
40 |
| - body = body.split(/This rule.*/).shift |
41 |
| - body += "\n```" |
| 46 | +CATEGORIES.each do |category| |
| 47 | + raw_xml_rules = fetch_category_rules(category) |
| 48 | + category_rules = process_category_rules(raw_xml_rules) |
| 49 | + rules.concat(category_rules) |
| 50 | +end |
42 | 51 |
|
43 |
| - array << body |
44 |
| - array << title |
45 |
| - end |
| 52 | +rules.each do |rule| |
| 53 | + File.open("#{CONTENT_DIR}/#{rule.name.downcase}.txt", "w") do |file| |
| 54 | + md = <<~MARKDOWN |
| 55 | + # #{rule.name} |
| 56 | + #{"### Since: " if rule.since } #{rule.since if rule.since} |
46 | 57 |
|
47 |
| - sections.shift |
48 |
| - sections.pop |
| 58 | + #{rule.description} |
49 | 59 |
|
50 |
| - sections.each_slice(2) do |(header, body)| |
51 |
| - next if header == "Remark" |
| 60 | + ## Example |
| 61 | + ```php |
| 62 | + #{rule.example} |
| 63 | + ``` |
52 | 64 |
|
53 |
| - File.open("#{CONTENT_DIR}/#{file_name(header)}.txt", "w") do |file| |
54 |
| - file.write(body) |
55 |
| - file.write("\n\nSource: #{url}") |
56 |
| - end |
| 65 | + ## Source #{rule.source} |
| 66 | + MARKDOWN |
| 67 | + file.write(md) |
57 | 68 | end
|
58 | 69 | end
|
0 commit comments