jekyll-readme-index 0.3.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
2
  SHA256:
3
- metadata.gz: e5bd74269cd40c7051ee807361769d9a049977d4270ee22d0c59db95adb98fea
4
- data.tar.gz: 3b02a03d7b5a5184d0cb3743cf1e778302fb843f16acfaa898a9c7f1870db6a1
3
+ metadata.gz: 3ff724c2f3f4731b73dc6b4b4ced3bcd84793669c41913c477ea0c926b25a11b
4
+ data.tar.gz: 49768447b305e6dda9605997b1ef8b45b513dfe6ebd9a95136db3bdc383291df
5
5
  SHA512:
6
- metadata.gz: 698899c2dd728705703b01002c82854e18b49728eef9f0761caab3e179f05693322579a0fcfdcfb1e6625f0a6ca0afe14220386f6e263daf6b2b11d0e5f04d19
7
- data.tar.gz: 51953c2dd58f121c858b6ff20e712ba20093c35936a517e3f3ebe4369162086daf792fd6ac3db8ae8689507a891f55976947ecf93c552441456880253d3c9b91
6
+ metadata.gz: cea83b276e2017f4c150400e77f39a6e985bee2a0c0cd7b4fff61da9f0e6f2dce75a2ac0a9be4fd76ea768252cc1fd71457751816c56db91486b908b7cc17526
7
+ data.tar.gz: 3d538fec44f058263ea888acc364f3741304eb9482c4b28e6ea171634d00250f513d6f330fb13da9d7f15bcd5ebc882582ce086cc3a56a178ae3ca233077bdaa
@@ -5,14 +5,34 @@ module Jekyll
5
5
  # Convert this static file to a Page
6
6
  def to_page
7
7
  page = Jekyll::Page.new(@site, @base, @dir, @name)
8
- 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
9
17
  page
10
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
11
27
  end
12
28
 
13
29
  class Page
14
30
  def update_permalink
15
- data["permalink"] = File.dirname(url) + "/"
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
16
36
  @url = URL.new(
17
37
  :template => template,
18
38
  :placeholders => url_placeholders,
@@ -3,6 +3,12 @@
3
3
  module JekyllReadmeIndex
4
4
  class Generator < Jekyll::Generator
5
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
6
12
 
7
13
  attr_accessor :site
8
14
 
@@ -13,6 +19,7 @@ module JekyllReadmeIndex
13
19
  ENABLED_KEY = "enabled"
14
20
  CLEANUP_KEY = "remove_originals"
15
21
  FRONTMATTER_KEY = "with_frontmatter"
22
+ PATTERN_KEY = "readme_pattern"
16
23
 
17
24
  def initialize(site)
18
25
  @site = site
@@ -42,13 +49,49 @@ module JekyllReadmeIndex
42
49
 
43
50
  # Returns an array of all READMEs as StaticFiles
44
51
  def readmes
45
- 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)
46
54
  end
47
55
 
48
56
  def readmes_with_frontmatter
49
- site.pages.select { |file| ("/" + file.path) =~ readme_regex }
57
+ candidates = site.pages.select { |file| ("/" + file.path) =~ readme_regex }
58
+ prioritize_readmes(candidates)
50
59
  end
51
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
+
52
95
  # Should the given readme be the containing directory's index?
53
96
  def should_be_index?(readme)
54
97
  return false unless readme
@@ -67,7 +110,15 @@ module JekyllReadmeIndex
67
110
 
68
111
  # Regexp to match a file path against to detect if the given file is a README
69
112
  def readme_regex
70
- @readme_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
71
122
  end
72
123
 
73
124
  def markdown_converter
@@ -89,5 +140,10 @@ module JekyllReadmeIndex
89
140
  def with_frontmatter?
90
141
  option(FRONTMATTER_KEY) == true
91
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
92
148
  end
93
149
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JekyllReadmeIndex
4
- VERSION = "0.3.0"
4
+ VERSION = "0.4.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-readme-index
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.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: 2019-11-05 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
@@ -30,77 +29,146 @@ dependencies:
30
29
  - - "<"
31
30
  - !ruby/object:Gem::Version
32
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'
33
46
  - !ruby/object:Gem::Dependency
34
47
  name: rspec
35
48
  requirement: !ruby/object:Gem::Requirement
36
49
  requirements:
37
50
  - - "~>"
38
51
  - !ruby/object:Gem::Version
39
- version: '3.5'
52
+ version: '3.13'
40
53
  type: :development
41
54
  prerelease: false
42
55
  version_requirements: !ruby/object:Gem::Requirement
43
56
  requirements:
44
57
  - - "~>"
45
58
  - !ruby/object:Gem::Version
46
- version: '3.5'
59
+ version: '3.13'
47
60
  - !ruby/object:Gem::Dependency
48
61
  name: rubocop
49
62
  requirement: !ruby/object:Gem::Requirement
50
63
  requirements:
51
64
  - - "~>"
52
65
  - !ruby/object:Gem::Version
53
- version: '0.40'
66
+ version: '1.57'
54
67
  type: :development
55
68
  prerelease: false
56
69
  version_requirements: !ruby/object:Gem::Requirement
57
70
  requirements:
58
71
  - - "~>"
59
72
  - !ruby/object:Gem::Version
60
- version: '0.40'
73
+ version: '1.57'
61
74
  - !ruby/object:Gem::Dependency
62
75
  name: rubocop-jekyll
63
76
  requirement: !ruby/object:Gem::Requirement
64
77
  requirements:
65
78
  - - "~>"
66
79
  - !ruby/object:Gem::Version
67
- version: 0.10.0
80
+ version: '0.14'
68
81
  type: :development
69
82
  prerelease: false
70
83
  version_requirements: !ruby/object:Gem::Requirement
71
84
  requirements:
72
85
  - - "~>"
73
86
  - !ruby/object:Gem::Version
74
- version: 0.10.0
87
+ version: '0.14'
75
88
  - !ruby/object:Gem::Dependency
76
89
  name: rubocop-performance
77
90
  requirement: !ruby/object:Gem::Requirement
78
91
  requirements:
79
92
  - - "~>"
80
93
  - !ruby/object:Gem::Version
81
- version: '1.5'
94
+ version: '1.23'
82
95
  type: :development
83
96
  prerelease: false
84
97
  version_requirements: !ruby/object:Gem::Requirement
85
98
  requirements:
86
99
  - - "~>"
87
100
  - !ruby/object:Gem::Version
88
- version: '1.5'
101
+ version: '1.23'
89
102
  - !ruby/object:Gem::Dependency
90
103
  name: rubocop-rspec
91
104
  requirement: !ruby/object:Gem::Requirement
92
105
  requirements:
93
106
  - - "~>"
94
107
  - !ruby/object:Gem::Version
95
- version: '1.3'
108
+ version: '3.0'
96
109
  type: :development
97
110
  prerelease: false
98
111
  version_requirements: !ruby/object:Gem::Requirement
99
112
  requirements:
100
113
  - - "~>"
101
114
  - !ruby/object:Gem::Version
102
- version: '1.3'
103
- 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'
104
172
  email:
105
173
  - ben.balter@github.com
106
174
  executables: []
@@ -115,7 +183,6 @@ homepage: https://github.com/benbalter/jekyll-readme-index
115
183
  licenses:
116
184
  - MIT
117
185
  metadata: {}
118
- post_install_message:
119
186
  rdoc_options: []
120
187
  require_paths:
121
188
  - lib
@@ -130,8 +197,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
197
  - !ruby/object:Gem::Version
131
198
  version: '0'
132
199
  requirements: []
133
- rubygems_version: 3.0.6
134
- signing_key:
200
+ rubygems_version: 4.0.16
135
201
  specification_version: 4
136
202
  summary: A Jekyll plugin to render a project's README as the site's index.
137
203
  test_files: []