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 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