jekyll-readme-index 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 0b0cb46a6f56d8a5898262b8b61441de116c84ad
4
- data.tar.gz: '0992bcb775494cd0fa27d842877b8c397a79a3a1'
2
+ SHA256:
3
+ metadata.gz: 3ff724c2f3f4731b73dc6b4b4ced3bcd84793669c41913c477ea0c926b25a11b
4
+ data.tar.gz: 49768447b305e6dda9605997b1ef8b45b513dfe6ebd9a95136db3bdc383291df
5
5
  SHA512:
6
- metadata.gz: a11b7475e60decc7ebb9640117f49619ac4745d5038f4bd36953dca3fe743fbef59724df995450cf07448c17af08db03a4bf2e66bfab94c023f4f9abf9e62e17
7
- data.tar.gz: 7b22c70e35d4562c3884da6915632e1af7135b5d93374473b0a818461ebed11976e5e6c0a290209c6e2d85faff96cb43eb63cb00d970616284a1212b6cc6ddd0
6
+ metadata.gz: cea83b276e2017f4c150400e77f39a6e985bee2a0c0cd7b4fff61da9f0e6f2dce75a2ac0a9be4fd76ea768252cc1fd71457751816c56db91486b908b7cc17526
7
+ data.tar.gz: 3d538fec44f058263ea888acc364f3741304eb9482c4b28e6ea171634d00250f513d6f330fb13da9d7f15bcd5ebc882582ce086cc3a56a178ae3ca233077bdaa
@@ -1,10 +1,43 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Jekyll
2
4
  class StaticFile
3
5
  # Convert this static file to a Page
4
6
  def to_page
5
7
  page = Jekyll::Page.new(@site, @base, @dir, @name)
6
- page.data["permalink"] = File.dirname(url) + "/"
8
+
9
+ # For READMEs in .github or docs at root level, they should be the root index
10
+ target_dir = if special_readme?
11
+ "/"
12
+ else
13
+ File.dirname(url) + "/"
14
+ end
15
+
16
+ page.data["permalink"] = target_dir
7
17
  page
8
18
  end
19
+
20
+ private
21
+
22
+ # Check if this is a README in a special directory (.github or docs)
23
+ def special_readme?
24
+ relative_path =~ JekyllReadmeIndex::Generator::GITHUB_README_PATTERN ||
25
+ relative_path =~ JekyllReadmeIndex::Generator::DOCS_README_PATTERN
26
+ end
27
+ end
28
+
29
+ class Page
30
+ def update_permalink
31
+ # If URL already ends with '/', it's a directory URL and should be used as-is
32
+ # Otherwise, extract the directory from the file URL
33
+ target_dir = url.end_with?("/") ? url : File.dirname(url) + "/"
34
+
35
+ data["permalink"] = target_dir
36
+ @url = URL.new(
37
+ :template => template,
38
+ :placeholders => url_placeholders,
39
+ :permalink => permalink
40
+ ).to_s
41
+ end
9
42
  end
10
43
  end
@@ -1,15 +1,25 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module JekyllReadmeIndex
2
4
  class Generator < Jekyll::Generator
3
- INDEX_REGEX = %r!$|index\.(html?|xhtml|xml)$!i
5
+ INDEX_REGEX = %r!$|index\.(html?|xhtml|xml)$!i.freeze
6
+ GITHUB_DIR = "/.github"
7
+ DOCS_DIR = "/docs"
8
+ SPECIAL_DIRS = [GITHUB_DIR, DOCS_DIR].freeze
9
+ GITHUB_README_PATTERN = %r!^/\.github/readme!i.freeze
10
+ DOCS_README_PATTERN = %r!^/docs/readme!i.freeze
11
+ ROOT_README_PATTERN = %r!^/readme!i.freeze
4
12
 
5
13
  attr_accessor :site
6
14
 
7
15
  safe true
8
16
  priority :low
9
17
 
10
- CONFIG_KEY = "readme_index".freeze
11
- ENABLED_KEY = "enabled".freeze
12
- CLEANUP_KEY = "remove_originals".freeze
18
+ CONFIG_KEY = "readme_index"
19
+ ENABLED_KEY = "enabled"
20
+ CLEANUP_KEY = "remove_originals"
21
+ FRONTMATTER_KEY = "with_frontmatter"
22
+ PATTERN_KEY = "readme_pattern"
13
23
 
14
24
  def initialize(site)
15
25
  @site = site
@@ -21,21 +31,71 @@ module JekyllReadmeIndex
21
31
 
22
32
  readmes.each do |readme|
23
33
  next unless should_be_index?(readme)
34
+
24
35
  site.pages << readme.to_page
25
36
  site.static_files.delete(readme) if cleanup?
26
37
  end
38
+
39
+ if with_frontmatter?
40
+ readmes_with_frontmatter.each do |readme|
41
+ next unless should_be_index?(readme)
42
+
43
+ readme.update_permalink
44
+ end
45
+ end
27
46
  end
28
47
 
29
48
  private
30
49
 
31
50
  # Returns an array of all READMEs as StaticFiles
32
51
  def readmes
33
- site.static_files.select { |file| file.relative_path =~ readme_regex }
52
+ candidates = site.static_files.select { |file| file.relative_path =~ readme_regex }
53
+ prioritize_readmes(candidates)
34
54
  end
35
55
 
56
+ def readmes_with_frontmatter
57
+ candidates = site.pages.select { |file| ("/" + file.path) =~ readme_regex }
58
+ prioritize_readmes(candidates)
59
+ end
60
+
61
+ # Prioritize READMEs according to GitHub's order: .github > root > docs
62
+ # For each target directory, keep only the highest priority README
63
+ # rubocop:disable Metrics/PerceivedComplexity
64
+ def prioritize_readmes(candidates)
65
+ grouped = candidates.group_by do |file|
66
+ # Get the directory that would become the index
67
+ # READMEs in .github and docs should serve as index for parent directory
68
+ # Note: file_path returns Jekyll-normalized paths without query strings
69
+ dir = File.dirname(file_path(file))
70
+
71
+ # If the README is in .github or docs subdirectory at root,
72
+ # it should be the index for root
73
+ if SPECIAL_DIRS.include?(dir)
74
+ "/"
75
+ else
76
+ dir
77
+ end
78
+ end
79
+
80
+ grouped.flat_map do |_dir, files|
81
+ # Sort by priority: .github first, then root, then docs, then others
82
+ files.min_by do |file|
83
+ path = file.respond_to?(:relative_path) ? file.relative_path : "/" + file.path
84
+ case path
85
+ when GITHUB_README_PATTERN then 0
86
+ when ROOT_README_PATTERN then 1
87
+ when DOCS_README_PATTERN then 2
88
+ else 3
89
+ end
90
+ end
91
+ end.compact
92
+ end
93
+ # rubocop:enable Metrics/PerceivedComplexity
94
+
36
95
  # Should the given readme be the containing directory's index?
37
96
  def should_be_index?(readme)
38
97
  return false unless readme
98
+
39
99
  !dir_has_index? File.dirname(readme.url)
40
100
  end
41
101
 
@@ -50,7 +110,15 @@ module JekyllReadmeIndex
50
110
 
51
111
  # Regexp to match a file path against to detect if the given file is a README
52
112
  def readme_regex
53
- @readmes_regex ||= %r!/readme(#{Regexp.union(markdown_converter.extname_list)})$!i
113
+ # Allow custom pattern override via configuration
114
+ @readme_regex ||= if (custom_pattern = option(PATTERN_KEY))
115
+ Regexp.new(custom_pattern, Regexp::IGNORECASE)
116
+ else
117
+ # Match README in any directory, including .github, docs subdirectories
118
+ # The pattern ensures .github and docs are only matched at path boundaries
119
+ extensions = Regexp.union(markdown_converter.extname_list)
120
+ %r!/(?:\.github/|docs/)?readme(#{extensions})$!i
121
+ end
54
122
  end
55
123
 
56
124
  def markdown_converter
@@ -68,5 +136,14 @@ module JekyllReadmeIndex
68
136
  def cleanup?
69
137
  option(CLEANUP_KEY) == true
70
138
  end
139
+
140
+ def with_frontmatter?
141
+ option(FRONTMATTER_KEY) == true
142
+ end
143
+
144
+ # Helper method to get the file path (URL or path) for a file object
145
+ def file_path(file)
146
+ file.respond_to?(:url) ? file.url : "/" + file.path
147
+ end
71
148
  end
72
149
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module JekyllReadmeIndex
2
- VERSION = "0.2.0".freeze
4
+ VERSION = "0.4.0"
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "jekyll"
2
4
  require "jekyll-readme-index/generator"
3
5
  require_relative "./jekyll/static_file_ext"
metadata CHANGED
@@ -1,58 +1,174 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-readme-index
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Balter
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2017-09-11 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: jekyll
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
- - - "~>"
16
+ - - ">="
18
17
  - !ruby/object:Gem::Version
19
18
  version: '3.0'
19
+ - - "<"
20
+ - !ruby/object:Gem::Version
21
+ version: '5.0'
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
23
25
  requirements:
24
- - - "~>"
26
+ - - ">="
25
27
  - !ruby/object:Gem::Version
26
28
  version: '3.0'
29
+ - - "<"
30
+ - !ruby/object:Gem::Version
31
+ version: '5.0'
32
+ - !ruby/object:Gem::Dependency
33
+ name: kramdown-parser-gfm
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - "~>"
37
+ - !ruby/object:Gem::Version
38
+ version: '1.1'
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - "~>"
44
+ - !ruby/object:Gem::Version
45
+ version: '1.1'
27
46
  - !ruby/object:Gem::Dependency
28
47
  name: rspec
29
48
  requirement: !ruby/object:Gem::Requirement
30
49
  requirements:
31
50
  - - "~>"
32
51
  - !ruby/object:Gem::Version
33
- version: '3.5'
52
+ version: '3.13'
34
53
  type: :development
35
54
  prerelease: false
36
55
  version_requirements: !ruby/object:Gem::Requirement
37
56
  requirements:
38
57
  - - "~>"
39
58
  - !ruby/object:Gem::Version
40
- version: '3.5'
59
+ version: '3.13'
41
60
  - !ruby/object:Gem::Dependency
42
61
  name: rubocop
43
62
  requirement: !ruby/object:Gem::Requirement
44
63
  requirements:
45
64
  - - "~>"
46
65
  - !ruby/object:Gem::Version
47
- version: '0.40'
66
+ version: '1.57'
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: '1.57'
74
+ - !ruby/object:Gem::Dependency
75
+ name: rubocop-jekyll
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '0.14'
81
+ type: :development
82
+ prerelease: false
83
+ version_requirements: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '0.14'
88
+ - !ruby/object:Gem::Dependency
89
+ name: rubocop-performance
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '1.23'
95
+ type: :development
96
+ prerelease: false
97
+ version_requirements: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: '1.23'
102
+ - !ruby/object:Gem::Dependency
103
+ name: rubocop-rspec
104
+ requirement: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '3.0'
48
109
  type: :development
49
110
  prerelease: false
50
111
  version_requirements: !ruby/object:Gem::Requirement
51
112
  requirements:
52
113
  - - "~>"
53
114
  - !ruby/object:Gem::Version
54
- version: '0.40'
55
- description:
115
+ version: '3.0'
116
+ - !ruby/object:Gem::Dependency
117
+ name: base64
118
+ requirement: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ type: :development
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ - !ruby/object:Gem::Dependency
131
+ name: benchmark
132
+ requirement: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ type: :development
138
+ prerelease: false
139
+ version_requirements: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ - !ruby/object:Gem::Dependency
145
+ name: ostruct
146
+ requirement: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ type: :development
152
+ prerelease: false
153
+ version_requirements: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: tsort
160
+ requirement: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ type: :development
166
+ prerelease: false
167
+ version_requirements: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
56
172
  email:
57
173
  - ben.balter@github.com
58
174
  executables: []
@@ -67,7 +183,6 @@ homepage: https://github.com/benbalter/jekyll-readme-index
67
183
  licenses:
68
184
  - MIT
69
185
  metadata: {}
70
- post_install_message:
71
186
  rdoc_options: []
72
187
  require_paths:
73
188
  - lib
@@ -82,9 +197,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
82
197
  - !ruby/object:Gem::Version
83
198
  version: '0'
84
199
  requirements: []
85
- rubyforge_project:
86
- rubygems_version: 2.6.11
87
- signing_key:
200
+ rubygems_version: 4.0.16
88
201
  specification_version: 4
89
202
  summary: A Jekyll plugin to render a project's README as the site's index.
90
203
  test_files: []