tufte 1.0.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 +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.ruby-version +1 -0
- data/.travis.yml +1 -0
- data/Gemfile +3 -0
- data/LICENSE +67 -0
- data/README.md +50 -0
- data/Rakefile +9 -0
- data/TODO +2 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/exe/tufte +4 -0
- data/lib/tufte/binding.rb +25 -0
- data/lib/tufte/cli.rb +29 -0
- data/lib/tufte/helpers.rb +23 -0
- data/lib/tufte/markdown.rb +24 -0
- data/lib/tufte/post.rb +42 -0
- data/lib/tufte/version.rb +3 -0
- data/lib/tufte.rb +45 -0
- data/scaffold/config.ru +23 -0
- data/scaffold/css/et-book/et-book-bold-line-figures/et-book-bold-line-figures.eot +0 -0
- data/scaffold/css/et-book/et-book-bold-line-figures/et-book-bold-line-figures.svg +243 -0
- data/scaffold/css/et-book/et-book-bold-line-figures/et-book-bold-line-figures.ttf +0 -0
- data/scaffold/css/et-book/et-book-bold-line-figures/et-book-bold-line-figures.woff +0 -0
- data/scaffold/css/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.eot +0 -0
- data/scaffold/css/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.svg +244 -0
- data/scaffold/css/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.ttf +0 -0
- data/scaffold/css/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.woff +0 -0
- data/scaffold/css/et-book/et-book-roman-line-figures/et-book-roman-line-figures.eot +0 -0
- data/scaffold/css/et-book/et-book-roman-line-figures/et-book-roman-line-figures.svg +244 -0
- data/scaffold/css/et-book/et-book-roman-line-figures/et-book-roman-line-figures.ttf +0 -0
- data/scaffold/css/et-book/et-book-roman-line-figures/et-book-roman-line-figures.woff +0 -0
- data/scaffold/css/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.eot +0 -0
- data/scaffold/css/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.svg +244 -0
- data/scaffold/css/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.ttf +0 -0
- data/scaffold/css/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.woff +0 -0
- data/scaffold/css/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.eot +0 -0
- data/scaffold/css/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.svg +243 -0
- data/scaffold/css/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.ttf +0 -0
- data/scaffold/css/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.woff +0 -0
- data/scaffold/css/style.css +91 -0
- data/scaffold/css/tufte.css +274 -0
- data/scaffold/posts/syntax-highlight-test.yml +35 -0
- data/scaffold/templates/index.html.erb +31 -0
- data/scaffold/templates/layout.html.erb +21 -0
- data/scaffold/templates/post.html.erb +12 -0
- data/tufte.gemspec +31 -0
- metadata +176 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 68122151e2336b4c014579ccf9ab2173b64b2645
|
|
4
|
+
data.tar.gz: 95981d41c07070572fb2d210f4d73ce7c7418277
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: db6e50473513677d7ebbbc9903187ac86780812d1857e0180d520b147b9887467e45f1ee72547ea2ec56b53e86723007853e7b795dd88f4fd02915a0bab6c4d9
|
|
7
|
+
data.tar.gz: e02d0c77adc0cbc63a81230f5c39e6c14428b3c5a41d2309097dc5a70d2ff189546dd701bd1c365c560f36011a44da324430dadc81708c9f98343f4301227598
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.ruby-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.3.1
|
data/.travis.yml
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
language: ruby
|
data/Gemfile
ADDED
data/LICENSE
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
Copyright (c) 2016 Maxwell Holder
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
4
|
+
this software and associated documentation files (the "Software"), to deal in
|
|
5
|
+
the Software without restriction, including without limitation the rights to
|
|
6
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
7
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
8
|
+
subject to the following conditions:
|
|
9
|
+
|
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
|
11
|
+
copies or substantial portions of the Software.
|
|
12
|
+
|
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
15
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
16
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
17
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
18
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
This project includes fonts from et-book
|
|
22
|
+
(https://github.com/edwardtufte/et-book) which is distributed with the following
|
|
23
|
+
license:
|
|
24
|
+
|
|
25
|
+
Copyright (c) 2015 Dmitry Krasny, Bonnie Scranton, Edward Tufte.
|
|
26
|
+
|
|
27
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
28
|
+
this software and associated documentation files (the "Software"), to deal in
|
|
29
|
+
the Software without restriction, including without limitation the rights to
|
|
30
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
31
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
32
|
+
subject to the following conditions:
|
|
33
|
+
|
|
34
|
+
The above copyright notice and this permission notice shall be included in all
|
|
35
|
+
copies or substantial portions of the Software.
|
|
36
|
+
|
|
37
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
38
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
39
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
40
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
41
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
42
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
This project includes CSS from tufte-css
|
|
46
|
+
(https://github.com/edwardtufte/tufte-css) which is distributed with the
|
|
47
|
+
following license:
|
|
48
|
+
|
|
49
|
+
Copyright (c) 2014 Dave Liepmann
|
|
50
|
+
|
|
51
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
52
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
53
|
+
in the Software without restriction, including without limitation the rights
|
|
54
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
55
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
56
|
+
furnished to do so, subject to the following conditions:
|
|
57
|
+
|
|
58
|
+
The above copyright notice and this permission notice shall be included in all
|
|
59
|
+
copies or substantial portions of the Software.
|
|
60
|
+
|
|
61
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
62
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
63
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
64
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
65
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
66
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
67
|
+
SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# tufte
|
|
2
|
+
|
|
3
|
+
[](https://travis-ci.org/mxhold/tufte)
|
|
4
|
+
|
|
5
|
+
tufte is a minimal static site generator ideal for getting a blog running
|
|
6
|
+
quickly with:
|
|
7
|
+
|
|
8
|
+
- [tufte-css](https://github.com/edwardtufte/tufte-css) for style
|
|
9
|
+
- [redcarpet](https://github.com/vmg/redcarpet) for Markdown rendering
|
|
10
|
+
- [rouge](https://github.com/jneen/rouge) for syntax highlighting
|
|
11
|
+
|
|
12
|
+
See it in action at <https://maxwellholder.com>.
|
|
13
|
+
|
|
14
|
+
## Getting started
|
|
15
|
+
|
|
16
|
+
You'll need [Ruby](https://www.ruby-lang.org) and [Bundler](http://bundler.io/)
|
|
17
|
+
installed first.
|
|
18
|
+
|
|
19
|
+
Make a new directory for your blog and `cd` to it:
|
|
20
|
+
|
|
21
|
+
mkdir blog/
|
|
22
|
+
cd blog/
|
|
23
|
+
|
|
24
|
+
Add a `Gemfile` for the current version of tufte (make sure to commit this along
|
|
25
|
+
with your `Gemfile.lock` for reproducable builds).
|
|
26
|
+
|
|
27
|
+
echo 'source "https://rubygems.org"\n\ngem "tufte", "~> 1.0"' > Gemfile
|
|
28
|
+
bundle install
|
|
29
|
+
|
|
30
|
+
Add binstubs so you don't have to prefix commands with `bundle exec`:
|
|
31
|
+
|
|
32
|
+
bundle binstubs tufte
|
|
33
|
+
|
|
34
|
+
Initialize a new blog and create scaffold files in the current directory:
|
|
35
|
+
|
|
36
|
+
bin/tufte init
|
|
37
|
+
|
|
38
|
+
Generate HTML pages from the templates:
|
|
39
|
+
|
|
40
|
+
bin/tufte build
|
|
41
|
+
|
|
42
|
+
Run a local server to view your blog at <http://localhost:9292> (this is a
|
|
43
|
+
simple wrapper around `rackup` so you can pass any options you normally use for
|
|
44
|
+
[Rack](https://github.com/rack/rack) such as `-p 4000` to run on port 4000):
|
|
45
|
+
|
|
46
|
+
bin/tufte serve
|
|
47
|
+
|
|
48
|
+
At this point you can edit the files in `templates/` and `posts/` to your
|
|
49
|
+
liking, running `bin/tufte build` after each change until you are satisfied with
|
|
50
|
+
your new blog.
|
data/Rakefile
ADDED
data/TODO
ADDED
data/bin/console
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "tufte"
|
|
5
|
+
|
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
|
8
|
+
|
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
|
10
|
+
# require "pry"
|
|
11
|
+
# Pry.start
|
|
12
|
+
|
|
13
|
+
require "irb"
|
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
data/exe/tufte
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Tufte
|
|
2
|
+
module Binding
|
|
3
|
+
def self.new(instance_variables:, mod:)
|
|
4
|
+
BindingFactory.new(
|
|
5
|
+
instance_variables: instance_variables,
|
|
6
|
+
mod: mod,
|
|
7
|
+
).get_binding
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class BindingFactory
|
|
11
|
+
def initialize(instance_variables:, mod:)
|
|
12
|
+
instance_variables.each do |name, value|
|
|
13
|
+
instance_variable_set(name, value)
|
|
14
|
+
end
|
|
15
|
+
mod.singleton_methods.each do |name|
|
|
16
|
+
define_singleton_method(name, &mod.singleton_method(name))
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def get_binding
|
|
21
|
+
binding
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
data/lib/tufte/cli.rb
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require "optparse"
|
|
2
|
+
|
|
3
|
+
module Tufte
|
|
4
|
+
module CLI
|
|
5
|
+
def self.run(command)
|
|
6
|
+
case command
|
|
7
|
+
when "init"
|
|
8
|
+
Tufte.init
|
|
9
|
+
when "build"
|
|
10
|
+
Tufte.build
|
|
11
|
+
when "serve"
|
|
12
|
+
require "rack"
|
|
13
|
+
Rack::Server.start
|
|
14
|
+
when "version", "-v", "--version"
|
|
15
|
+
puts Tufte::VERSION
|
|
16
|
+
else
|
|
17
|
+
puts <<-USAGE
|
|
18
|
+
Usage: tufte [command]
|
|
19
|
+
Commands:
|
|
20
|
+
init Scaffold a new blog in the current directory
|
|
21
|
+
build Generate HTML pages based on the templates
|
|
22
|
+
serve Start a development server to host your files locally
|
|
23
|
+
version Print the current version
|
|
24
|
+
help Print this message
|
|
25
|
+
USAGE
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Tufte
|
|
2
|
+
module Helpers
|
|
3
|
+
def self.sidenote(id, note)
|
|
4
|
+
<<-HTML.chomp
|
|
5
|
+
<label for="#{id}" class="margin-toggle sidenote-number"></label>
|
|
6
|
+
<input type="checkbox" id="#{id}" class="margin-toggle"/>
|
|
7
|
+
<span class="sidenote">
|
|
8
|
+
#{note}
|
|
9
|
+
</span>
|
|
10
|
+
HTML
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.marginnote(id, note)
|
|
14
|
+
<<-HTML.chomp
|
|
15
|
+
<label for="#{id}" class="margin-toggle">⊕</label>
|
|
16
|
+
<input type="checkbox" id="#{id}" class="margin-toggle"/>
|
|
17
|
+
<span class="marginnote">
|
|
18
|
+
#{note}
|
|
19
|
+
</span>
|
|
20
|
+
HTML
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require "redcarpet"
|
|
2
|
+
require "rouge"
|
|
3
|
+
require "rouge/plugins/redcarpet"
|
|
4
|
+
|
|
5
|
+
module Tufte
|
|
6
|
+
class HTML < Redcarpet::Render::HTML
|
|
7
|
+
include Rouge::Plugins::Redcarpet
|
|
8
|
+
|
|
9
|
+
def self.renderer
|
|
10
|
+
@renderer ||= Redcarpet::Markdown.new(self, fenced_code_blocks: true)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class Markdown
|
|
15
|
+
def initialize(markdown, renderer: HTML.renderer)
|
|
16
|
+
@markdown = markdown
|
|
17
|
+
@renderer = renderer
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def to_html
|
|
21
|
+
@renderer.render(@markdown)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
data/lib/tufte/post.rb
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require "yaml"
|
|
2
|
+
|
|
3
|
+
module Tufte
|
|
4
|
+
class Post
|
|
5
|
+
attr_reader :title, :slug
|
|
6
|
+
|
|
7
|
+
def initialize(date:, title:, slug:, raw_body:)
|
|
8
|
+
@date = date
|
|
9
|
+
@slug = slug
|
|
10
|
+
@title = title
|
|
11
|
+
@raw_body = raw_body
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def body
|
|
15
|
+
Markdown.new(@raw_body).to_html
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def date
|
|
19
|
+
@date.strftime("%Y %b %-d")
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def output_directory
|
|
23
|
+
File.join(@date.year.to_s, @date.month.to_s, @date.day.to_s, slug)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def output_filename
|
|
27
|
+
File.join(output_directory, "index.html")
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def self.load(filename)
|
|
31
|
+
file_contents = File.read(filename)
|
|
32
|
+
metadata = YAML.load(file_contents)
|
|
33
|
+
|
|
34
|
+
new(
|
|
35
|
+
date: metadata.fetch("date"),
|
|
36
|
+
title: metadata.fetch("title"),
|
|
37
|
+
slug: File.basename(filename, ".yml"),
|
|
38
|
+
raw_body: file_contents.split("---\n", 3).last,
|
|
39
|
+
)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
data/lib/tufte.rb
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
require "tufte/version"
|
|
2
|
+
require "tufte/binding"
|
|
3
|
+
require "tufte/post"
|
|
4
|
+
require "tufte/markdown"
|
|
5
|
+
require "tufte/cli"
|
|
6
|
+
require "tufte/helpers"
|
|
7
|
+
require "fileutils"
|
|
8
|
+
require "erb"
|
|
9
|
+
|
|
10
|
+
module Tufte
|
|
11
|
+
def self.render(erb, instance_variables, helpers = Helpers)
|
|
12
|
+
binding = Binding.new(instance_variables: instance_variables, mod: helpers)
|
|
13
|
+
ERB.new(erb).result(binding)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.init
|
|
17
|
+
scaffold_path = File.expand_path(File.join("..", "scaffold"), __dir__)
|
|
18
|
+
FileUtils.cp_r(File.join(scaffold_path, "."), ".")
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def self.build
|
|
22
|
+
layout_template = File.read("templates/layout.html.erb")
|
|
23
|
+
post_template = File.read("templates/post.html.erb")
|
|
24
|
+
index_template = File.read("templates/index.html.erb")
|
|
25
|
+
|
|
26
|
+
posts = Dir.glob("posts/*").map do |filename|
|
|
27
|
+
Post.load(filename)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
posts.each do |post|
|
|
31
|
+
FileUtils.mkdir_p(post.output_directory)
|
|
32
|
+
File.open(post.output_filename, "w") do |file|
|
|
33
|
+
rendered_post = render(post_template, :@post => post)
|
|
34
|
+
file.write(render(layout_template, :@content => rendered_post))
|
|
35
|
+
end
|
|
36
|
+
puts "Generated #{post.output_filename}"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
File.open("index.html", "w") do |file|
|
|
40
|
+
rendered_index = render(index_template, :@posts => posts)
|
|
41
|
+
file.write(render(layout_template, :@content => rendered_index))
|
|
42
|
+
end
|
|
43
|
+
puts "Generated index.html"
|
|
44
|
+
end
|
|
45
|
+
end
|
data/scaffold/config.ru
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
class DirectoryIndex
|
|
2
|
+
def initialize(app)
|
|
3
|
+
@app = app
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def call(env)
|
|
7
|
+
index_path = File.join(
|
|
8
|
+
".",
|
|
9
|
+
Rack::Request.new(env).path.split('/'),
|
|
10
|
+
"index.html"
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
if File.exists?(index_path)
|
|
14
|
+
[200, {"Content-Type" => "text/html"}, [File.read(index_path)]]
|
|
15
|
+
else
|
|
16
|
+
@app.call(env)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
use DirectoryIndex
|
|
22
|
+
|
|
23
|
+
run Rack::Directory.new(".")
|