1+ require 'junoser'
2+ require 'parslet'
3+
4+ module Junoser
5+ class DeleteTransformer < Parslet ::Transform
6+ rule ( config : simple ( :config ) ) do
7+ "(#{ config . to_s } .*"
8+ end
9+
10+ rule ( config : sequence ( :configs ) ) do
11+ configs . join ( "\n " )
12+ end
13+
14+ rule ( arg : simple ( :arg ) ) do
15+ arg
16+ end
17+
18+ rule ( label : simple ( :label ) ) do
19+ ")#{ Regexp . escape ( label . to_s ) } "
20+ end
21+
22+ rule ( label : simple ( :label ) , child : simple ( :child ) ) do
23+ "#{ Regexp . escape ( label . to_s ) } #{ child } "
24+ end
25+
26+ rule ( label : simple ( :label ) , child : sequence ( :children ) ) do
27+ %[#{ Regexp . escape ( label . to_s ) } #{ children . join ( ' ' ) } ]
28+ end
29+
30+ rule ( statement : simple ( :statement ) , argument : simple ( :argument ) ) do
31+ "#{ statement } #{ argument } "
32+ end
33+
34+ rule ( statement : simple ( :statement ) , argument : sequence ( :arguments ) ) do
35+ %[#{ statement } #{ arguments . join ( ' ' ) } ]
36+ end
37+
38+ rule ( oneline : simple ( :str ) ) do
39+ str
40+ end
41+
42+ rule ( oneline : sequence ( :strs ) ) do
43+ strs . join ( ' ' )
44+ end
45+ end
46+
47+ class Squash
48+ def initialize ( io_or_string )
49+ @input = io_or_string
50+ @lines = [ ]
51+ @parser = Junoser ::Parser . new
52+ @transformer = DeleteTransformer . new
53+ end
54+
55+ def transform
56+ config = Junoser ::Input . new ( @input ) . read . split ( "\n " )
57+ config . each do |l |
58+ l . strip!
59+ case l
60+ when /^set /
61+ @lines << l
62+ when /^delete /
63+ to_delete = @parser . parse ( l . gsub ( /^delete / , 'set ' ) )
64+ delete_lines @transformer . apply ( to_delete )
65+ end
66+ end
67+
68+ @lines . uniq!
69+ remove_subcommand ( @lines ) . map ( &:strip ) . join ( "\n " )
70+ end
71+
72+ private
73+
74+ def remove_subcommand ( lines )
75+ lines . each_with_index do |l , i |
76+ lines [ i ..-1 ] . each do |l2 |
77+ if l . include? ( l2 ) and l != l2
78+ lines . delete ( l2 )
79+ end
80+ end
81+ end
82+ end
83+
84+ def delete_lines ( pattern )
85+ @lines . each do |l |
86+ l . sub! ( /#{ pattern } / ) { $1 }
87+ end
88+ end
89+ end
90+ end
0 commit comments