air-parse 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/air/parse.rb +96 -0
- metadata +43 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ee7d1317a87267453ede632b1fa266544b885bc90ea23f2a73aacbdaf490dc28
|
4
|
+
data.tar.gz: a6cbade7050bc05165a527b31b3968a64b7a1a847ef54aabe1d12c8f425e7676
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1c824cfd77d202e7727ca6cfe5fda89f983ff5ec28b98b2dbcb7add9313f4560adcc1e30dddfe50631bba7a630dcae2f0531eb991e3bc0fcde45b2bf792fcbbc
|
7
|
+
data.tar.gz: fcf6ade3c61341500f362501b887c626f762108bd11ffd27226032223d6405737d21059706971663cbbad26c549f63a6e983bfb1d707467f90e476d432cbd298
|
data/lib/air/parse.rb
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
module Air
|
2
|
+
module Parse
|
3
|
+
module SpacePrefix
|
4
|
+
refine String do
|
5
|
+
def space_prefix
|
6
|
+
prefix = 0
|
7
|
+
prefix += 1 until self[prefix] != ' '
|
8
|
+
prefix
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module ::Air
|
14
|
+
def self.parse_file path
|
15
|
+
parse IO.read path
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.parse source
|
19
|
+
Parse[source]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.[] source
|
24
|
+
stairs = []
|
25
|
+
|
26
|
+
lines, cursor = source.lines, 0
|
27
|
+
endpoint = lines.size
|
28
|
+
|
29
|
+
until cursor == endpoint
|
30
|
+
stair = Stair.from lines, at: cursor
|
31
|
+
stairs << stair
|
32
|
+
|
33
|
+
cursor = stair.end_at + 1
|
34
|
+
end
|
35
|
+
|
36
|
+
stairs
|
37
|
+
end
|
38
|
+
|
39
|
+
class Stair
|
40
|
+
module From
|
41
|
+
def from lines, at: 0
|
42
|
+
at += 1 until lines[at] != "\n"
|
43
|
+
new lines, at: at
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
module Public
|
48
|
+
using SpacePrefix
|
49
|
+
|
50
|
+
attr_reader :start_at, :end_at
|
51
|
+
|
52
|
+
def space_prefix
|
53
|
+
@space_prefix ||= @lines[@start_at].space_prefix
|
54
|
+
end
|
55
|
+
|
56
|
+
def stairs
|
57
|
+
@stairs ||= []
|
58
|
+
end
|
59
|
+
|
60
|
+
def line
|
61
|
+
@line ||= @lines[@start_at].chomp.strip
|
62
|
+
end
|
63
|
+
|
64
|
+
def leaf?
|
65
|
+
stairs.empty?
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
using SpacePrefix
|
70
|
+
include Public
|
71
|
+
extend From
|
72
|
+
|
73
|
+
def initialize lines, at: 0
|
74
|
+
@start_at, @lines = at, lines
|
75
|
+
|
76
|
+
next_index = at + 1
|
77
|
+
next_line = lines[next_index]
|
78
|
+
|
79
|
+
if next_line && (next_line.space_prefix - space_prefix) == 2
|
80
|
+
until next_line.space_prefix <= space_prefix
|
81
|
+
stair = Stair.from lines, at: next_index
|
82
|
+
stairs << stair
|
83
|
+
|
84
|
+
next_index = stair.end_at + 1
|
85
|
+
next_line = lines[next_index]
|
86
|
+
break unless next_line
|
87
|
+
end
|
88
|
+
|
89
|
+
@end_at = stairs.last.end_at
|
90
|
+
else
|
91
|
+
@end_at = at
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
metadata
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: air-parse
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Anatoly Chernov
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-08-18 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email:
|
15
|
+
- chertoly@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/air/parse.rb
|
21
|
+
homepage:
|
22
|
+
licenses: []
|
23
|
+
metadata: {}
|
24
|
+
post_install_message:
|
25
|
+
rdoc_options: []
|
26
|
+
require_paths:
|
27
|
+
- lib
|
28
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
requirements: []
|
39
|
+
rubygems_version: 3.4.18
|
40
|
+
signing_key:
|
41
|
+
specification_version: 4
|
42
|
+
summary: To parse air.
|
43
|
+
test_files: []
|