polites 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 +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
|