scholarmarkdown 2.4.0 → 2.5.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 +4 -4
- data/VERSION +1 -1
- data/bin/template/content/styles/print.scss +18 -0
- data/bin/template/content/styles/screen.scss +5 -0
- data/bin/template/content/styles/shared.scss +20 -0
- data/lib/scholarmarkdown/filter/acronym.rb +21 -1
- data/lib/scholarmarkdown/filter/labelify.rb +87 -23
- data/lib/scholarmarkdown/snippets.rb +6 -2
- data/scholarmarkdown.gemspec +3 -3
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 91f2c165820d1506fffbd6efce12046cad1bfccb257377c925508a40096d985f
|
|
4
|
+
data.tar.gz: c97b69b7409f6bb3a22af5f93fbf141188e7d3a088a48877d6081ed743be0af7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 58e04398a9606724c7402017ae51257aee8b161cccb7a1342ebc6e802cea9397a19413354a6e68939425717e6ec7bb18f1b16d325aa4ba6e9fabd87df1c385f8
|
|
7
|
+
data.tar.gz: 3bbe1081caeebf61a7f96bb529ccd54dcac0d8f5e06afa08bcb97399fee82188d21a728577c85ca68fee5da64a60a4aac3b8c26286b818ef5d82f72139c083a4
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2.
|
|
1
|
+
2.5.0
|
|
@@ -7,3 +7,21 @@ header {
|
|
|
7
7
|
display: none;
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
|
+
|
|
11
|
+
// Table of contents
|
|
12
|
+
ol.index-entries {
|
|
13
|
+
margin-bottom: 0;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
ol.index-entries[depth="0"] {
|
|
17
|
+
li {
|
|
18
|
+
font-weight: bold;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
ol.index-entries[depth="1"] {
|
|
23
|
+
margin-bottom: 1em;
|
|
24
|
+
li {
|
|
25
|
+
font-weight: normal;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -76,3 +76,23 @@ dl {
|
|
|
76
76
|
var {
|
|
77
77
|
font-style: italic;
|
|
78
78
|
}
|
|
79
|
+
|
|
80
|
+
main {
|
|
81
|
+
h1.no-label-increment,
|
|
82
|
+
h2.no-label-increment,
|
|
83
|
+
h3.no-label-increment,
|
|
84
|
+
h4.no-label-increment,
|
|
85
|
+
h5.no-label-increment {
|
|
86
|
+
&::before {
|
|
87
|
+
content: "";
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
ol.index-entries {
|
|
93
|
+
list-style-type: decimal;
|
|
94
|
+
|
|
95
|
+
li {
|
|
96
|
+
margin-left: 1em;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -3,11 +3,31 @@ require 'csv'
|
|
|
3
3
|
# A filter for displaying full names of acronyms
|
|
4
4
|
Nanoc::Filter.define(:scholar_acronym) do |content, params|
|
|
5
5
|
acronyms = CSV.parse(params[:acronyms].raw_content, :headers => true)
|
|
6
|
+
|
|
7
|
+
# Annotate all occurrences with their full name
|
|
6
8
|
transformed = content.dup
|
|
7
9
|
acronyms.each do |row|
|
|
8
|
-
transformed.gsub! %r{(?<=[
|
|
10
|
+
transformed.gsub! %r{(?<=[\s\.,!?])#{row['abbreviation']}(?=[\s\.,!?])} do |match|
|
|
9
11
|
%{<abbr title='#{row['full']}'>#{row['abbreviation']}</abbr>}
|
|
10
12
|
end
|
|
11
13
|
end
|
|
14
|
+
|
|
15
|
+
# Inject acronyms list
|
|
16
|
+
transformed = transformed.gsub! %r{<div id="scholarmarkdown-acronyms-list"></div>} do |match|
|
|
17
|
+
serialize_acronyms acronyms
|
|
18
|
+
end
|
|
19
|
+
|
|
12
20
|
transformed
|
|
13
21
|
end
|
|
22
|
+
|
|
23
|
+
# Serialize the list of acronyms to a table
|
|
24
|
+
def serialize_acronyms acronyms
|
|
25
|
+
table = "<table class=\"acronyms\">"
|
|
26
|
+
|
|
27
|
+
acronyms.each do |row|
|
|
28
|
+
table += "<tr><th>#{row['abbreviation']}</th><td>#{row['full']}</td></tr>"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
table += "</table>"
|
|
32
|
+
table
|
|
33
|
+
end
|
|
@@ -1,40 +1,61 @@
|
|
|
1
1
|
# Add labels to elements such as figures and sections, and make them referencable.
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
DOCUMENT_SECTIONS = [
|
|
4
|
+
'Chapter',
|
|
5
|
+
'Section',
|
|
6
|
+
'Subsection',
|
|
7
|
+
'Subsubsection'
|
|
8
|
+
]
|
|
9
|
+
|
|
10
|
+
Nanoc::Filter.define(:scholar_labelify) do |content, params|
|
|
11
|
+
if params[:chapters]
|
|
12
|
+
document_sections = DOCUMENT_SECTIONS
|
|
13
|
+
else
|
|
14
|
+
document_sections = DOCUMENT_SECTIONS[1, DOCUMENT_SECTIONS.length]
|
|
15
|
+
end
|
|
16
|
+
|
|
3
17
|
content = content.dup
|
|
4
|
-
|
|
5
|
-
|
|
18
|
+
sections_index = []
|
|
19
|
+
|
|
20
|
+
labels = create_labels document_sections, sections_index, content
|
|
6
21
|
add_labels_to_figures content, labels
|
|
7
22
|
set_reference_labels content, labels
|
|
8
23
|
|
|
24
|
+
serialize_sections_index sections_index, params[:sections_index_depth] || 3, content
|
|
25
|
+
|
|
9
26
|
content
|
|
10
27
|
end
|
|
11
28
|
|
|
12
29
|
# Creates labels for referenceable elements
|
|
13
|
-
def create_labels content
|
|
30
|
+
def create_labels document_sections, sections_index, content
|
|
14
31
|
@reference_counts = {}
|
|
15
32
|
main = content[%r{<main>.*</main>}m]
|
|
16
33
|
appendix = content[%r{<div id="appendix"[^>]*>.*</div>}m] || ""
|
|
17
|
-
labels = (main + appendix).scan(/<(\w+)([^>]*\s+id="([^"]+)"[^>]*)
|
|
18
|
-
.map do |tag, attribute_list, id|
|
|
19
|
-
|
|
20
|
-
|
|
34
|
+
labels = (main + appendix).scan(/<(\w+)([^>]*\s+id="([^"]+)"[^>]*)>([^<]*)(?=<)/)
|
|
35
|
+
.map do |tag, attribute_list, id, name|
|
|
36
|
+
attributes = parse_attributes(attribute_list)
|
|
37
|
+
type = label_type_for document_sections, tag.downcase.to_sym, attributes
|
|
38
|
+
number = 0
|
|
39
|
+
if attributes[:class].nil? or !attributes[:class].include? 'no-label-increment'
|
|
40
|
+
number = number_for document_sections, type, name, id, sections_index
|
|
41
|
+
end
|
|
21
42
|
[id, "#{type} #{number}"]
|
|
22
43
|
end
|
|
23
44
|
labels.to_h
|
|
24
45
|
end
|
|
25
46
|
|
|
26
47
|
# Determines the label type of a given element
|
|
27
|
-
def label_type_for tag,
|
|
48
|
+
def label_type_for document_sections, tag, attributes
|
|
28
49
|
case tag
|
|
29
50
|
when :h2
|
|
30
|
-
|
|
51
|
+
document_sections[0]
|
|
31
52
|
when :h3
|
|
32
|
-
|
|
53
|
+
document_sections[1]
|
|
33
54
|
when :h4
|
|
34
|
-
|
|
55
|
+
document_sections[2]
|
|
35
56
|
when :figure
|
|
36
|
-
unless
|
|
37
|
-
for clazz in
|
|
57
|
+
unless attributes[:class].nil?
|
|
58
|
+
for clazz in attributes[:class].split(' ') do
|
|
38
59
|
case clazz
|
|
39
60
|
when 'algorithm'
|
|
40
61
|
return 'Algorithm'
|
|
@@ -44,6 +65,8 @@ def label_type_for tag, attribute_list
|
|
|
44
65
|
return 'Table'
|
|
45
66
|
when 'equation'
|
|
46
67
|
return 'Equation'
|
|
68
|
+
when 'subfigure'
|
|
69
|
+
return 'Subfig.'
|
|
47
70
|
end
|
|
48
71
|
end
|
|
49
72
|
end
|
|
@@ -53,27 +76,46 @@ def label_type_for tag, attribute_list
|
|
|
53
76
|
end
|
|
54
77
|
end
|
|
55
78
|
|
|
56
|
-
def number_for type
|
|
79
|
+
def number_for document_sections, type, name, id, sections_index
|
|
57
80
|
# Determine number of elements
|
|
58
81
|
@reference_counts[type] ||= 0
|
|
59
82
|
number = @reference_counts[type] += 1
|
|
60
83
|
|
|
61
84
|
# Perform hierarchical numbering when needed
|
|
62
85
|
case type
|
|
63
|
-
when
|
|
64
|
-
@reference_counts[
|
|
65
|
-
@reference_counts[
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
86
|
+
when document_sections[0]
|
|
87
|
+
@reference_counts[document_sections[1]] = 0
|
|
88
|
+
@reference_counts[document_sections[2]] = 0
|
|
89
|
+
sections_index[@reference_counts[document_sections[0]] - 1] = { :name => name, :id => id, :children => [] }
|
|
90
|
+
when document_sections[1]
|
|
91
|
+
@reference_counts[document_sections[2]] = 0
|
|
92
|
+
number = "#{reference_counts[document_sections[0]]}.#{number}"
|
|
93
|
+
sections_index[@reference_counts[document_sections[0]] - 1][:children][@reference_counts[document_sections[1]] - 1] = { :name => name, :id => id, :children => [] }
|
|
94
|
+
when document_sections[2]
|
|
95
|
+
number = "#{reference_counts[document_sections[0]]}.#{reference_counts[document_sections[1]]}.#{number}"
|
|
96
|
+
sections_index[@reference_counts[document_sections[0]] - 1][:children][@reference_counts[document_sections[1]] - 1][:children][@reference_counts[document_sections[2]] - 1] = { :name => name, :id => id, :children => [] }
|
|
97
|
+
when 'Fig.'
|
|
98
|
+
@reference_counts['Subfig.'] = 0
|
|
99
|
+
when 'Subfig.'
|
|
100
|
+
number = "#{reference_counts['Fig.']}.#{number}"
|
|
71
101
|
end
|
|
72
102
|
number
|
|
73
103
|
end
|
|
74
104
|
|
|
75
105
|
# Adds labels to referenceable figures
|
|
76
106
|
def add_labels_to_figures content, labels
|
|
107
|
+
# Subfigures
|
|
108
|
+
content.gsub! %r{<figure[^>]*\s+id="([^"]+)"\s+class="[^"]*subfigure[^"]*".*?<figcaption>(?:\s*<p>)?}m do |match|
|
|
109
|
+
id=$1
|
|
110
|
+
match = match.sub! '<figcaption>', '<figcaption class="for-subfigure">'
|
|
111
|
+
if labels.key? id
|
|
112
|
+
%{#{match}<span class="label">#{h labels[id]}:</span> }
|
|
113
|
+
else
|
|
114
|
+
match
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Main figures
|
|
77
119
|
content.gsub! %r{<figure[^>]*\s+id="([^"]+)".*?<figcaption>(?:\s*<p>)?}m do |match|
|
|
78
120
|
if labels.key? $1
|
|
79
121
|
%{#{match}<span class="label">#{h labels[$1]}:</span> }
|
|
@@ -100,3 +142,25 @@ def parse_attributes attribute_list
|
|
|
100
142
|
.map { |k,v| [k.downcase.to_sym, v] }
|
|
101
143
|
.to_h
|
|
102
144
|
end
|
|
145
|
+
|
|
146
|
+
# Replace '<div id="toc-index"></div>' with the sections index
|
|
147
|
+
def serialize_sections_index sections_index, max_depth, content
|
|
148
|
+
content.gsub! %r{<div id="scholarmarkdown-toc-index"></div>} do |match|
|
|
149
|
+
serialize_sections_index_row sections_index, max_depth, 0, true
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
# Serialize a single row of index entries, and recursively create the index for sub-entries
|
|
154
|
+
def serialize_sections_index_row sections_index, max_depth, depth, root
|
|
155
|
+
if max_depth == 0
|
|
156
|
+
return ""
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
table = "<ol class=\"#{root ? "index-entries index-entries-root" : "index-entries"}\" depth=\"#{depth}\">"
|
|
160
|
+
sections_index.each do |section|
|
|
161
|
+
index_sub = serialize_sections_index_row section[:children], max_depth - 1, depth + 1, false
|
|
162
|
+
table += "<li><a href=\"##{section[:id]}\" class=\"index-entry-name\">#{section[:name]}</a>#{index_sub}</li>"
|
|
163
|
+
end
|
|
164
|
+
table += "</ol>"
|
|
165
|
+
table
|
|
166
|
+
end
|
|
@@ -4,13 +4,17 @@ require 'erb'
|
|
|
4
4
|
include ERB::Util
|
|
5
5
|
|
|
6
6
|
# Create a section block with the given file contents
|
|
7
|
-
def section id
|
|
7
|
+
def section id, classes = nil
|
|
8
|
+
section_suffix=''
|
|
9
|
+
if classes
|
|
10
|
+
section_suffix=" class=\"" + classes + "\""
|
|
11
|
+
end
|
|
8
12
|
item = @items["/#{id.to_s}.*"]
|
|
9
13
|
if not item
|
|
10
14
|
raise "Could not find the file '" + id.to_s + "'"
|
|
11
15
|
end
|
|
12
16
|
<<-HTML
|
|
13
|
-
<section markdown="block">
|
|
17
|
+
<section markdown="block"#{section_suffix}>
|
|
14
18
|
#{item.raw_content}
|
|
15
19
|
</section>
|
|
16
20
|
HTML
|
data/scholarmarkdown.gemspec
CHANGED
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
3
3
|
# Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
|
5
|
-
# stub: scholarmarkdown 2.
|
|
5
|
+
# stub: scholarmarkdown 2.5.0 ruby lib
|
|
6
6
|
|
|
7
7
|
Gem::Specification.new do |s|
|
|
8
8
|
s.name = "scholarmarkdown".freeze
|
|
9
|
-
s.version = "2.
|
|
9
|
+
s.version = "2.5.0"
|
|
10
10
|
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
|
12
12
|
s.require_paths = ["lib".freeze]
|
|
13
13
|
s.authors = ["Ruben Taelman".freeze]
|
|
14
|
-
s.date = "2019-07-
|
|
14
|
+
s.date = "2019-07-22"
|
|
15
15
|
s.email = "rubensworks@gmail.com".freeze
|
|
16
16
|
s.executables = ["generate-scholarmarkdown".freeze]
|
|
17
17
|
s.extra_rdoc_files = [
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: scholarmarkdown
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ruben Taelman
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2019-07-
|
|
11
|
+
date: 2019-07-22 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: i18n
|