pirka 0.1.0 → 0.1.1
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/README.md +10 -8
- data/app/highlight.rb +14 -13
- data/lib/pirka/highlighter.rb +73 -0
- data/lib/pirka/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 88fcda5b7f58df80108a0eba4386756ccd9ddbaf
|
4
|
+
data.tar.gz: 428c8af5035de8b0da4a0fc63507f3b5f8d2f6fe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 55814a01738772bead120d50677462cc911d72df46621fb43b97747a603d8175d909652cc1e7a00d6b93f4c1398af654017b6b6282b658c17b7975939672515e
|
7
|
+
data.tar.gz: 9037389b5d65fa6867a41901102f5e8b91f5cb270e74c57357276159a3aae17dca21107a17e13a5ff8eaa8d03cc1910479fdec54942227a18536878a8bd9f6f4
|
data/README.md
CHANGED
@@ -28,6 +28,8 @@ It's a short cut to:
|
|
28
28
|
|
29
29
|
$ pirka highlight path/to/book.epub
|
30
30
|
|
31
|
+
To highlight books, run `pirka update`(see below for details) just after installation because `pirka highlight` requires library files.
|
32
|
+
|
31
33
|
### Detecting source code from EPUB books ###
|
32
34
|
|
33
35
|
$ pirka detect path/to/book.epub
|
@@ -71,7 +73,7 @@ You also determine languages interactively. Set `-i`(`--interactive`) option:
|
|
71
73
|
|
72
74
|
$ pirka update
|
73
75
|
|
74
|
-
Pirka provides official library files for some EPUB books as Git repository(
|
76
|
+
Pirka provides official library files for some EPUB books as Git repository([https://gitlab.com/KitaitiMakoto/pirka-library](https://gitlab.com/KitaitiMakoto/pirka-library)). `pirka update` command fethes the files from the repository and you benefit from it.
|
75
77
|
|
76
78
|
Additionally, you can host library files by your own and make Pirka recognizes it by configuration file. See later section for that.
|
77
79
|
|
@@ -92,24 +94,24 @@ Pirka can be configured by environment variables, config file and command-line o
|
|
92
94
|
|
93
95
|
#### Environment variables ####
|
94
96
|
|
95
|
-
XDG_DATA_HOME
|
97
|
+
`XDG_DATA_HOME`
|
96
98
|
: Affects directory to save library files.
|
97
99
|
: Library files are saved to `$XDG_DATA_HOME/pirka/local`
|
98
100
|
: The directory is used to search library, too.
|
99
101
|
: Default: `$HOME/.local/share`
|
100
102
|
|
101
|
-
XDG_DATA_DIRS
|
103
|
+
`XDG_DATA_DIRS`
|
102
104
|
: Affects directory to save library files.
|
103
105
|
: You can specify multiple directory by seperating with a colon like `XDG_DATA_DIRS=/dir1:/dir2`.
|
104
106
|
: `/dir1/pirka/local` and `/dir2/pirka/local` are used to search library, for example.
|
105
107
|
: Default: `/usr/local/share:/usr/share`
|
106
108
|
|
107
|
-
XDG_CONFIG_HOME
|
109
|
+
`XDG_CONFIG_HOME`
|
108
110
|
: Affects directory to search and save config file.
|
109
111
|
: `$XDG_CONFIG_DIRS/pirka.yaml` is recognized as config file.
|
110
112
|
: Default: `$HOME/.config`
|
111
113
|
|
112
|
-
XDG_CONFIG_DIRS
|
114
|
+
`XDG_CONFIG_DIRS`
|
113
115
|
: Affects directory to search config file.
|
114
116
|
: You can specify multiple directory by seperating with a colon like `XDG_CONFIG_DIRS=/dir1:/dir2`.
|
115
117
|
: `/dir1/pirka.yaml` and `/dir2/pirka.yaml` are searched as config file.
|
@@ -119,16 +121,16 @@ XDG_CONFIG_DIRS
|
|
119
121
|
|
120
122
|
Config file is a YAML file. Properties below are recognized:
|
121
123
|
|
122
|
-
data_home
|
124
|
+
`data_home`
|
123
125
|
: Directory to save and search library files.
|
124
126
|
: Default: `$XDG_CONFIG_HOME/pirka/local`
|
125
127
|
|
126
|
-
additional_directories
|
128
|
+
`additional_directories`
|
127
129
|
: Directories to search library files.
|
128
130
|
: Expressed by sequence(array).
|
129
131
|
: Default: `[]`
|
130
132
|
|
131
|
-
library_repositories
|
133
|
+
`library_repositories`
|
132
134
|
: Git repository URIs used by `pirka lib` command.
|
133
135
|
: Expressed by sequence(array).
|
134
136
|
: Default: `[]`
|
data/app/highlight.rb
CHANGED
@@ -6,6 +6,7 @@ require "epub/maker"
|
|
6
6
|
require "rouge"
|
7
7
|
require "rouge/lexers/fluentd"
|
8
8
|
require "pirka/library"
|
9
|
+
require "pirka/highlighter"
|
9
10
|
require_relative "subcommand"
|
10
11
|
|
11
12
|
module Pirka
|
@@ -20,7 +21,7 @@ module Pirka
|
|
20
21
|
DUMMY_ORIGIN = Addressable::URI.parse("file:///")
|
21
22
|
CSS_PATH = "pirka/style.css" # @todo Avoid conflict with existing item by other than Pirka
|
22
23
|
CSS_CLASS_NAME = "pirka"
|
23
|
-
SCOPE = "
|
24
|
+
SCOPE = ".#{CSS_CLASS_NAME}"
|
24
25
|
THEME = "github"
|
25
26
|
|
26
27
|
def initialize(config)
|
@@ -79,7 +80,17 @@ module Pirka
|
|
79
80
|
def highlight_contents(epub, css_item, library)
|
80
81
|
need_save = []
|
81
82
|
|
82
|
-
|
83
|
+
highlighter = Highlighter::Middleware::ClassName.new(
|
84
|
+
Highlighter::Middleware::Rouge.new(
|
85
|
+
Highlighter.new),
|
86
|
+
class_name: CSS_CLASS_NAME)
|
87
|
+
middleware = library.metadata["middleware"]
|
88
|
+
if middleware && !library.metadata["middleware"].empty?
|
89
|
+
highlighter = library.metadata["middleware"].reduce(highlighter) {|highlighter, desc|
|
90
|
+
params = desc["params"] || {}
|
91
|
+
Highlighter::Middleware.const_get(desc["name"]).new(highlighter, params)
|
92
|
+
}
|
93
|
+
end
|
83
94
|
|
84
95
|
library.each.reverse_each do |(cfi, data)|
|
85
96
|
lang = data["language"]
|
@@ -90,18 +101,8 @@ module Pirka
|
|
90
101
|
itemref, elem, _ = EPUB::Searcher.search_by_cfi(epub, cfi)
|
91
102
|
item = itemref.item
|
92
103
|
doc = elem.document
|
93
|
-
lexer = Rouge::Lexer.find(lang) || Rouge::Lexer.guess(source: elem.content)
|
94
|
-
unless lexer
|
95
|
-
warn "Cannot find lexer for #{lang}"
|
96
|
-
next
|
97
|
-
end
|
98
|
-
elem.inner_html = formatter.format(lexer.lex(elem.content)) # @todo Consider the case `elem` has descendants
|
99
104
|
|
100
|
-
|
101
|
-
unless classes.include? CSS_CLASS_NAME
|
102
|
-
classes << CSS_CLASS_NAME
|
103
|
-
elem["class"] = classes.join(" ")
|
104
|
-
end
|
105
|
+
highlighter.markup elem, lang
|
105
106
|
|
106
107
|
link = doc.at('#pirka') # @todo Avoid conflict with existing link
|
107
108
|
unless link
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require "rouge"
|
2
|
+
require "rouge/lexers/fluentd"
|
3
|
+
|
4
|
+
module Pirka
|
5
|
+
class Highlighter
|
6
|
+
def markup(element, lang)
|
7
|
+
# noop
|
8
|
+
end
|
9
|
+
|
10
|
+
class Middleware
|
11
|
+
class Rouge
|
12
|
+
FORMATTER = ::Rouge::Formatters::HTML.new
|
13
|
+
|
14
|
+
def initialize(highlighter, formatter: FORMATTER)
|
15
|
+
@highlighter = highlighter
|
16
|
+
@formatter = formatter
|
17
|
+
end
|
18
|
+
|
19
|
+
def markup(element, lang)
|
20
|
+
@highlighter.markup(element, lang)
|
21
|
+
lexer = ::Rouge::Lexer.find(lang) || ::Rouge::Lexer.guess(source: element.content)
|
22
|
+
unless lexer
|
23
|
+
warn "Cannot find lexer for #{lang}"
|
24
|
+
return
|
25
|
+
end
|
26
|
+
element.inner_html = @formatter.format(lexer.lex(element.content)) # @todo Consider the case `element` has descendants
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class ClassName
|
31
|
+
ATTR_NAME = "class"
|
32
|
+
ATTR_SEPARATOR = /\s+/
|
33
|
+
CLASS_NAME = "pirka"
|
34
|
+
|
35
|
+
def initialize(highlighter, class_name: CLASS_NAME)
|
36
|
+
@highlighter = highlighter
|
37
|
+
@class_name = class_name
|
38
|
+
end
|
39
|
+
|
40
|
+
def markup(element, lang)
|
41
|
+
@highlighter.markup element, lang
|
42
|
+
class_names = (element[ATTR_NAME] || "").split(ATTR_SEPARATOR)
|
43
|
+
return if class_names.include? @class_name
|
44
|
+
class_names << @class_name
|
45
|
+
element[ATTR_NAME] = class_names.join(" ")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
class LineNum
|
50
|
+
def initialize(highlighter, params = {})
|
51
|
+
@highlighter = highlighter
|
52
|
+
@selector = params["selector"]
|
53
|
+
raise "selector param not specified" unless @selector
|
54
|
+
end
|
55
|
+
|
56
|
+
def markup(element, lang)
|
57
|
+
nums = element.search(@selector)
|
58
|
+
nums.each(&:unlink)
|
59
|
+
@highlighter.markup element, lang
|
60
|
+
return if nums.empty?
|
61
|
+
element.inner_html = element.inner_html.lines.collect.with_index {|line, index|
|
62
|
+
num = nums[index].to_xml
|
63
|
+
if line.length > 1
|
64
|
+
line[0..0] << num << line[1..-1]
|
65
|
+
else
|
66
|
+
num << line
|
67
|
+
end
|
68
|
+
}.join
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
data/lib/pirka/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pirka
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- KITAITI Makoto
|
@@ -258,6 +258,7 @@ files:
|
|
258
258
|
- bin/pirka
|
259
259
|
- lib/pirka.rb
|
260
260
|
- lib/pirka/config.rb
|
261
|
+
- lib/pirka/highlighter.rb
|
261
262
|
- lib/pirka/library.rb
|
262
263
|
- lib/pirka/version.rb
|
263
264
|
- pirka.gemspec
|