jekyll-fdroid 0.0.1 → 0.1.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 +4 -4
- data/lib/fdroid/FDroidIndex.rb +26 -0
- data/lib/jekyll-fdroid.rb +29 -0
- data/lib/jekyll/FDroidBrowsingPage.rb +31 -0
- data/lib/jekyll/FDroidFilters.rb +179 -0
- data/lib/jekyll/FDroidLastUpdatedPackagesTag.rb +33 -0
- data/lib/jekyll/FDroidLatestPackagesTag.rb +33 -0
- data/lib/jekyll/FDroidPackageDetailGenerator.rb +68 -0
- data/lib/jekyll/FDroidPackageDetailPage.rb +123 -0
- data/lib/jekyll/FDroidSearchAutocompleteTag.rb +45 -0
- data/lib/jekyll/ReadYamlPage.rb +40 -0
- data/lib/lunr/Javascript.rb +18 -0
- data/lib/lunr/LunrIndexer.rb +109 -0
- data/lib/lunr/SearchIndexFile.rb +16 -0
- metadata +72 -4
- data/lib/fdroid.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7d4628ad929d42b592bd9096caf753b7b0d4b811
|
4
|
+
data.tar.gz: ecc2b389a4768ba6ba7119fc1e6f044148c85291
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa109fd573b0bc32dae7904af8185f05765ccccf5f29becaca0e9ea0c5f0aed262235ce2c99bfd24b2e425cddeeea3442a39ab15f3bd9a58efa756cac563060c
|
7
|
+
data.tar.gz: 405296432079dc71309eb57bf37f3133d93d17080288c89ecfbcf8c3bcd9755001752c2b6b80b72d69f9be3f6f9c439ecd9549f08afb1cf78cd927f6b4dd71f1
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# F-Droid's Jekyll Plugin
|
2
|
+
#
|
3
|
+
# Copyright (C) 2017 Nico Alt
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as
|
7
|
+
# published by the Free Software Foundation, either version 3 of the
|
8
|
+
# License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
require 'nokogiri'
|
19
|
+
require 'open-uri'
|
20
|
+
|
21
|
+
class FDroidIndex
|
22
|
+
def getIndex(repo)
|
23
|
+
index = open(URI.parse(repo + '/index.xml')).read
|
24
|
+
Nokogiri::XML(index).xpath('fdroid').xpath('application')
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# F-Droid's Jekyll Plugin
|
2
|
+
#
|
3
|
+
# Copyright (C) 2017 Nico Alt
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as
|
7
|
+
# published by the Free Software Foundation, either version 3 of the
|
8
|
+
# License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
require "fdroid/FDroidIndex"
|
19
|
+
require "jekyll/ReadYamlPage"
|
20
|
+
require "jekyll/FDroidBrowsingPage"
|
21
|
+
require "jekyll/FDroidFilters"
|
22
|
+
require "jekyll/FDroidLastUpdatedPackagesTag"
|
23
|
+
require "jekyll/FDroidLatestPackagesTag"
|
24
|
+
require "jekyll/FDroidPackageDetailGenerator"
|
25
|
+
require "jekyll/FDroidPackageDetailPage"
|
26
|
+
require "jekyll/FDroidSearchAutocompleteTag"
|
27
|
+
require "lunr/LunrIndexer"
|
28
|
+
require "lunr/SearchIndexFile"
|
29
|
+
require "lunr/Javascript"
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# F-Droid's Jekyll Plugin
|
2
|
+
#
|
3
|
+
# Copyright (C) 2017 Nico Alt
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as
|
7
|
+
# published by the Free Software Foundation, either version 3 of the
|
8
|
+
# License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
module Jekyll
|
19
|
+
|
20
|
+
class FDroidBrowsingPage < ReadYamlPage
|
21
|
+
def initialize(site, base)
|
22
|
+
@site = site
|
23
|
+
@base = base
|
24
|
+
@dir = "packages"
|
25
|
+
@name = "index.html"
|
26
|
+
|
27
|
+
self.process(@name)
|
28
|
+
self.read_yaml((File.expand_path "../../_pages", File.dirname(__FILE__)), 'browse.html')
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,179 @@
|
|
1
|
+
# F-Droid's Jekyll Plugin
|
2
|
+
#
|
3
|
+
# Copyright (C) 2017 Nico Alt
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as
|
7
|
+
# published by the Free Software Foundation, either version 3 of the
|
8
|
+
# License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
module Jekyll
|
19
|
+
|
20
|
+
module Filters
|
21
|
+
|
22
|
+
# Convert an Android SDK level into an Android version.
|
23
|
+
#
|
24
|
+
# input - Android SDK Level.
|
25
|
+
#
|
26
|
+
# Returns the Android version.
|
27
|
+
def android_sdk_level_to_version(input)
|
28
|
+
sdkLevel = @@AndroidSdkLevelToVersionRelation[input]
|
29
|
+
if not sdkLevel.nil?
|
30
|
+
return sdkLevel
|
31
|
+
end
|
32
|
+
return '?'
|
33
|
+
end
|
34
|
+
|
35
|
+
# Hash with relation between Android SDK Level and Android version
|
36
|
+
@@AndroidSdkLevelToVersionRelation = {
|
37
|
+
'1' => '1.0',
|
38
|
+
'2' => '1.1',
|
39
|
+
'3' => '1.5',
|
40
|
+
'4' => '1.6',
|
41
|
+
'5' => '2.0',
|
42
|
+
'6' => '2.0.1',
|
43
|
+
'7' => '2.1',
|
44
|
+
'8' => '2.2',
|
45
|
+
'9' => '2.3',
|
46
|
+
'10' => '2.3.3',
|
47
|
+
'11' => '3.0',
|
48
|
+
'12' => '3.1',
|
49
|
+
'13' => '3.2',
|
50
|
+
'14' => '4.0',
|
51
|
+
'15' => '4.0.3',
|
52
|
+
'16' => '4.1',
|
53
|
+
'17' => '4.2',
|
54
|
+
'18' => '4.3',
|
55
|
+
'19' => '4.4',
|
56
|
+
'20' => '4.4W',
|
57
|
+
'21' => '5.0',
|
58
|
+
'22' => '5.1',
|
59
|
+
'23' => '6.0',
|
60
|
+
'24' => '7.0',
|
61
|
+
'25' => '7.1'
|
62
|
+
}
|
63
|
+
|
64
|
+
# Convert a file size to a human-readable String.
|
65
|
+
# Source: https://codereview.stackexchange.com/q/9107
|
66
|
+
#
|
67
|
+
# input - File size in Bytes.
|
68
|
+
#
|
69
|
+
# Returns human-readable String.
|
70
|
+
def file_size_human_readable(input)
|
71
|
+
input = input.to_f
|
72
|
+
i = PREFIX.length - 1
|
73
|
+
while input > 512 && i > 0
|
74
|
+
i -= 1
|
75
|
+
input /= 1024
|
76
|
+
end
|
77
|
+
return ((input > 9 || input.modulo(1) < 0.1 ? '%d' : '%.1f') % input) + ' ' + PREFIX[i]
|
78
|
+
end
|
79
|
+
PREFIX = %W(TiB GiB MiB KiB B).freeze
|
80
|
+
|
81
|
+
# Convert a SPDX license identifier to its full name.
|
82
|
+
#
|
83
|
+
# input - SPDX license identifier.
|
84
|
+
#
|
85
|
+
# Returns full license name.
|
86
|
+
def get_license_name(input)
|
87
|
+
if input.nil? or input.empty?
|
88
|
+
return 'Unknown'
|
89
|
+
end
|
90
|
+
spdxLicense = @@SpdxLicenseNameToGnuUrlRelation[input]
|
91
|
+
if input.end_with? "+"
|
92
|
+
spdxLicense = @@SpdxLicenseNameToGnuUrlRelation[input.chomp('+')]
|
93
|
+
end
|
94
|
+
if not spdxLicense.nil?
|
95
|
+
if input.end_with? "+"
|
96
|
+
return spdxLicense['name'] + ' or later version'
|
97
|
+
end
|
98
|
+
return spdxLicense['name']
|
99
|
+
end
|
100
|
+
return input
|
101
|
+
end
|
102
|
+
|
103
|
+
# Convert a SPDX license identifier to its URL on GNU.org.
|
104
|
+
#
|
105
|
+
# input - SPDX license identifier.
|
106
|
+
#
|
107
|
+
# Returns URL on GNU.org.
|
108
|
+
def get_license_url(input)
|
109
|
+
if input.nil? or input.empty?
|
110
|
+
return ''
|
111
|
+
end
|
112
|
+
if input.end_with? "+"
|
113
|
+
input = input.chomp('+')
|
114
|
+
end
|
115
|
+
spdxLicense = @@SpdxLicenseNameToGnuUrlRelation[input]
|
116
|
+
if not spdxLicense.nil?
|
117
|
+
return spdxLicense['url']
|
118
|
+
end
|
119
|
+
return 'https://spdx.org/licenses/' + input + '.html'
|
120
|
+
end
|
121
|
+
|
122
|
+
# Hash with relation between SPDX license identifier and its full name and URL, mostly on GNU.org.
|
123
|
+
# For the beginning, I only used OSI approved and frequently used licenses.
|
124
|
+
@@SpdxLicenseNameToGnuUrlRelation = {
|
125
|
+
'AGPL-3.0' => {
|
126
|
+
'name' => 'GNU Affero General Public License v3.0',
|
127
|
+
'url' => 'https://www.gnu.org/licenses/license-list.html#AGPLv3.0'
|
128
|
+
},
|
129
|
+
'Apache-2.0' => {
|
130
|
+
'name' => 'Apache License 2.0',
|
131
|
+
'url' => 'https://www.gnu.org/licenses/license-list.html#apache2'
|
132
|
+
},
|
133
|
+
'BSD-2-Clause' => {
|
134
|
+
'name' => 'BSD 2-clause "Simplified" License',
|
135
|
+
'url' => 'https://www.gnu.org/licenses/license-list.html#FreeBSD'
|
136
|
+
},
|
137
|
+
'BSD-3-Clause' => {
|
138
|
+
'name' => 'BSD 3-clause "New" or "Revised" License',
|
139
|
+
'url' => 'https://www.gnu.org/licenses/license-list.html#ModifiedBSD'
|
140
|
+
},
|
141
|
+
'GPL-2.0' => {
|
142
|
+
'name' => 'GNU General Public License v2.0',
|
143
|
+
'url' => 'https://www.gnu.org/licenses/license-list.html#GPLv2'
|
144
|
+
},
|
145
|
+
'GPL-3.0' => {
|
146
|
+
'name' => 'GNU General Public License v3.0',
|
147
|
+
'url' => 'https://www.gnu.org/licenses/license-list.html#GNUGPLv3'
|
148
|
+
},
|
149
|
+
'ISC' => {
|
150
|
+
'name' => 'ISC License',
|
151
|
+
'url' => 'https://www.gnu.org/licenses/license-list.en.html#ISC'
|
152
|
+
},
|
153
|
+
'LGPL-2.1' => {
|
154
|
+
'name' => 'GNU Lesser General Public License v2.1',
|
155
|
+
'url' => 'https://www.gnu.org/licenses/license-list.html#LGPLv2.1'
|
156
|
+
},
|
157
|
+
'LGPL-3.0' => {
|
158
|
+
'name' => 'GNU Lesser General Public License v3.0',
|
159
|
+
'url' => 'https://www.gnu.org/licenses/license-list.html#LGPLv3'
|
160
|
+
},
|
161
|
+
'MIT' => {
|
162
|
+
'name' => 'MIT License',
|
163
|
+
'url' => 'https://www.gnu.org/licenses/license-list.html#X11License'
|
164
|
+
},
|
165
|
+
'MPL-1.1' => {
|
166
|
+
'name' => 'Mozilla Public License 1.1',
|
167
|
+
'url' => 'https://www.gnu.org/licenses/license-list.html#MPL'
|
168
|
+
},
|
169
|
+
'MPL-2.0' => {
|
170
|
+
'name' => 'Mozilla Public License 2.0',
|
171
|
+
'url' => 'https://www.gnu.org/licenses/license-list.html#MPL-2.0'
|
172
|
+
}
|
173
|
+
}
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
Liquid::Template.register_filter(
|
178
|
+
Jekyll::Filters
|
179
|
+
)
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# F-Droid's Jekyll Plugin
|
2
|
+
#
|
3
|
+
# Copyright (C) 2017 Nico Alt
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as
|
7
|
+
# published by the Free Software Foundation, either version 3 of the
|
8
|
+
# License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
module Jekyll
|
19
|
+
|
20
|
+
class FDroidLastUpdatedPackagesTag < Liquid::Tag
|
21
|
+
|
22
|
+
def initialize(tag_name, text, tokens)
|
23
|
+
super
|
24
|
+
end
|
25
|
+
|
26
|
+
def render(context)
|
27
|
+
template = Liquid::Template.parse(IO.read((File.expand_path "../../_layouts/sidebar-lastupdated-packages.html", File.dirname(__FILE__))))
|
28
|
+
template.render(context)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
Liquid::Template.register_tag('fdroid_show_last_updated_packages', Jekyll::FDroidLastUpdatedPackagesTag)
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# F-Droid's Jekyll Plugin
|
2
|
+
#
|
3
|
+
# Copyright (C) 2017 Nico Alt
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as
|
7
|
+
# published by the Free Software Foundation, either version 3 of the
|
8
|
+
# License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
module Jekyll
|
19
|
+
|
20
|
+
class FDroidLatestPackagesTag < Liquid::Tag
|
21
|
+
|
22
|
+
def initialize(tag_name, text, tokens)
|
23
|
+
super
|
24
|
+
end
|
25
|
+
|
26
|
+
def render(context)
|
27
|
+
template = Liquid::Template.parse(IO.read((File.expand_path "../../_layouts/sidebar-latest-packages.html", File.dirname(__FILE__))))
|
28
|
+
template.render(context)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
Liquid::Template.register_tag('fdroid_show_latest_packages', Jekyll::FDroidLatestPackagesTag)
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# F-Droid's Jekyll Plugin
|
2
|
+
#
|
3
|
+
# Copyright (C) 2017 Nico Alt
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as
|
7
|
+
# published by the Free Software Foundation, either version 3 of the
|
8
|
+
# License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
module Jekyll
|
19
|
+
|
20
|
+
class FDroidPackagesGenerator < Generator
|
21
|
+
attr_accessor :alreadyBuilt
|
22
|
+
|
23
|
+
safe true
|
24
|
+
priority :highest
|
25
|
+
|
26
|
+
def generate(site)
|
27
|
+
# generator will only run on first build, not because of auto-regeneration
|
28
|
+
if @alreadyBuilt != true
|
29
|
+
@alreadyBuilt = true
|
30
|
+
|
31
|
+
# Add plugin's SASS directory so site's list of SASS directories
|
32
|
+
if site.config["sass"].nil? || site.config["sass"].empty?
|
33
|
+
site.config["sass"] = Hash.new
|
34
|
+
end
|
35
|
+
if site.config["sass"]["load_paths"].nil? || site.config["sass"]["load_paths"].empty?
|
36
|
+
site.config["sass"]["load_paths"] = ["_sass", (File.expand_path "../../_sass", File.dirname(__FILE__))]
|
37
|
+
else
|
38
|
+
site.config["sass"]["load_paths"] << (File.expand_path "../../_sass", File.dirname(__FILE__))
|
39
|
+
end
|
40
|
+
|
41
|
+
# Enable pagination
|
42
|
+
if site.config["pagination"].nil? || site.config["pagination"].empty?
|
43
|
+
site.config["pagination"] = Hash.new
|
44
|
+
end
|
45
|
+
site.config["pagination"]["enabled"] = true
|
46
|
+
|
47
|
+
packages = FDroidIndex.new.getIndex(site.config["fdroid-repo"])
|
48
|
+
|
49
|
+
Jekyll::LunrJsSearch::Indexer.new.generate(site, packages)
|
50
|
+
|
51
|
+
# Generate detail page for every package
|
52
|
+
site.collections["packages"] = Collection.new(site, "packages")
|
53
|
+
packages.each do |package|
|
54
|
+
# This page needs to be created twice, once for site.pages, and once for site.collections.
|
55
|
+
# If not, then the i18n code in jekyll-polyglot will end up processing the page twice, as
|
56
|
+
# it iterates over all pages and all packages. The end result is a double prefix for "/en/en"
|
57
|
+
# for any links in the page.
|
58
|
+
# https://gitlab.com/fdroid/jekyll-fdroid/issues/38
|
59
|
+
site.pages << FDroidPackageDetailPage.new(site, site.source, package)
|
60
|
+
site.collections["packages"].docs << FDroidPackageDetailPage.new(site, site.source, package)
|
61
|
+
end
|
62
|
+
# Generate browsing pages
|
63
|
+
site.includes_load_paths << (File.expand_path "../../_includes", File.dirname(__FILE__))
|
64
|
+
site.pages << FDroidBrowsingPage.new(site, site.source)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# F-Droid's Jekyll Plugin
|
2
|
+
#
|
3
|
+
# Copyright (C) 2017 Nico Alt
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as
|
7
|
+
# published by the Free Software Foundation, either version 3 of the
|
8
|
+
# License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
module Jekyll
|
19
|
+
|
20
|
+
class FDroidPackageDetailPage < ReadYamlPage
|
21
|
+
def initialize(site, base, package)
|
22
|
+
$package = package
|
23
|
+
@site = site
|
24
|
+
@base = base
|
25
|
+
@dir = "packages"
|
26
|
+
@name = $package.at_xpath('id').content + "/index.html"
|
27
|
+
|
28
|
+
self.process(@name)
|
29
|
+
self.read_yaml(getLayoutDir(), 'package.html')
|
30
|
+
|
31
|
+
getGeneralFrontMatterData
|
32
|
+
getPackagesFrontMatterData
|
33
|
+
end
|
34
|
+
|
35
|
+
def getLayoutDir()
|
36
|
+
layout_dir_override = File.join(site.source, "_layouts")
|
37
|
+
if File.exists? File.join(layout_dir_override, "package.html")
|
38
|
+
return layout_dir_override
|
39
|
+
else
|
40
|
+
return File.expand_path "../../_layouts", File.dirname(__FILE__)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def getGeneralFrontMatterData
|
45
|
+
# Hash with relation between Jekyll and XML variable name
|
46
|
+
assignments = {
|
47
|
+
"added" => "added",
|
48
|
+
"antifeatures" => "antifeatures",
|
49
|
+
"bitcoin" => "bitcoin",
|
50
|
+
"categories" => "categories",
|
51
|
+
"changelog" => "changelog",
|
52
|
+
"description" => "desc",
|
53
|
+
"donate" => "donate",
|
54
|
+
"flattr" => "flattr",
|
55
|
+
"icon" => "icon",
|
56
|
+
"issueTracker" => "tracker",
|
57
|
+
"lastUpdated" => "lastupdated",
|
58
|
+
"license" => "license",
|
59
|
+
"suggestedVersionCode" => "marketvercode",
|
60
|
+
"suggestedVersion" => "marketversion",
|
61
|
+
"package" => "id",
|
62
|
+
"sourceCode" => "source",
|
63
|
+
"summary" => "summary",
|
64
|
+
"title" => "name",
|
65
|
+
"webSite" => "web"
|
66
|
+
}
|
67
|
+
# Add information from XML to front matter
|
68
|
+
assignments.each do |jekyll, xml|
|
69
|
+
addGeneralFrontMatterData(jekyll, xml)
|
70
|
+
end
|
71
|
+
self.data["beautifulURL"] = "/packages/" + self.data["package"]
|
72
|
+
end
|
73
|
+
|
74
|
+
def addGeneralFrontMatterData(jekyll, xml)
|
75
|
+
xmlData = $package.at_xpath(xml)
|
76
|
+
if xmlData != nil
|
77
|
+
self.data[jekyll] = xmlData.content
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# Hash with relation between Jekyll and XML variable names for the package metadata
|
82
|
+
@@jekyllToXmlPackageAssignments = {
|
83
|
+
"added" => "added",
|
84
|
+
"apkName" => "apkname",
|
85
|
+
"hash" => "hash",
|
86
|
+
"nativeCode" => "nativecode",
|
87
|
+
"maxSDKVersion" => "maxsdkver",
|
88
|
+
"permissions" => "permissions",
|
89
|
+
"sdkVersion" => "sdkver",
|
90
|
+
"sig" => "sig",
|
91
|
+
"size" => "size",
|
92
|
+
"srcName" => "srcname",
|
93
|
+
"targetSdkVersion" => "targetSdkVersion",
|
94
|
+
"version" => "version",
|
95
|
+
"versionCode" => "versioncode",
|
96
|
+
}
|
97
|
+
|
98
|
+
def getPackagesFrontMatterData
|
99
|
+
self.data["packages"] = $package.xpath('package').map { |package| getPackageFromXml(package) }
|
100
|
+
end
|
101
|
+
|
102
|
+
def getPackageFromXml(packageXml)
|
103
|
+
packageInformation = Hash.new
|
104
|
+
|
105
|
+
# Add information from XML to front matter
|
106
|
+
@@jekyllToXmlPackageAssignments.each do |jekyll, xml|
|
107
|
+
xmlData = packageXml.at_xpath(xml)
|
108
|
+
if xmlData == nil
|
109
|
+
next
|
110
|
+
end
|
111
|
+
|
112
|
+
# nativeCode and permissions can be comma separated arrays
|
113
|
+
if ["nativeCode", "permissions"].include? jekyll
|
114
|
+
packageInformation[jekyll] = xmlData.content.split(",")
|
115
|
+
else
|
116
|
+
packageInformation[jekyll] = xmlData.content
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
return packageInformation
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# F-Droid's Jekyll Plugin
|
2
|
+
#
|
3
|
+
# Copyright (C) 2017 Peter Serwylo
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as
|
7
|
+
# published by the Free Software Foundation, either version 3 of the
|
8
|
+
# License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
module Jekyll
|
19
|
+
|
20
|
+
class FDroidSearchTemplateableAutocompleteBlock < Liquid::Block
|
21
|
+
def self.render_template(context, template)
|
22
|
+
context['result_item_template'] = template
|
23
|
+
context['search_id'] = rand(1000000)
|
24
|
+
|
25
|
+
path = "../../_layouts/search-autocomplete.html"
|
26
|
+
template = Liquid::Template.parse(IO.read((File.expand_path path, File.dirname(__FILE__))))
|
27
|
+
template.render(context)
|
28
|
+
end
|
29
|
+
|
30
|
+
def render(context)
|
31
|
+
FDroidSearchTemplateableAutocompleteBlock.render_template(context, super.to_s)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class FDroidSearchAutocompleteTag < Liquid::Tag
|
36
|
+
def render(context)
|
37
|
+
path = "../../_includes/search-autocomplete-default-result-template.html"
|
38
|
+
result_item_template = IO.read((File.expand_path path, File.dirname(__FILE__)))
|
39
|
+
FDroidSearchTemplateableAutocompleteBlock.render_template(context, result_item_template)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
Liquid::Template.register_tag('fdroid_search_autocomplete', Jekyll::FDroidSearchAutocompleteTag)
|
45
|
+
Liquid::Template.register_tag('fdroid_search_autocomplete_with_template', Jekyll::FDroidSearchTemplateableAutocompleteBlock)
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# F-Droid's Jekyll Plugin
|
2
|
+
#
|
3
|
+
# Copyright (C) 2017 Nico Alt
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as
|
7
|
+
# published by the Free Software Foundation, either version 3 of the
|
8
|
+
# License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#
|
18
|
+
# Found at https://github.com/ggreer/jekyll-gallery-generator/blob/master/lib/jekyll-gallery-generator.rb#L69
|
19
|
+
|
20
|
+
module Jekyll
|
21
|
+
|
22
|
+
class ReadYamlPage < Page
|
23
|
+
# We need do define it ourself because the templates are in the plugin's directory
|
24
|
+
def read_yaml(base, name, opts = {})
|
25
|
+
begin
|
26
|
+
self.content = File.read(File.join(base.to_s, name.to_s), (site ? site.file_read_opts : {}).merge(opts))
|
27
|
+
if content =~ /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m
|
28
|
+
self.content = $POSTMATCH
|
29
|
+
self.data = SafeYAML.load($1)
|
30
|
+
end
|
31
|
+
rescue SyntaxError => e
|
32
|
+
Jekyll.logger.warn "YAML Exception reading #{File.join(base.to_s, name.to_s)}: #{e.message}"
|
33
|
+
rescue Exception => e
|
34
|
+
Jekyll.logger.warn "Error reading file #{File.join(base.to_s, name.to_s)}: #{e.message}"
|
35
|
+
end
|
36
|
+
|
37
|
+
self.data ||= {}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#
|
2
|
+
# From the MIT licensed file here:
|
3
|
+
#
|
4
|
+
# https://github.com/slashdotdash/jekyll-lunr-js-search/blob/master/lib/jekyll_lunr_js_search/javascript.rb
|
5
|
+
#
|
6
|
+
|
7
|
+
require "v8"
|
8
|
+
require "json"
|
9
|
+
|
10
|
+
class V8::Object
|
11
|
+
def to_json
|
12
|
+
@context['JSON']['stringify'].call(self)
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_hash
|
16
|
+
JSON.parse(to_json, :max_nesting => false)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
#
|
2
|
+
# Adapted from the MIT licensed Jekyll.LunrJsSearch.Indexer class at:
|
3
|
+
#
|
4
|
+
# https://github.com/slashdotdash/jekyll-lunr-js-search/blob/master/lib/jekyll_lunr_js_search/indexer.rb
|
5
|
+
#
|
6
|
+
# The intent is to stay as close to that as possible, so that future patches could potentially be applied.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'fileutils'
|
10
|
+
require 'net/http'
|
11
|
+
require 'json'
|
12
|
+
require 'uri'
|
13
|
+
require 'v8'
|
14
|
+
|
15
|
+
module Jekyll
|
16
|
+
module LunrJsSearch
|
17
|
+
class Indexer
|
18
|
+
def generate(site, packages)
|
19
|
+
@js_dir = 'js'
|
20
|
+
|
21
|
+
ctx = V8::Context.new
|
22
|
+
ctx.load(Indexer.path_to_asset('bower_components/lunr.js/lunr.js'))
|
23
|
+
|
24
|
+
ctx['indexer'] = proc do |this|
|
25
|
+
this.ref('id')
|
26
|
+
this.field('name')
|
27
|
+
this.field('summary')
|
28
|
+
end
|
29
|
+
|
30
|
+
ctx.eval('builder = new lunr.Builder')
|
31
|
+
ctx.eval('builder.pipeline.add(lunr.trimmer, lunr.stopWordFilter)')
|
32
|
+
ctx.eval('indexer.call(builder, builder)')
|
33
|
+
|
34
|
+
@lunr_version = ctx.eval('lunr.version')
|
35
|
+
@docs = {}
|
36
|
+
|
37
|
+
Jekyll.logger.info "Lunr:", "Creating search index (lunr.js version #{@lunr_version})..."
|
38
|
+
|
39
|
+
@site = site
|
40
|
+
|
41
|
+
packages.each_with_index do |package, i|
|
42
|
+
package_name = package['id']
|
43
|
+
name = Indexer.content_from_xml(package, 'name')
|
44
|
+
icon = Indexer.content_from_xml(package, 'icon')
|
45
|
+
summary = Indexer.content_from_xml(package, 'summary')
|
46
|
+
|
47
|
+
doc = {
|
48
|
+
'id' => i,
|
49
|
+
'packageName' => package_name,
|
50
|
+
'icon' => icon,
|
51
|
+
'name' => name,
|
52
|
+
'summary' => summary
|
53
|
+
}
|
54
|
+
|
55
|
+
ctx['builder'].add(doc)
|
56
|
+
@docs[i] = doc
|
57
|
+
|
58
|
+
Jekyll.logger.debug "Lunr:", package_name
|
59
|
+
end
|
60
|
+
|
61
|
+
@index = ctx.eval('builder.build()')
|
62
|
+
|
63
|
+
FileUtils.mkdir_p(File.join(site.dest, @js_dir))
|
64
|
+
filename = File.join(@js_dir, 'index.json')
|
65
|
+
|
66
|
+
total = {
|
67
|
+
"docs" => @docs,
|
68
|
+
"index" => @index.to_hash
|
69
|
+
}
|
70
|
+
|
71
|
+
filepath = File.join(site.dest, filename)
|
72
|
+
File.open(filepath, "w") { |f| f.write(JSON.dump(total)) }
|
73
|
+
Jekyll.logger.info "Lunr:", "Index ready (lunr.js v#{@lunr_version})"
|
74
|
+
added_files = [filename]
|
75
|
+
|
76
|
+
site_js = File.join(site.dest, @js_dir)
|
77
|
+
extras = [
|
78
|
+
'assets/fdroid-search-autocomplete.js',
|
79
|
+
'bower_components/lunr.js/lunr.js',
|
80
|
+
'bower_components/mustache.js/mustache.min.js',
|
81
|
+
'bower_components/awesomplete/awesomplete.min.js',
|
82
|
+
'bower_components/awesomplete/awesomplete.css'
|
83
|
+
]
|
84
|
+
Jekyll.logger.info "Lunr:", "Added required assets to #{@js_dir}"
|
85
|
+
extras.each do |path|
|
86
|
+
src = Indexer.path_to_asset(path)
|
87
|
+
Jekyll.logger.debug "Lunr:", "Copying asset from #{src} to #{site_js}"
|
88
|
+
FileUtils.cp(src, site_js)
|
89
|
+
added_files.push(File.join(@js_dir, File.basename(src)))
|
90
|
+
end
|
91
|
+
|
92
|
+
# Keep the written files from being cleaned by Jekyll
|
93
|
+
added_files.each do |filename|
|
94
|
+
site.static_files << SearchIndexFile.new(site, site.dest, "/", filename)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def self.path_to_asset(path)
|
99
|
+
return File.join(File.dirname(__FILE__), "../../#{path}")
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.content_from_xml(xml_node, element_name)
|
103
|
+
xml_data = xml_node.at_xpath(element_name)
|
104
|
+
return xml_data == nil ? nil : xml_data.content
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#
|
2
|
+
# From the MIT licensed file here:
|
3
|
+
#
|
4
|
+
# https://github.com/slashdotdash/jekyll-lunr-js-search/blob/master/lib/jekyll_lunr_js_search/search_index_file.rb
|
5
|
+
#
|
6
|
+
|
7
|
+
module Jekyll
|
8
|
+
module LunrJsSearch
|
9
|
+
class SearchIndexFile < Jekyll::StaticFile
|
10
|
+
# Override write as the index.json index file has already been created
|
11
|
+
def write(dest)
|
12
|
+
true
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
metadata
CHANGED
@@ -1,22 +1,90 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-fdroid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nico Alt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
12
|
-
dependencies:
|
11
|
+
date: 2017-06-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: nokogiri
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: jekyll-include-cache
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: jekyll-paginate-v2
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "<="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.7.3
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "<="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.7.3
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: therubyracer
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.12'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.12'
|
13
69
|
description: Browse packages of a F-Droid repository.
|
14
70
|
email: nicoalt@posteo.org
|
15
71
|
executables: []
|
16
72
|
extensions: []
|
17
73
|
extra_rdoc_files: []
|
18
74
|
files:
|
19
|
-
- lib/fdroid.rb
|
75
|
+
- lib/fdroid/FDroidIndex.rb
|
76
|
+
- lib/jekyll-fdroid.rb
|
77
|
+
- lib/jekyll/FDroidBrowsingPage.rb
|
78
|
+
- lib/jekyll/FDroidFilters.rb
|
79
|
+
- lib/jekyll/FDroidLastUpdatedPackagesTag.rb
|
80
|
+
- lib/jekyll/FDroidLatestPackagesTag.rb
|
81
|
+
- lib/jekyll/FDroidPackageDetailGenerator.rb
|
82
|
+
- lib/jekyll/FDroidPackageDetailPage.rb
|
83
|
+
- lib/jekyll/FDroidSearchAutocompleteTag.rb
|
84
|
+
- lib/jekyll/ReadYamlPage.rb
|
85
|
+
- lib/lunr/Javascript.rb
|
86
|
+
- lib/lunr/LunrIndexer.rb
|
87
|
+
- lib/lunr/SearchIndexFile.rb
|
20
88
|
homepage: https://gitlab.com/fdroid/jekyll-fdroid
|
21
89
|
licenses:
|
22
90
|
- AGPL-3.0
|