meta 0.0.1 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,18 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- meta (0.0.1)
4
+ meta (0.0.3)
5
+ colorize (~> 0.6.0)
6
+ haml (~> 4.0.4)
7
+ highline (~> 1.6.20)
8
+ rack (~> 1.5.2)
9
+ redcarpet (~> 3.0.0)
10
+ sequel (~> 4.5.0)
11
+ sqlite3 (~> 1.3.8)
12
+ thin (~> 1.6.1)
13
+ thor (~> 0.18.1)
14
+ tilt (~> 2.0.0)
15
+ url2thumb
5
16
 
6
17
  GEM
7
18
  remote: https://rubygems.org/
@@ -23,6 +34,7 @@ GEM
23
34
  rack (>= 1.0.0)
24
35
  thor (0.18.1)
25
36
  tilt (2.0.0)
37
+ url2thumb (0.0.1)
26
38
 
27
39
  PLATFORMS
28
40
  ruby
data/README.md CHANGED
@@ -8,7 +8,8 @@ be used to test/preview static pages in your development environment without
8
8
  having to deploy into production.
9
9
 
10
10
  ## requirements
11
- * ruby 1.9.2+
11
+ * linux (tested on ubuntu 12.04.x lts)
12
+ * ruby (1.9.2+)
12
13
  * bundler
13
14
  * colorize
14
15
  * haml
@@ -20,6 +21,8 @@ having to deploy into production.
20
21
  * thin
21
22
  * thor
22
23
  * tilt
24
+ * url2thumb
25
+ * yaml
23
26
 
24
27
  ## installation
25
28
  ```gem install meta```
data/docs/backlog CHANGED
@@ -1,12 +1,16 @@
1
1
  open:
2
- + migrate schema without losing any data
3
- + multiple templates
4
- + syntax highlighting for code
5
- + title modification
2
+ + custom templates
6
3
  + referencing a link and commenting on that
4
+ + post tags
5
+ + rss/atom feed
6
+ + config file based configuration
7
+ + pull content from other sinks like facebook, flickr, twitter, wechat, etc
8
+ + links
7
9
 
8
10
  iced:
11
+ + syntax highlighting for code
9
12
  + support uppercase file extensions
13
+ + migrate schema without losing any data
10
14
  + detect and compile changes only
11
15
  + tie static files with source repository
12
16
  + clone template files
@@ -24,3 +28,6 @@ closed:
24
28
  + single entry template
25
29
  + add config.ru file for testing, this should be added during compilation
26
30
  + google analytics
31
+ + title modification
32
+ + statistics
33
+
data/docs/design CHANGED
@@ -9,15 +9,12 @@ design:
9
9
  directory layout example:
10
10
 
11
11
  + src
12
- +-- site.db
12
+ +-- site.sqlite3
13
13
  +-- article1.md
14
14
  +-- article2.md
15
15
  +-- layout.haml
16
16
  +-- navbar.haml
17
17
  +-- footer.haml
18
- +-- css
19
- +-- images
20
- +-- js
21
18
 
22
19
  * create a flat hierarchy of html files
23
20
  * js, css, images are found in folders
@@ -37,3 +34,72 @@ articles( id, creation, modification, title, layout, src )
37
34
  b. organize by latest at the top
38
35
  4. create individual pages
39
36
 
37
+ in the initial version, layout.haml, navbar.haml were fixed templates. this
38
+ assumes that each site will have these files. there can actually be multiple
39
+ layouts for a site so there needs to be a mapping of layouts to content (md
40
+ files). also there should be enough flexibility to not have navbars, or
41
+ multiple navbars, etc.
42
+
43
+ there will be 4 main types of haml templates: page layouts, navbars, footers,
44
+ and contents.
45
+
46
+ layout files are the main templates that house the structure of the site,
47
+ from enclosing html tags to the head which includes all of the stylesheets
48
+ and javascript assets. in order to identify layout files, the filename will
49
+ be searched for the substring "layout.haml".
50
+
51
+ e.g.
52
+
53
+ layout.haml
54
+ main.layout.haml
55
+ sub-layout.haml
56
+ layout-sub.haml (not valid)
57
+
58
+ each of these will be listed in the layouts table
59
+
60
+ navbars are embedded in layout templates and need to have the "navbar.haml"
61
+ identifier in the filename.
62
+
63
+ footers are also embedded in layout templates and need to have the
64
+ "footer.haml" identifier in the filename.
65
+
66
+ content templates are also embedded in layout templates and need to have the
67
+ "content.haml" identifier in the filename.
68
+
69
+ if there's only one set of navbars, footer, and layout, then the user
70
+ won't be prompted.
71
+
72
+ the above is for a more advanced version, let's keep things simple, you
73
+ must have layout.haml, index.haml, and page.haml.
74
+
75
+ 1. layout.haml defines the overall site from html tags to body and head.
76
+ meta requires this file be present in order to compile.
77
+
78
+ 2. index.haml includes the content for the main page of a site, typically
79
+ it's a summary of all posts.
80
+
81
+ 3. page.haml includes the content for a single post.
82
+
83
+ let's initially support the case where layout.haml, index.haml, and page.haml
84
+ are required.
85
+
86
+ custom templates:
87
+
88
+ assume a site has pages for about, projects, etc. there should be a generic
89
+ way to associate a layout and content layer, and the process should be very
90
+ simple.
91
+
92
+ assume there are these types of posts:
93
+
94
+ 1. blog: mostly original text from an author, can contain pictures, tables,
95
+ etc.
96
+ 2. picture: picture only post, no text. will include pictures from other
97
+ sources only, will not store many pictures on my site.
98
+ 3. recommended link: user submit's url, title, summary, maybe a picture
99
+ included.
100
+
101
+
102
+ markdown compendium:
103
+
104
+ [![alt text](image link)](web link)
105
+
data/lib/meta.rb CHANGED
@@ -4,11 +4,13 @@ require "colorize"
4
4
  require "digest/md5"
5
5
  require "haml"
6
6
  require "highline/import"
7
+ require "open3"
7
8
  require "redcarpet"
8
9
  require "sequel"
9
10
  require "sqlite3"
10
11
  require "thor"
11
12
  require "tilt"
13
+ require "yaml"
12
14
 
13
15
  require File.join( File.dirname(__FILE__), "meta", "catalog" )
14
16
  require File.join( File.dirname(__FILE__), "meta", "cli" )
@@ -24,17 +26,21 @@ end
24
26
  module Meta
25
27
 
26
28
  BASEDIR = ".".freeze
29
+ CONFIGFILE = "~/.meta".freeze
27
30
  DATASTORE = File.join( Dir.pwd, "site.sqlite3" )
28
31
  EXCLUDES = [ "layout.haml", "navbar.haml", "footer.haml" ]
32
+ FEXISTS = "File already exists".freeze
29
33
  HAML = ["*.haml"]
30
34
  HAMLEXT = ".haml".freeze
31
35
  HTML = ["*.html"]
32
36
  HTMLEXT = ".html".freeze
33
37
  INDEX = "index.html".freeze
34
38
  MARKDOWN = ["*.md", "*.markdown", "*.mkd"]
35
- MARKDOWNEXT = ".md".freeze
39
+ MDEXT = ".md".freeze
40
+ PNGEXT = ".png".freeze
36
41
  SEED = 1234562
37
42
  SLASH = "/".freeze
43
+ SPACE = " ".freeze
38
44
 
39
45
  end
40
46
 
data/lib/meta/catalog.rb CHANGED
@@ -10,6 +10,17 @@ module Meta
10
10
 
11
11
  end
12
12
 
13
+ def get_statistics
14
+
15
+ stats = Hash.new
16
+
17
+ stats[:posts] = self.db[:contents].count
18
+ stats[:pictures] = self.db[:contents].where(:picture => true).count
19
+
20
+ return stats
21
+
22
+ end
23
+
13
24
  def content_exists?(file)
14
25
 
15
26
  rs = self.db[:contents].where(:path => file).all
@@ -75,7 +86,7 @@ module Meta
75
86
  :title => title,
76
87
  :hash => hash,
77
88
  :path => file,
78
- :created_at => File.ctime(file) )
89
+ :created_at => Time.now )
79
90
 
80
91
  end
81
92
 
data/lib/meta/cli.rb CHANGED
@@ -3,6 +3,8 @@ module Meta
3
3
  class CLI < Thor
4
4
  include Thor::Actions
5
5
 
6
+ config = YAML.load_file(CONFIGFILE) if File.exists?(CONFIGFILE)
7
+
6
8
  desc "compile", "compile meta files"
7
9
  method_option :output, :aliases => "-o", :type => :string,
8
10
  :required => false, :desc => "static file output directory"
@@ -21,7 +23,7 @@ module Meta
21
23
  p = Meta::Page.new(dest)
22
24
 
23
25
  p.generate(options[:force])
24
- p.generate_main(options[:force])
26
+ p.generate_index(options[:force])
25
27
 
26
28
  end
27
29
 
@@ -96,11 +98,48 @@ module Meta
96
98
 
97
99
  end
98
100
 
101
+ desc "capture", "capture thumbnail of url"
102
+ method_option :output, :aliases => "-o", :type => :string,
103
+ :required => false, :desc => "output directory"
104
+ def capture(url)
105
+
106
+ if options[:output].nil?
107
+ dest = BASEDIR
108
+ else
109
+ dest = options[:output]
110
+ end
111
+
112
+ images = dest + SLASH + "images"
113
+
114
+ images = dest unless Dir.exists?(images)
115
+
116
+ cmd = "xvfb-run url2thumb capture #{url} -o #{images}"
117
+
118
+ stdin, stdout, stderr = Open3.popen3(cmd)
119
+
120
+ abort( stderr.read.chomp.red ) if stdout.nil?
121
+
122
+ out = stdout.read.chomp
123
+
124
+ unless out.include?(FEXISTS)
125
+
126
+ created = out.split(SPACE).first
127
+
128
+ link = "[![referral](images/#{File.basename(created)})](#{url})"
129
+
130
+ Meta::Filelib.create_file( link, created, MDEXT, dest, false )
131
+
132
+ end
133
+
134
+ end
135
+
99
136
  desc "test", "testing"
100
137
  def test
101
138
 
102
- p = Meta::Page.new
103
- p.generate_main
139
+ c = Meta::Catalog.new
140
+ stats = c.get_statistics
141
+ puts stats[:posts]
142
+ puts stats[:pictures]
104
143
 
105
144
  end
106
145
 
data/lib/meta/filelib.rb CHANGED
@@ -17,9 +17,9 @@ module Meta
17
17
 
18
18
  end
19
19
 
20
- def self.create_file( text, filename, dest, overwrite=false )
20
+ def self.create_file( text, filename, ext, dest, overwrite=false )
21
21
 
22
- filename = File.basename( filename, File.extname(filename) ) + HTMLEXT
22
+ filename = File.basename( filename, File.extname(filename) ) + ext
23
23
  filename = dest + SLASH + filename
24
24
 
25
25
  reply = false
data/lib/meta/page.rb CHANGED
@@ -2,88 +2,39 @@ module Meta
2
2
 
3
3
  class Page
4
4
 
5
- attr_reader :layout, :navbar, :catalog
5
+ attr_reader :catalog
6
6
 
7
7
  def initialize(dest=BASEDIR)
8
8
 
9
- @dest = dest
9
+ @dest = dest
10
10
 
11
- @catalog = Meta::Catalog.new
11
+ @catalog = Meta::Catalog.new
12
12
 
13
- @layout = Tilt.new("layout.haml")
14
- @navbar = Tilt.new("navbar.haml")
15
- @col = Tilt.new("col.haml")
13
+ @templates = Meta::Filelib.get_templates
16
14
 
17
- end
18
-
19
- def generate_row(contents)
20
-
21
- length = contents.length
22
-
23
- if length == 1
24
- contents[0][:col_classes] = "col-lg-12 box"
25
- elsif length == 2
26
-
27
- rng = Random.new(SEED)
28
-
29
- r = rng.rand(1..3)
15
+ @layout = Tilt.new("layout.haml") if @templates.include?("layout.haml")
16
+ @navbar = Tilt.new("navbar.haml") if @templates.include?("navbar.haml")
17
+ @index = Tilt.new("index.haml") if @templates.include?("index.haml")
18
+ @page = Tilt.new("page.haml") if @templates.include?("page.haml")
30
19
 
31
- if r == 3
32
- contents[0][:col_classes] = "col-lg-6 box"
33
- contents[1][:col_classes] = "col-lg-6 box"
34
- elsif r == 2
35
- contents[0][:col_classes] = "col-lg-8 box"
36
- contents[1][:col_classes] = "col-lg-4 box"
37
- else
38
- contents[0][:col_classes] = "col-lg-4 box"
39
- contents[1][:col_classes] = "col-lg-8 box"
40
- end
41
-
42
- elsif length == 3
43
- contents[0][:col_classes] = "col-lg-4 box"
44
- contents[1][:col_classes] = "col-lg-4 box"
45
- contents[2][:col_classes] = "col-lg-4 box"
46
- else
47
- contents[0][:col_classes] = "col-lg-3 box"
48
- contents[1][:col_classes] = "col-lg-3 box"
49
- contents[2][:col_classes] = "col-lg-3 box"
50
- contents[3][:col_classes] = "col-lg-3 box"
20
+ if @layout.nil?
21
+ abort("layout.haml template missing, this file must be included".red)
51
22
  end
52
-
53
- return contents
23
+ #TODO: must include index and page as well
54
24
 
55
25
  end
56
26
 
57
- def generate_main(overwrite=false)
58
-
59
- c = @catalog.get_recent(-1)
60
-
61
- length = c.length
62
- remain = length
63
- index = 0
27
+ def generate_index(overwrite=false)
64
28
 
65
- rows = []
29
+ contents = @catalog.get_recent(-1)
66
30
 
67
- rng = Random.new(SEED)
31
+ stats = @catalog.get_statistics
68
32
 
69
- while remain != 0 do
33
+ doc = @index.render( self, :contents => contents )
70
34
 
71
- n = rng.rand(1..remain)
35
+ html = @layout.render( self, :stats => stats ) { doc }
72
36
 
73
- r = generate_row(c[index..index+n-1])
74
-
75
- remain = remain - n
76
- index = index + n
77
-
78
- rows << r
79
-
80
- end
81
-
82
- doc = @col.render( self, :rows => rows )
83
-
84
- html = @layout.render { doc }
85
-
86
- Meta::Filelib.create_file( html, INDEX, @dest, overwrite )
37
+ Meta::Filelib.create_file( html, INDEX, HTMLEXT, @dest, overwrite )
87
38
 
88
39
  end
89
40
 
@@ -91,6 +42,8 @@ module Meta
91
42
 
92
43
  all = Meta::Filelib.get_contents
93
44
 
45
+ stats = @catalog.get_statistics
46
+
94
47
  all.each do |c|
95
48
 
96
49
  if File.zero?(c)
@@ -102,22 +55,15 @@ module Meta
102
55
 
103
56
  content = @catalog.check_content(c)
104
57
 
105
- content[:col_classes] = "col-lg-12 box"
106
58
  content[:summary] = Tilt.new(c).render
107
59
  content[:link] = File.basename( content[:path],
108
60
  File.extname(content[:path]) ) + HTMLEXT
109
61
 
110
- contents = []
111
- contents << content
112
-
113
- rows = []
114
- rows << contents
115
-
116
- r = @col.render( self, :rows => rows )
62
+ p = @page.render( self, :content => content )
117
63
 
118
- html = @layout.render { r }
64
+ html = @layout.render( self, :stats => stats ) { p }
119
65
 
120
- Meta::Filelib.create_file( html, c, @dest, overwrite )
66
+ Meta::Filelib.create_file( html, c, HTMLEXT, @dest, overwrite )
121
67
 
122
68
  end
123
69
 
data/lib/meta/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Meta
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.3"
3
3
  end
4
4
 
data/meta.gemspec CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Meta::VERSION
9
9
  spec.authors = ["stephenhu"]
10
10
  spec.email = ["epynonymous@outlook.com"]
11
- spec.description = %q{meta language compiler for static web pages }
12
- spec.summary = %q{meta compiler (meta)}
11
+ spec.description = %q{opinionated static web page generator}
12
+ spec.summary = %q{opinionated static web page generator}
13
13
  spec.homepage = "http://github.io/stephenhu/meta"
14
14
  spec.license = "MIT"
15
15
 
@@ -19,7 +19,20 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
  spec.bindir = "bin"
21
21
 
22
+ spec.add_dependency "colorize", "~>0.6.0"
23
+ spec.add_dependency "haml", "~>4.0.4"
24
+ spec.add_dependency "highline", "~>1.6.20"
25
+ spec.add_dependency "rack", "~>1.5.2"
26
+ spec.add_dependency "redcarpet", "~>3.0.0"
27
+ spec.add_dependency "sequel", "~>4.5.0"
28
+ spec.add_dependency "sqlite3", "~>1.3.8"
29
+ spec.add_dependency "thin", "~>1.6.1"
30
+ spec.add_dependency "thor", "~>0.18.1"
31
+ spec.add_dependency "tilt", "~>2.0.0"
32
+
22
33
  spec.add_development_dependency "bundler", "~> 1.3"
23
34
  spec.add_development_dependency "rake"
35
+
36
+ spec.add_runtime_dependency "url2thumb"
24
37
  end
25
38
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: meta
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,168 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-12-30 00:00:00.000000000 Z
12
+ date: 2014-01-11 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: colorize
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.6.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 0.6.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: haml
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 4.0.4
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 4.0.4
46
+ - !ruby/object:Gem::Dependency
47
+ name: highline
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 1.6.20
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 1.6.20
62
+ - !ruby/object:Gem::Dependency
63
+ name: rack
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 1.5.2
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 1.5.2
78
+ - !ruby/object:Gem::Dependency
79
+ name: redcarpet
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 3.0.0
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 3.0.0
94
+ - !ruby/object:Gem::Dependency
95
+ name: sequel
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: 4.5.0
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 4.5.0
110
+ - !ruby/object:Gem::Dependency
111
+ name: sqlite3
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 1.3.8
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 1.3.8
126
+ - !ruby/object:Gem::Dependency
127
+ name: thin
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ~>
132
+ - !ruby/object:Gem::Version
133
+ version: 1.6.1
134
+ type: :runtime
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ version: 1.6.1
142
+ - !ruby/object:Gem::Dependency
143
+ name: thor
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ~>
148
+ - !ruby/object:Gem::Version
149
+ version: 0.18.1
150
+ type: :runtime
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ~>
156
+ - !ruby/object:Gem::Version
157
+ version: 0.18.1
158
+ - !ruby/object:Gem::Dependency
159
+ name: tilt
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ~>
164
+ - !ruby/object:Gem::Version
165
+ version: 2.0.0
166
+ type: :runtime
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ~>
172
+ - !ruby/object:Gem::Version
173
+ version: 2.0.0
14
174
  - !ruby/object:Gem::Dependency
15
175
  name: bundler
16
176
  requirement: !ruby/object:Gem::Requirement
@@ -43,7 +203,23 @@ dependencies:
43
203
  - - ! '>='
44
204
  - !ruby/object:Gem::Version
45
205
  version: '0'
46
- description: ! 'meta language compiler for static web pages '
206
+ - !ruby/object:Gem::Dependency
207
+ name: url2thumb
208
+ requirement: !ruby/object:Gem::Requirement
209
+ none: false
210
+ requirements:
211
+ - - ! '>='
212
+ - !ruby/object:Gem::Version
213
+ version: '0'
214
+ type: :runtime
215
+ prerelease: false
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ none: false
218
+ requirements:
219
+ - - ! '>='
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
222
+ description: opinionated static web page generator
47
223
  email:
48
224
  - epynonymous@outlook.com
49
225
  executables:
@@ -97,5 +273,5 @@ rubyforge_project:
97
273
  rubygems_version: 1.8.23
98
274
  signing_key:
99
275
  specification_version: 3
100
- summary: meta compiler (meta)
276
+ summary: opinionated static web page generator
101
277
  test_files: []