polites 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/.rubocop.yml +18 -0
- data/.tool-versions +1 -0
- data/.travis.yml +6 -0
- data/.yardopts +1 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +15 -0
- data/Gemfile.lock +128 -0
- data/LICENSE.txt +21 -0
- data/README.md +70 -0
- data/Rakefile +9 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/exe/polites +8 -0
- data/lib/polites.rb +33 -0
- data/lib/polites/block.rb +65 -0
- data/lib/polites/block/blockquote.rb +8 -0
- data/lib/polites/block/code_block.rb +18 -0
- data/lib/polites/block/divider.rb +8 -0
- data/lib/polites/block/heading.rb +8 -0
- data/lib/polites/block/heading1.rb +8 -0
- data/lib/polites/block/heading2.rb +8 -0
- data/lib/polites/block/heading3.rb +8 -0
- data/lib/polites/block/heading4.rb +8 -0
- data/lib/polites/block/heading5.rb +8 -0
- data/lib/polites/block/heading6.rb +8 -0
- data/lib/polites/block/list.rb +14 -0
- data/lib/polites/block/ordered_list.rb +8 -0
- data/lib/polites/block/paragraph.rb +8 -0
- data/lib/polites/block/unordered_list.rb +8 -0
- data/lib/polites/cli.rb +52 -0
- data/lib/polites/convert.rb +29 -0
- data/lib/polites/doc/_index.html +85 -0
- data/lib/polites/doc/class_list.html +51 -0
- data/lib/polites/doc/css/common.css +1 -0
- data/lib/polites/doc/css/full_list.css +58 -0
- data/lib/polites/doc/css/style.css +496 -0
- data/lib/polites/doc/file_list.html +51 -0
- data/lib/polites/doc/frames.html +17 -0
- data/lib/polites/doc/index.html +85 -0
- data/lib/polites/doc/js/app.js +314 -0
- data/lib/polites/doc/js/full_list.js +216 -0
- data/lib/polites/doc/js/jquery.js +4 -0
- data/lib/polites/doc/method_list.html +51 -0
- data/lib/polites/doc/top-level-namespace.html +100 -0
- data/lib/polites/file.rb +67 -0
- data/lib/polites/html_formatter.rb +119 -0
- data/lib/polites/list_indenter.rb +34 -0
- data/lib/polites/markup.rb +31 -0
- data/lib/polites/nanoc.rb +46 -0
- data/lib/polites/nanoc/data_source.rb +93 -0
- data/lib/polites/nanoc/embedded_images_filter.rb +22 -0
- data/lib/polites/nanoc/extract_file_filter.rb +21 -0
- data/lib/polites/node.rb +28 -0
- data/lib/polites/parser.rb +174 -0
- data/lib/polites/plist.rb +28 -0
- data/lib/polites/range_tag.rb +29 -0
- data/lib/polites/settings.rb +35 -0
- data/lib/polites/sheet.rb +63 -0
- data/lib/polites/simple_tag.rb +22 -0
- data/lib/polites/span.rb +60 -0
- data/lib/polites/span/annotation.rb +18 -0
- data/lib/polites/span/code.rb +8 -0
- data/lib/polites/span/delete.rb +8 -0
- data/lib/polites/span/emph.rb +8 -0
- data/lib/polites/span/footnote.rb +18 -0
- data/lib/polites/span/image.rb +29 -0
- data/lib/polites/span/link.rb +21 -0
- data/lib/polites/span/mark.rb +8 -0
- data/lib/polites/span/strong.rb +8 -0
- data/lib/polites/tag.rb +20 -0
- data/lib/polites/text.rb +20 -0
- data/lib/polites/version.rb +5 -0
- data/polites-nanoc.gemspec +31 -0
- data/polites.gemspec +33 -0
- metadata +153 -0
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'open3'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
module Polites
|
7
|
+
# Read macos binary .plist files into a Hash by converting them to JSON format
|
8
|
+
# using the macos native `plutil` program. This only works on macos.
|
9
|
+
class Plist
|
10
|
+
# @param [#to_s] path
|
11
|
+
def initialize(path)
|
12
|
+
@path = path
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [Hash]
|
16
|
+
def to_h
|
17
|
+
@content ||= read_plist
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def read_plist
|
23
|
+
"plutil -convert json -o - #{@path}"
|
24
|
+
.then { |s| Open3.capture2(s) }
|
25
|
+
.then { |(json, _)| JSON.parse(json) }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative './tag'
|
4
|
+
|
5
|
+
module Polites
|
6
|
+
# A range tag is a {Tag} defined by a start and an end pattern, such as used
|
7
|
+
# by defining bold formatting.
|
8
|
+
class RangeTag < Tag
|
9
|
+
# @return [String]
|
10
|
+
attr_reader :start_pattern
|
11
|
+
# @return [String]
|
12
|
+
attr_reader :end_pattern
|
13
|
+
|
14
|
+
# @param [String] name
|
15
|
+
# @param [String] start_pattern
|
16
|
+
# @param [String] end_pattern
|
17
|
+
def initialize(name, start_pattern, end_pattern)
|
18
|
+
super(name)
|
19
|
+
@start_pattern = start_pattern
|
20
|
+
@end_pattern = end_pattern
|
21
|
+
end
|
22
|
+
|
23
|
+
def eql?(other)
|
24
|
+
super &&
|
25
|
+
start_pattern == other.start_pattern &&
|
26
|
+
end_pattern == other.end_pattern
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative './plist'
|
4
|
+
|
5
|
+
module Polites
|
6
|
+
# Settings is a wrapped around the combined configurations Polites writes to
|
7
|
+
# various Plist files in external directory.
|
8
|
+
class Settings
|
9
|
+
# Read all combined .plist files in a directory into a single data
|
10
|
+
# structure.
|
11
|
+
#
|
12
|
+
# @param [#to_s, #to_path] path root directory to look up .plist files in.
|
13
|
+
# @return [Polites::Settings]
|
14
|
+
def self.from_directory(path)
|
15
|
+
Pathname(path)
|
16
|
+
.glob('.*.plist')
|
17
|
+
.inject({}) { |s, f| s.merge Plist.new(f).to_h }
|
18
|
+
.then { |s| new(s) }
|
19
|
+
end
|
20
|
+
|
21
|
+
# @param [Hash] settings
|
22
|
+
def initialize(settings = {})
|
23
|
+
@settings = settings.to_h
|
24
|
+
freeze
|
25
|
+
end
|
26
|
+
|
27
|
+
# Look up a setting by key.
|
28
|
+
#
|
29
|
+
# @param [String] key
|
30
|
+
# @return [Object]
|
31
|
+
def [](key)
|
32
|
+
@settings[key]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Polites
|
4
|
+
# A sheet is represents a single "document" in Polites. It composes the main
|
5
|
+
# content in {Sheet#content}, its markup definition in {Sheet#markup}, any
|
6
|
+
# attaches files in {Sheet#files} and some metadata.
|
7
|
+
class Sheet
|
8
|
+
# @return [String]
|
9
|
+
attr_reader :version
|
10
|
+
|
11
|
+
# @return [String]
|
12
|
+
attr_reader :app_version
|
13
|
+
|
14
|
+
# @return [Markup]
|
15
|
+
attr_reader :markup
|
16
|
+
|
17
|
+
# @return [Array<Node>]
|
18
|
+
attr_reader :content
|
19
|
+
|
20
|
+
# @return [Array<String>]
|
21
|
+
attr_reader :keywords
|
22
|
+
|
23
|
+
# @return [Array<String>]
|
24
|
+
attr_reader :files
|
25
|
+
|
26
|
+
# @return [Array<Array<Node>>]
|
27
|
+
attr_reader :notes
|
28
|
+
|
29
|
+
# @param [String] version
|
30
|
+
# @param [String] app_version
|
31
|
+
# @param [Markup] markup
|
32
|
+
# @param [Array<Node>] content
|
33
|
+
# @param [Array<String>] keywords
|
34
|
+
# @param [Array<String>] files
|
35
|
+
# @param [Array<Array<Node>>] notes
|
36
|
+
def initialize(version:, app_version:, markup:, content:, keywords: [], files: [], notes: [])
|
37
|
+
@version = version
|
38
|
+
@app_version = app_version
|
39
|
+
@markup = markup
|
40
|
+
@content = content
|
41
|
+
@keywords = keywords
|
42
|
+
@files = files
|
43
|
+
@notes = notes
|
44
|
+
end
|
45
|
+
|
46
|
+
# Get all files that were referenced in the content, such as inline images.
|
47
|
+
#
|
48
|
+
# @return [Array<Span::Image>]
|
49
|
+
def inline_files
|
50
|
+
content.flat_map do |node|
|
51
|
+
node.children.grep(Span::Image)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Get all files that were attached to the sheet without explicit mention in
|
56
|
+
# the content.
|
57
|
+
#
|
58
|
+
# @return [Array<String>]
|
59
|
+
def attached_files
|
60
|
+
files - inline_files.map(&:image)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative './tag'
|
4
|
+
|
5
|
+
module Polites
|
6
|
+
# A simple tag is a {Tag} defined by a single pattern, such as for headings.
|
7
|
+
class SimpleTag < Tag
|
8
|
+
# @return [String]
|
9
|
+
attr_reader :pattern
|
10
|
+
|
11
|
+
# @param [String] name
|
12
|
+
# @param [String] pattern
|
13
|
+
def initialize(name, pattern)
|
14
|
+
super(name)
|
15
|
+
@pattern = pattern
|
16
|
+
end
|
17
|
+
|
18
|
+
def eql?(other)
|
19
|
+
super && pattern == other.pattern
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/polites/span.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../polites'
|
4
|
+
require_relative './node'
|
5
|
+
|
6
|
+
module Polites
|
7
|
+
# A span is an element mapping to inline formatting, such as text formatting
|
8
|
+
# and images. Spans only exist within blocks and cannot themselves contain
|
9
|
+
# {Block} nodes.
|
10
|
+
class Span < Node
|
11
|
+
# Build the proper kind of span from the given arguments.
|
12
|
+
#
|
13
|
+
# @param [Array<Node>] children
|
14
|
+
# @param [String] kind the type Polites has given to this node.
|
15
|
+
# @param [String, nil] url the URL attribute for links.
|
16
|
+
# @param [String, nil] image the image fingerprint referring to a sheet file.
|
17
|
+
# @param [String, nil] filename the explicit filename to use for images.
|
18
|
+
# @param [String, nil] title the title attribute for links, images.
|
19
|
+
# @param [String, nil] description the description attribute used by images.
|
20
|
+
# @param [String, nil] width the explicitly configured image width
|
21
|
+
# @param [String, nil] height the explicitly configured image height
|
22
|
+
# @param [Array<Node>] text the contents of footnoes and annotation.
|
23
|
+
# @raise [ParseError] when encountering unexpected `kind`
|
24
|
+
# @return [Span]
|
25
|
+
def self.build(children = [], kind: nil, url: nil, image: nil, filename: nil, title: nil, description: nil, width: nil, height: nil, text: nil)
|
26
|
+
case kind
|
27
|
+
when 'link'
|
28
|
+
Span::Link.new(children, url: url, title: title)
|
29
|
+
when 'mark'
|
30
|
+
Span::Mark.new(children)
|
31
|
+
when 'emph'
|
32
|
+
Span::Emph.new(children)
|
33
|
+
when 'strong'
|
34
|
+
Span::Strong.new(children)
|
35
|
+
when 'annotation'
|
36
|
+
Span::Annotation.new(children, text)
|
37
|
+
when 'footnote'
|
38
|
+
Span::Footnote.new(children, text)
|
39
|
+
when 'delete'
|
40
|
+
Span::Delete.new(children)
|
41
|
+
when 'code'
|
42
|
+
Span::Code.new(children)
|
43
|
+
when 'image'
|
44
|
+
Span::Image.new(children, image: image, filename: filename, title: title, description: description, width: width, height: height)
|
45
|
+
else
|
46
|
+
raise ParseError, "unexpected kind #{kind.inspect}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
require_relative './span/link'
|
53
|
+
require_relative './span/emph'
|
54
|
+
require_relative './span/annotation'
|
55
|
+
require_relative './span/strong'
|
56
|
+
require_relative './span/footnote'
|
57
|
+
require_relative './span/image'
|
58
|
+
require_relative './span/mark'
|
59
|
+
require_relative './span/delete'
|
60
|
+
require_relative './span/code'
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../span'
|
4
|
+
|
5
|
+
module Polites
|
6
|
+
class Span::Annotation < Span
|
7
|
+
attr_reader :text
|
8
|
+
|
9
|
+
def initialize(children, text)
|
10
|
+
super(children)
|
11
|
+
@text = text
|
12
|
+
end
|
13
|
+
|
14
|
+
def eql?(other)
|
15
|
+
super && text == other.text
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../span'
|
4
|
+
|
5
|
+
module Polites
|
6
|
+
class Span::Footnote < Span
|
7
|
+
attr_reader :text
|
8
|
+
|
9
|
+
def initialize(children, text)
|
10
|
+
super(children)
|
11
|
+
@text = text
|
12
|
+
end
|
13
|
+
|
14
|
+
def eql?(other)
|
15
|
+
super && text == other.text
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../span'
|
4
|
+
|
5
|
+
module Polites
|
6
|
+
class Span::Image < Span
|
7
|
+
attr_reader :children, :image, :filename, :title, :description, :width, :height
|
8
|
+
|
9
|
+
def initialize(children, image:, filename: nil, title: nil, description: nil, width: nil, height: nil)
|
10
|
+
super(children)
|
11
|
+
@image = image
|
12
|
+
@filename = filename
|
13
|
+
@title = title
|
14
|
+
@description = description
|
15
|
+
@width = width
|
16
|
+
@height = height
|
17
|
+
end
|
18
|
+
|
19
|
+
def eql?(other)
|
20
|
+
super &&
|
21
|
+
image == other.image &&
|
22
|
+
filename == other.filename &&
|
23
|
+
title == other.title &&
|
24
|
+
description == other.description &&
|
25
|
+
width == other.width &&
|
26
|
+
height == other.height
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../span'
|
4
|
+
|
5
|
+
module Polites
|
6
|
+
class Span::Link < Span
|
7
|
+
attr_reader :url, :title
|
8
|
+
|
9
|
+
def initialize(children = [], url:, title: nil)
|
10
|
+
super(children)
|
11
|
+
@url = url
|
12
|
+
@title = title
|
13
|
+
end
|
14
|
+
|
15
|
+
def eql?(other)
|
16
|
+
super &&
|
17
|
+
url == other.url &&
|
18
|
+
title == other.title
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/polites/tag.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Polites
|
4
|
+
# A tag is used to define the markup used in Polites documents.
|
5
|
+
class Tag
|
6
|
+
# @return [String]
|
7
|
+
attr_reader :name
|
8
|
+
|
9
|
+
# @param [String] name
|
10
|
+
def initialize(name)
|
11
|
+
@name = name
|
12
|
+
end
|
13
|
+
|
14
|
+
def eql?(other)
|
15
|
+
other.is_a?(self.class) && name == other.name
|
16
|
+
end
|
17
|
+
|
18
|
+
alias == eql?
|
19
|
+
end
|
20
|
+
end
|
data/lib/polites/text.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Polites
|
4
|
+
# A piece of simple text to be output directly. A stand-in for a simple
|
5
|
+
# string.
|
6
|
+
class Text
|
7
|
+
attr_reader :text
|
8
|
+
|
9
|
+
# @param [String] text
|
10
|
+
def initialize(text)
|
11
|
+
@text = text
|
12
|
+
end
|
13
|
+
|
14
|
+
def eql?(other)
|
15
|
+
other.is_a?(self.class) && text == other.text
|
16
|
+
end
|
17
|
+
|
18
|
+
alias == eql?
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'lib/polites/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'polites-nanoc'
|
7
|
+
spec.version = Polites::VERSION
|
8
|
+
spec.authors = ['Arjan van der Gaag']
|
9
|
+
spec.email = ['arjan@arjanvandergaag.nl']
|
10
|
+
|
11
|
+
spec.summary = 'Integrate the Ulysess gem with Nanoc.'
|
12
|
+
spec.description = 'Use Polites\' .ulyz files as a data source in static sites generated with Nanoc.'
|
13
|
+
spec.homepage = 'https://github.com/avdgaag/polites'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
spec.required_ruby_version = Gem::Requirement.new('>= 2.4.0')
|
16
|
+
|
17
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
18
|
+
|
19
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
20
|
+
spec.metadata['source_code_uri'] = 'https://github.com/avdgaag/polites'
|
21
|
+
spec.metadata['changelog_uri'] = 'https://github.com/avdgaag/polites'
|
22
|
+
|
23
|
+
# Specify which files should be added to the gem when it is released.
|
24
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
25
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
26
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }.grep(/nanoc/)
|
27
|
+
end
|
28
|
+
spec.require_paths = ['lib']
|
29
|
+
spec.add_dependency 'nanoc', '~> 4'
|
30
|
+
spec.add_dependency 'polites', "~> #{Polites::VERSION}"
|
31
|
+
end
|