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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 22eccb48d25cea5abdc9ff5a3e38b9dd3953ac974e0cb8ae20624bd5c45be8c8
4
- data.tar.gz: b86fcab19a18714ad36b7980445144fd6bd09b79fa2237308ab9823aabc2262f
3
+ metadata.gz: 87163ebf7ebd03945a2e8da4e22fcae1d56044b4a639b60c1862846824cb65c0
4
+ data.tar.gz: 4a8001e069cce6faed6bdac488e98a504bcfde14d282bef08e20ee24b6353bd1
5
5
  SHA512:
6
- metadata.gz: 67425cfb8eaff8f4016cfaa337924c75e8eb6985a494f31f39ac73491b81f8494ec298bf68662bf185ce7ccc171dd8ebd6b8a2b5a08eacf3cea257154ca99440
7
- data.tar.gz: a1d8a0f28afca36df4bf844f7a2347e7ebe7e70d25a2b88667825998f20691945d6334ab78e8d21a878ef0da59cf4347b803eec9917e354e9a7b01089f214d51
6
+ metadata.gz: c45a00b5ccfd02c89b8993e42099dec6cbb43789eb427221ee0428f87821634ef34d9d0b8af63805f0d64f71183b776e3405e2bd3d12e5393bcb4c4998fe8a74
7
+ data.tar.gz: e2474eef94d5d6d0b288d6464b21f85d2f0a80b2489badb3ea0c23db5e1aa9a97842bcde87471df822c77f3ebc6ff4ca927c1e964be0d05b8495f6a5ed6babb2
data/.gitignore CHANGED
@@ -6,3 +6,4 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ /Makefile
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2020 TODO: Write your name
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
@@ -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
@@ -1,6 +1,14 @@
1
- require "timelime/version"
1
+ require 'timelime/version'
2
2
 
3
- module Timelime
4
- class Error < StandardError; end
5
- # Your code goes here...
6
- end
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,22 @@
1
+ module Timelime
2
+
3
+ class Head
4
+
5
+ attr_reader :data
6
+
7
+ @data
8
+
9
+ def initialize raw
10
+ if raw[0] == "#"
11
+ raw = raw[1..-1]
12
+ end
13
+ @data = raw.strip
14
+ end
15
+
16
+ def to_s
17
+ @data.to_s
18
+ end
19
+
20
+ end
21
+
22
+ 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
@@ -1,3 +1,3 @@
1
1
  module Timelime
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
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.0
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