timelime 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/.gitignore +1 -0
- data/LICENSE.txt +1 -1
- data/bin/timelime +33 -0
- data/lib/timelime.rb +13 -5
- data/lib/timelime/axis.rb +98 -0
- data/lib/timelime/dump.rb +98 -0
- data/lib/timelime/event.rb +29 -0
- data/lib/timelime/head.rb +22 -0
- data/lib/timelime/parse.rb +55 -0
- data/lib/timelime/table.rb +43 -0
- data/lib/timelime/tags.rb +31 -0
- data/lib/timelime/time.rb +92 -0
- data/lib/timelime/tree.rb +52 -0
- data/lib/timelime/version.rb +1 -1
- metadata +10 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 87163ebf7ebd03945a2e8da4e22fcae1d56044b4a639b60c1862846824cb65c0
|
4
|
+
data.tar.gz: 4a8001e069cce6faed6bdac488e98a504bcfde14d282bef08e20ee24b6353bd1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c45a00b5ccfd02c89b8993e42099dec6cbb43789eb427221ee0428f87821634ef34d9d0b8af63805f0d64f71183b776e3405e2bd3d12e5393bcb4c4998fe8a74
|
7
|
+
data.tar.gz: e2474eef94d5d6d0b288d6464b21f85d2f0a80b2489badb3ea0c23db5e1aa9a97842bcde87471df822c77f3ebc6ff4ca927c1e964be0d05b8495f6a5ed6babb2
|
data/.gitignore
CHANGED
data/LICENSE.txt
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
The MIT License (MIT)
|
2
2
|
|
3
|
-
Copyright (c) 2020 TODO:
|
3
|
+
Copyright (c) 2020 TODO: patztablook22
|
4
4
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
data/bin/timelime
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
#! /usr/bin/ruby
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'timelime'
|
5
|
+
rescue
|
6
|
+
puts "lib require failed"
|
7
|
+
exit 1
|
8
|
+
end
|
9
|
+
|
10
|
+
paths = ARGV
|
11
|
+
if paths.size == 0
|
12
|
+
paths += ["."]
|
13
|
+
end
|
14
|
+
|
15
|
+
tree = Timelime::Tree.new(paths)
|
16
|
+
table = Timelime::Table.new
|
17
|
+
|
18
|
+
tree.get do |file|
|
19
|
+
Timelime.parse(file) do |event|
|
20
|
+
table.push event
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
if table.size == 0
|
25
|
+
puts "table is empty"
|
26
|
+
end
|
27
|
+
|
28
|
+
axis = Timelime::Axis.new(table)
|
29
|
+
axis.generate 3
|
30
|
+
|
31
|
+
puts
|
32
|
+
Timelime::dump axis
|
33
|
+
puts
|
data/lib/timelime.rb
CHANGED
@@ -1,6 +1,14 @@
|
|
1
|
-
require
|
1
|
+
require 'timelime/version'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
require 'timelime/head'
|
4
|
+
require 'timelime/time'
|
5
|
+
require 'timelime/tags'
|
6
|
+
|
7
|
+
require 'timelime/event'
|
8
|
+
require 'timelime/parse'
|
9
|
+
|
10
|
+
require 'timelime/tree'
|
11
|
+
require 'timelime/table'
|
12
|
+
|
13
|
+
require 'timelime/axis'
|
14
|
+
require 'timelime/dump'
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module Timelime
|
2
|
+
|
3
|
+
class Axis
|
4
|
+
|
5
|
+
attr_reader :buffer, :lines
|
6
|
+
|
7
|
+
@table
|
8
|
+
@buffer
|
9
|
+
@begin
|
10
|
+
@length
|
11
|
+
@lines
|
12
|
+
|
13
|
+
def initialize table
|
14
|
+
@table = table
|
15
|
+
end
|
16
|
+
|
17
|
+
def generate precision = 10
|
18
|
+
|
19
|
+
@buffer = [
|
20
|
+
[], # L side
|
21
|
+
[], # R side
|
22
|
+
]
|
23
|
+
range = @table.range
|
24
|
+
@begin = range[0]
|
25
|
+
@length = range[1] - range[0]
|
26
|
+
size = @table.size
|
27
|
+
@lines = size * precision
|
28
|
+
|
29
|
+
@table.get do |e|
|
30
|
+
squeeze e
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
def scale time
|
36
|
+
buf = time.data.map do |yr|
|
37
|
+
tmp = (1.0 * @lines * (yr - @begin) / @length).to_i
|
38
|
+
if tmp >= @lines
|
39
|
+
tmp = @lines - 1
|
40
|
+
end
|
41
|
+
tmp
|
42
|
+
end
|
43
|
+
unless buf.size == 1
|
44
|
+
it = buf[0] + 1
|
45
|
+
while it < buf[1]
|
46
|
+
buf += [it]
|
47
|
+
it += 1
|
48
|
+
end
|
49
|
+
end
|
50
|
+
buf
|
51
|
+
end
|
52
|
+
|
53
|
+
def label line
|
54
|
+
@begin + @length * line / @lines
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def squeeze event
|
60
|
+
|
61
|
+
todo = scale event.time
|
62
|
+
if ( event.time.size == 2)
|
63
|
+
side = 0
|
64
|
+
else
|
65
|
+
side = 1
|
66
|
+
end
|
67
|
+
|
68
|
+
found = nil
|
69
|
+
@buffer[side].each_with_index do |column, index|
|
70
|
+
|
71
|
+
free = true
|
72
|
+
todo.each do |line|
|
73
|
+
unless column[line].nil?
|
74
|
+
free = false
|
75
|
+
break
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
if free
|
80
|
+
found = index
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
if found.nil?
|
86
|
+
@buffer[side] += [Array.new(@lines)]
|
87
|
+
found = @buffer[side].size - 1
|
88
|
+
end
|
89
|
+
|
90
|
+
todo.each do |line|
|
91
|
+
@buffer[side][found][line] = event
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module Timelime
|
2
|
+
|
3
|
+
def self.dump axis
|
4
|
+
|
5
|
+
data = axis.buffer
|
6
|
+
|
7
|
+
for c in 0...data[0].size
|
8
|
+
for l in 0...data[0][c].size
|
9
|
+
e = data[0][c][l]
|
10
|
+
check = [e.to_s, "*"]
|
11
|
+
above = data[0][c][l - 1].to_s
|
12
|
+
below = data[0][c][l + 1].to_s
|
13
|
+
if e.nil?
|
14
|
+
next
|
15
|
+
elsif check.include? above and check.include? below
|
16
|
+
data[0][c][l] = "*"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
data.map! do |s|
|
22
|
+
s.map! do |c|
|
23
|
+
c.map! do |e|
|
24
|
+
if e.nil?
|
25
|
+
nil
|
26
|
+
elsif e.class == Timelime::Event
|
27
|
+
e.head
|
28
|
+
else
|
29
|
+
"*"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
tabs = [
|
36
|
+
Array.new(data[0].size, 0),
|
37
|
+
Array.new(data[1].size, 0),
|
38
|
+
]
|
39
|
+
|
40
|
+
for s in 0..1
|
41
|
+
for c in 0...data[s].size
|
42
|
+
for l in 0...axis.lines
|
43
|
+
tmp = data[s][c][l].to_s.length
|
44
|
+
if tmp > tabs[s][c]
|
45
|
+
tabs[s][c] = tmp
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
data[0] = data[0].transpose
|
52
|
+
data[1] = data[1].transpose
|
53
|
+
|
54
|
+
buf = []
|
55
|
+
|
56
|
+
for l in 0...axis.lines
|
57
|
+
|
58
|
+
buf += [""]
|
59
|
+
|
60
|
+
for s in 0..1
|
61
|
+
|
62
|
+
data[s][l].each_with_index do |txt, c|
|
63
|
+
|
64
|
+
buf[-1] += tab(txt, tabs[s][c], s)
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
if s == 0
|
69
|
+
buf[-1] += " │ " + tab(axis.label(l), 6, 0) + " │ "
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
buf.each do |line|
|
77
|
+
puts line
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
|
84
|
+
def self.tab(txt, num, side = 1)
|
85
|
+
txt = txt.to_s
|
86
|
+
buf = " "
|
87
|
+
if side == 0
|
88
|
+
buf += " " * (num - txt.size)
|
89
|
+
end
|
90
|
+
buf += txt
|
91
|
+
if side == 1
|
92
|
+
buf += " " * (num - txt.size)
|
93
|
+
end
|
94
|
+
buf += " "
|
95
|
+
buf
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Timelime
|
2
|
+
|
3
|
+
class Event
|
4
|
+
|
5
|
+
attr_accessor :head, :time, :tags
|
6
|
+
|
7
|
+
def initialize(rawHead = "")
|
8
|
+
@head = Timelime::Head.new(rawHead)
|
9
|
+
@time = Timelime::Time.new
|
10
|
+
@tags = Timelime::Tags.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def complete?
|
14
|
+
[
|
15
|
+
@head,
|
16
|
+
@time,
|
17
|
+
].each do |d|
|
18
|
+
if d.data.length == 0
|
19
|
+
return false
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
return true
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Timelime
|
2
|
+
|
3
|
+
def self.parse path
|
4
|
+
|
5
|
+
lines = IO.readlines(path)
|
6
|
+
lines += ["FEND"]
|
7
|
+
number = 0
|
8
|
+
err = false
|
9
|
+
buf = nil
|
10
|
+
|
11
|
+
lines.each do |line|
|
12
|
+
|
13
|
+
number += 1
|
14
|
+
begin
|
15
|
+
|
16
|
+
line.rstrip!
|
17
|
+
if line.empty?
|
18
|
+
next
|
19
|
+
end
|
20
|
+
|
21
|
+
# new entry
|
22
|
+
if line.lstrip == line
|
23
|
+
if !buf.nil? and !err and buf.complete?
|
24
|
+
yield buf
|
25
|
+
end
|
26
|
+
buf = Timelime::Event.new(line)
|
27
|
+
err = false
|
28
|
+
next
|
29
|
+
end
|
30
|
+
|
31
|
+
if err
|
32
|
+
next
|
33
|
+
end
|
34
|
+
|
35
|
+
line.strip!
|
36
|
+
case line[0]
|
37
|
+
when "*"
|
38
|
+
buf.time.push(line)
|
39
|
+
when "#"
|
40
|
+
buf.tags.push(line)
|
41
|
+
else
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
rescue
|
46
|
+
err = true
|
47
|
+
puts "WARN: invalid definition: #{path} line #{number}"
|
48
|
+
puts " skipping to next entry"
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Timelime
|
2
|
+
|
3
|
+
class Table
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@data = []
|
7
|
+
end
|
8
|
+
|
9
|
+
def push event
|
10
|
+
@data += [event]
|
11
|
+
end
|
12
|
+
|
13
|
+
def get &block
|
14
|
+
@data.each do |e|
|
15
|
+
yield e
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def size
|
20
|
+
tmp = 0
|
21
|
+
@data.each do |e|
|
22
|
+
tmp += e.time.size
|
23
|
+
end
|
24
|
+
tmp
|
25
|
+
end
|
26
|
+
|
27
|
+
def range
|
28
|
+
min = nil
|
29
|
+
max = nil
|
30
|
+
@data.each do |e|
|
31
|
+
if min.nil? or e.time.data[0] < min
|
32
|
+
min = e.time.data[0]
|
33
|
+
end
|
34
|
+
if max.nil? or e.time.data[-1] > max
|
35
|
+
max = e.time.data[-1]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
[min, max]
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Timelime
|
2
|
+
|
3
|
+
class Tags
|
4
|
+
|
5
|
+
attr_reader :data
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@data = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def push raw
|
12
|
+
|
13
|
+
raw.split.each do |tag|
|
14
|
+
|
15
|
+
unless tag[0] == "#" and tag.length > 1
|
16
|
+
throw :syntax
|
17
|
+
end
|
18
|
+
|
19
|
+
@data += [tag[1..-1]]
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_s
|
26
|
+
@data.to_s
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module Timelime
|
2
|
+
|
3
|
+
class Time
|
4
|
+
|
5
|
+
attr_reader :data
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@data = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def size
|
12
|
+
@data.size
|
13
|
+
end
|
14
|
+
|
15
|
+
def push raw
|
16
|
+
|
17
|
+
unless @data.size == 0
|
18
|
+
raise
|
19
|
+
end
|
20
|
+
|
21
|
+
while raw[0] == "*"
|
22
|
+
raw = raw[1..-1].lstrip
|
23
|
+
end
|
24
|
+
|
25
|
+
while raw[-1] == "*"
|
26
|
+
raw = raw[0..-2].rstrip
|
27
|
+
end
|
28
|
+
|
29
|
+
era = []
|
30
|
+
raw.upcase!
|
31
|
+
words = raw.split
|
32
|
+
dash = 1
|
33
|
+
|
34
|
+
words.each do |w|
|
35
|
+
|
36
|
+
n = w.to_i
|
37
|
+
|
38
|
+
if n.to_s == w
|
39
|
+
|
40
|
+
if dash != 1
|
41
|
+
raise
|
42
|
+
end
|
43
|
+
dash -= 1
|
44
|
+
@data += [n]
|
45
|
+
era += [0]
|
46
|
+
next
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
if @data.size == 0
|
51
|
+
raise
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
if w == "-"
|
56
|
+
dash += 1
|
57
|
+
elsif w == "CE"
|
58
|
+
era[-1] = 1
|
59
|
+
elsif w == "BCE"
|
60
|
+
era[-1] = -1
|
61
|
+
else
|
62
|
+
raise
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
for i in 0...@data.size
|
68
|
+
if era[i] == -1
|
69
|
+
@data[i] *= -1
|
70
|
+
for j in 0..i
|
71
|
+
if era[j] == 0
|
72
|
+
@data[j] *= -1
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
if @data.size == 2
|
79
|
+
if @data[0] > @data[1]
|
80
|
+
throw
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
def to_s
|
87
|
+
@data.to_s
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Timelime
|
2
|
+
|
3
|
+
class Tree
|
4
|
+
|
5
|
+
@todo
|
6
|
+
|
7
|
+
def initialize paths
|
8
|
+
|
9
|
+
@todo = []
|
10
|
+
paths.each do |path|
|
11
|
+
@todo += walk path
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
def get(&block)
|
17
|
+
|
18
|
+
unless block == nil
|
19
|
+
@todo.each do |path|
|
20
|
+
yield path
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
@todo
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def walk path
|
31
|
+
|
32
|
+
unless File.exist? path
|
33
|
+
return []
|
34
|
+
end
|
35
|
+
|
36
|
+
buf = []
|
37
|
+
|
38
|
+
if File.directory? path
|
39
|
+
Dir[path + "/*"].each do |p|
|
40
|
+
buf += walk p
|
41
|
+
end
|
42
|
+
else
|
43
|
+
buf += [path]
|
44
|
+
end
|
45
|
+
|
46
|
+
buf
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
data/lib/timelime/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: timelime
|
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
|
- patztablook22
|
@@ -25,6 +25,15 @@ files:
|
|
25
25
|
- Rakefile
|
26
26
|
- bin/timelime
|
27
27
|
- lib/timelime.rb
|
28
|
+
- lib/timelime/axis.rb
|
29
|
+
- lib/timelime/dump.rb
|
30
|
+
- lib/timelime/event.rb
|
31
|
+
- lib/timelime/head.rb
|
32
|
+
- lib/timelime/parse.rb
|
33
|
+
- lib/timelime/table.rb
|
34
|
+
- lib/timelime/tags.rb
|
35
|
+
- lib/timelime/time.rb
|
36
|
+
- lib/timelime/tree.rb
|
28
37
|
- lib/timelime/version.rb
|
29
38
|
- timelime.gemspec
|
30
39
|
homepage: https://github.com/patztablook22/timelime
|