timelime 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|