nora_mark 0.2beta3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,31 @@
1
+ require 'nora_mark/parser.kpeg'
2
+
3
+ module NoraMark
4
+ class Parser
5
+ def create_item(type, command, children = [], raw: nil)
6
+ children[0].sub!(/^[[:space:]]+/, '') if !children.nil? && children[0].is_a?(String)
7
+ item = {:type => type, :children => children, :raw_text => raw }.merge command || {}
8
+ item[:args] ||= []
9
+ item[:named_args] = Hash[*(item[:args].select { |x| x.include?(':') }.map { |x| v = x.split(':', 2); [v[0].strip.to_sym, v[1]]}.flatten)]
10
+ item
11
+ end
12
+
13
+ def parse_text(content)
14
+ content.inject([]) do
15
+ |result, item|
16
+ if item.is_a? String
17
+ s = result.last
18
+ if s.is_a? String
19
+ result.pop
20
+ else
21
+ s = ''
22
+ end
23
+ result.push s + item
24
+ else
25
+ result.push item
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+
@@ -0,0 +1,3 @@
1
+ module NoraMark
2
+ VERSION = "0.2beta3"
3
+ end
data/lib/nora_mark.rb ADDED
@@ -0,0 +1,46 @@
1
+ require "nora_mark/version"
2
+ require 'nora_mark/html/generator'
3
+ require 'nora_mark/parser'
4
+
5
+ module NoraMark
6
+ class Document
7
+ private_class_method :new
8
+
9
+ def self.parse(string_or_io, param = {})
10
+ instance = new param
11
+ src = string_or_io.respond_to?(:read) ? string_or_io.read : string_or_io
12
+ yield instance if block_given?
13
+ instance.instance_eval do
14
+ @preprocessors.each do
15
+ |pr|
16
+ src = pr.call(src)
17
+ end
18
+ @parser = Parser.new(src)
19
+ if (!@parser.parse)
20
+ raise @parser.raise_error
21
+ end
22
+ end
23
+ instance
24
+ end
25
+
26
+ def preprocessor(&block)
27
+ @preprocessors << block
28
+ end
29
+
30
+ def html
31
+ if @html.nil?
32
+ @html = @html_generator.convert(@parser.result)
33
+ end
34
+ @html
35
+ end
36
+
37
+ def initialize(param = {})
38
+ @preprocessors = [
39
+ Proc.new { |text| text.gsub(/\r?\n(\r?\n)+/, "\n\n") },
40
+ ]
41
+ @html_generator = Html::Generator.new(param)
42
+ end
43
+
44
+
45
+ end
46
+ end
data/nora_mark.gemspec ADDED
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/nora_mark/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["KOJIMA Satoshi"]
6
+ gem.email = ["skoji@mac.com"]
7
+ gem.description = %q{simple and customizable text markup language for EPUB}
8
+ gem.summary = %q{simple and customizable text markup language for EPUB}
9
+ gem.homepage = ""
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "nora_mark"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = NoraMark::VERSION
17
+
18
+ gem.required_ruby_version = '>= 2.0.0'
19
+ gem.add_dependency "kpeg"
20
+ gem.add_development_dependency "rspec", "~> 2.14"
21
+ gem.add_development_dependency "nokogiri", "~> 1.6.0"
22
+ end
@@ -0,0 +1 @@
1
+ *.xhtml
@@ -0,0 +1,50 @@
1
+ title: the sample text
2
+ sect.preface {
3
+ h1: 前書き
4
+ 前書きのようなものをここでかく。
5
+ 「前書き」とは英語では[s.strong{preface}]のことだろうか。
6
+ }
7
+
8
+ newpage:
9
+
10
+ art.main {
11
+
12
+ h1: 本文
13
+ ここからが本文。
14
+ チェックする項目は
15
+
16
+ 1: ol要素が出ること
17
+ 2: ul要素がでること
18
+ 3: dl要素
19
+ 4: spanがでること
20
+
21
+ である。
22
+
23
+ [s.strong{NoraMark}] の要素は、次のものからなる。
24
+
25
+ *: 行
26
+ *: パラグラフ
27
+ *: 行コマンド
28
+ *: ブロックコマンド
29
+ *: インラインコマンド
30
+
31
+ ;: 行: 行コマンドでマークアップされていない行は、pタグで囲まれる。
32
+ ;: パラグラフ: 空行で区切られた一連の行は、div class='pgroup' で囲まれる。空行ではなく、別のコマンドによってもパラグラフは生成される。
33
+
34
+ コマンドについて説明する。
35
+
36
+ ;:コマンド文字列: <コマンド名>[#id名]*[.クラス名]*[(パラメータ)]
37
+ ;: 行コマンド : 行先頭に、<コマンド文字列>: がくる。続く行末までの文字が処理対象となる。p/h以外のブロック要素を生成する行コマンドは、暗黙のブロックを中断する。
38
+ ;: ブロックコマンド : 行先頭に<コマンド文字列>{ がくる。その行では文字を続けない。} 単独の行で閉じる。
39
+ ;: インラインコマンド : 行の途中にあらわれる[<コマンド文字列>{<文字>}] の列。
40
+
41
+ 定義済みコマンドは次のとおり。
42
+
43
+ ;.commands: 行コマンド: p
44
+ ;: パラグラフを中断する行コマンド: newpage, image, h1, h2, h3, h4, h5, h6, *(箇条書き), 数字(列挙), ;(定義リスト)
45
+ ;:ブロックコマンド: d, art, sec。未定義であっても、ブロックコマンドの形式をしていればなんでも<コマンド名> ... </コマンド名> に展開される。
46
+ ;:インラインコマンド: s, l, img。 その他は、インラインコマンドの形式をしていれば、なんでも<コマンド名> ... </コマンド名> に展開される。
47
+
48
+
49
+
50
+ }
@@ -0,0 +1,41 @@
1
+ module Nokogiri
2
+ module XML
3
+ class Element
4
+ def selector
5
+ sel = name
6
+ if !self['id'].nil?
7
+ sel = sel + '#' + self['id'].split(' ').join('#')
8
+ end
9
+ if !self['class'].nil?
10
+ sel = sel + '.' + self['class'].split(' ').join('.')
11
+ end
12
+ attributes.select{|k,v| k != 'class' && k != 'id'}.each {
13
+ |name, value|
14
+ sel = sel + "[#{name}='#{value}']"
15
+ }
16
+ sel
17
+ end
18
+ def selector_and_text
19
+ [selector, text]
20
+ end
21
+ alias a selector_and_text
22
+ def child_loop
23
+ yield self
24
+ end
25
+ def child_a(index)
26
+ element_children[index].selector_and_text
27
+ end
28
+ def selector_and_children
29
+ [selector] + children.select{|c| c.elem? || c.text.strip.size > 0}.map{|c|
30
+ if !c.elem?
31
+ c.text
32
+ elsif c.element_children.size == 0
33
+ c.selector_and_text
34
+ else
35
+ c.selector_and_children
36
+ end
37
+ }
38
+ end
39
+ end
40
+ end
41
+ end