mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-02-03 17:00:05 +08:00
622 lines
9.0 KiB
Ruby
622 lines
9.0 KiB
Ruby
|
#!/usr/bin/env ruby
|
|||
|
|
|||
|
arg = ARGV.pop
|
|||
|
|
|||
|
|
|||
|
# Usage example:
|
|||
|
#
|
|||
|
# ./etc/examples/generators/syntax.rb %Q > etc/examples/syntax/Q.rb
|
|||
|
#
|
|||
|
# then read the output file with 'foldlevel' 0
|
|||
|
|
|||
|
puts "# Generated by `" <<
|
|||
|
"./etc/examples/generators/syntax.rb #{arg}" <<
|
|||
|
" > etc/examples/syntax/#{arg.sub('%', '')}.rb" <<
|
|||
|
"`\n\n"
|
|||
|
|
|||
|
|
|||
|
|
|||
|
# %Q {{{
|
|||
|
# Generalized Double Quoted String and Array of Strings and Shell Command Output
|
|||
|
if arg == '%Q'
|
|||
|
# Note: %= is not matched here as the beginning of a double quoted string
|
|||
|
%Q[~`!@\#$%^&*_-+|:;"',.?/].split(//).each do |s|
|
|||
|
puts <<-END.gsub(/^\s{4}/, '')
|
|||
|
%#{s}
|
|||
|
foo
|
|||
|
\\#{s}
|
|||
|
\\\\\\#{s}
|
|||
|
bar
|
|||
|
#{s}
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
|
|||
|
%w(Q W x).each do |leading|
|
|||
|
%Q[~`!@\#$%^&*_-+=|:;"',.?/].split(//).each do |s|
|
|||
|
puts <<-END.gsub(/^\s{6}/, '')
|
|||
|
%#{leading}#{s}
|
|||
|
foo
|
|||
|
\\#{s}
|
|||
|
\\\\\\#{s}
|
|||
|
bar
|
|||
|
#{s}
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
|
|||
|
%w({} <> [] ()).each do |pair|
|
|||
|
puts <<-END.gsub(/^\s{6}/, '')
|
|||
|
%#{leading}#{pair[0]}
|
|||
|
foo
|
|||
|
\\#{pair[1]}
|
|||
|
\\\\\\#{pair[1]}
|
|||
|
bar
|
|||
|
#{pair[1]}
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
|
|||
|
puts " %#{leading} foo\\ \\\\\\ bar\nbaz \n\n" unless leading == 'W'
|
|||
|
end
|
|||
|
end
|
|||
|
# }}}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
# %q {{{
|
|||
|
# Generalized Single Quoted String, Symbol and Array of Strings
|
|||
|
if arg == '%q'
|
|||
|
%w(q w s).each do |leading|
|
|||
|
%Q[~`!@\#$%^&*_-+=|:;"',.?/].split(//).each do |s|
|
|||
|
puts <<-END.gsub(/^\s{6}/, '')
|
|||
|
%#{leading}#{s}
|
|||
|
foo
|
|||
|
\\#{s}
|
|||
|
\\\\\\#{s}
|
|||
|
bar
|
|||
|
#{s}
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
|
|||
|
%w({} <> [] ()).each do |pair|
|
|||
|
puts <<-END.gsub(/^\s{6}/, '')
|
|||
|
%#{leading}#{pair[0]}
|
|||
|
foo
|
|||
|
\\#{pair[1]}
|
|||
|
\\\\\\#{pair[1]}
|
|||
|
bar
|
|||
|
#{pair[1]}
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
|
|||
|
puts " %#{leading} foo\\ \\\\\\ bar\nbaz \n\n" unless leading == 'w'
|
|||
|
end
|
|||
|
end
|
|||
|
# }}}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
# %r {{{
|
|||
|
# Generalized Regular Expression
|
|||
|
if arg == '%r'
|
|||
|
%Q[~`!@\#$%^&*_-+=|:;"',.?/].split(//).each do |s|
|
|||
|
puts <<-END.gsub(/^\s{4}/, '')
|
|||
|
%r#{s}
|
|||
|
foo
|
|||
|
\\#{s}
|
|||
|
\\\\\\#{s}
|
|||
|
bar
|
|||
|
#{s}
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
|
|||
|
puts " %r foo\\ \\\\\\ bar\nbaz \n\n"
|
|||
|
|
|||
|
%w({} <> [] ()).each do |pair|
|
|||
|
puts <<-END.gsub(/^\s{4}/, '')
|
|||
|
%r#{pair[0]}
|
|||
|
foo
|
|||
|
\\#{pair[1]}
|
|||
|
\\\\\\#{pair[1]}
|
|||
|
bar
|
|||
|
#{pair[1]}
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
end
|
|||
|
# }}}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
# %i / %I {{{
|
|||
|
# Array of Symbols
|
|||
|
# Array of interpolated Symbols
|
|||
|
if %w(%i %I).include?(arg)
|
|||
|
%w(i I).each do |leading|
|
|||
|
%Q[~`!@\#$%^&*_-+=|:;"',.?/].split(//).each do |s|
|
|||
|
puts <<-END.gsub(/^\s{6}/, '')
|
|||
|
%#{leading}#{s}
|
|||
|
foo
|
|||
|
\\#{s}
|
|||
|
\\\\\\#{s}
|
|||
|
bar
|
|||
|
#{s}
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
|
|||
|
%w({} <> [] ()).each do |pair|
|
|||
|
puts <<-END.gsub(/^\s{6}/, '')
|
|||
|
%#{leading}#{pair[0]}
|
|||
|
foo
|
|||
|
\\#{pair[1]}
|
|||
|
\\\\\\#{pair[1]}
|
|||
|
bar
|
|||
|
#{pair[1]}
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
# }}}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
# string {{{
|
|||
|
# Normal String and Shell Command Output
|
|||
|
if arg == 'string'
|
|||
|
%w(' " `).each do |quote|
|
|||
|
puts <<-END.gsub(/^\s{4}/, '')
|
|||
|
#{quote}
|
|||
|
foo
|
|||
|
\\#{quote}
|
|||
|
\\\\\\#{quote}
|
|||
|
bar
|
|||
|
#{quote}
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
end
|
|||
|
# }}}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
# regex (Normal Regular Expression) {{{
|
|||
|
if arg == 'regexp'
|
|||
|
'iomxneus'.split('').unshift('').each do |option|
|
|||
|
puts "\n# Begin test for option '#{option}' {{{\n\n"
|
|||
|
|
|||
|
puts <<-END.gsub(/^\s{4}/, '')
|
|||
|
/
|
|||
|
foo
|
|||
|
\\\/
|
|||
|
\\\\\\\/
|
|||
|
bar
|
|||
|
/#{option}
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
|
|||
|
%w(and or while until unless if elsif when not then else).each do |s|
|
|||
|
puts <<-END.gsub(/^\s{6}/, '')
|
|||
|
#{s}/
|
|||
|
foo
|
|||
|
\\\/
|
|||
|
\\\\\\\/
|
|||
|
bar
|
|||
|
/#{option}
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
|
|||
|
%w(; \ ~ = ! | \( & , { [ < > ? : * + -).each do |s|
|
|||
|
puts <<-END.gsub(/^\s{6}/, '')
|
|||
|
#{s}/
|
|||
|
foo
|
|||
|
\\\/
|
|||
|
\\\\\\\/
|
|||
|
bar
|
|||
|
/#{option}
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
|
|||
|
[' ', "\t", '=', 'OK'].each do |s|
|
|||
|
puts <<-END.gsub(/^\s{6}/, '')
|
|||
|
_foo /#{s}
|
|||
|
foo
|
|||
|
\\\/
|
|||
|
\\\\\\\/
|
|||
|
bar
|
|||
|
/#{option}
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
|
|||
|
puts "# }}} End test for option '#{option}'\n"
|
|||
|
end
|
|||
|
|
|||
|
puts "\n# Test for ternary operation (8c1c484) {{{\n\n"
|
|||
|
puts 'yo = 4 ? /quack#{3}/ : /quack/'
|
|||
|
puts "\n# }}} End test for ternary operation\n"
|
|||
|
end
|
|||
|
# }}}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
# symbol {{{
|
|||
|
# Symbol region
|
|||
|
if arg == 'symbol'
|
|||
|
%w(' ").each do |quote|
|
|||
|
%Q_]})\"':_.split(//).unshift('').each do |s|
|
|||
|
puts <<-END.gsub(/^\s{6}/, '')
|
|||
|
#{s}:#{quote}
|
|||
|
foo
|
|||
|
\\#{quote}
|
|||
|
\\\\\\#{quote}
|
|||
|
bar
|
|||
|
#{quote}
|
|||
|
#{" #{s} # close string to ensure next case clean" if %w(' ").include?(s) && s != quote }
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
# }}}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
# heredoc {{{
|
|||
|
# Here Documents
|
|||
|
if arg == 'heredoc'
|
|||
|
puts "\n# Begin of valid cases {{{\n\n"
|
|||
|
|
|||
|
%w(' " `).unshift('').each do |quote|
|
|||
|
puts <<-END.gsub(/^\s{6}/, '')
|
|||
|
<<#{quote}_LABEL#{quote}.?!, foo
|
|||
|
bar baz
|
|||
|
_LABEL
|
|||
|
\n
|
|||
|
|
|||
|
<<-#{quote}_LABEL#{quote}.?!, foo
|
|||
|
bar baz
|
|||
|
_LABEL
|
|||
|
\n
|
|||
|
|
|||
|
<<~#{quote}_LABEL#{quote}.?!, foo
|
|||
|
bar baz
|
|||
|
_LABEL
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
|
|||
|
puts "# }}} End of valid cases'\n\n"
|
|||
|
|
|||
|
|
|||
|
puts "\n# Begin of INVALID cases {{{\n\n"
|
|||
|
|
|||
|
# NOTE: for simplification, omit test for different quotes " ' `,
|
|||
|
# they are all invalid anyway
|
|||
|
|
|||
|
%w(class ::).each do |s|
|
|||
|
puts <<-END.gsub(/^\s{6}/, '')
|
|||
|
#{s}\n <<LABEL
|
|||
|
foo
|
|||
|
LABEL
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
|
|||
|
%Q_]})\"'._.split(//).each do |s|
|
|||
|
puts <<-END.gsub(/^\s{4}/, '')
|
|||
|
#{s} <<LABEL
|
|||
|
foo
|
|||
|
LABEL
|
|||
|
#{" #{s} # close to ensure next case clean" if %w(' ").include?(s)}
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
|
|||
|
%w(09 aZ _w).each do |s|
|
|||
|
puts <<-END.gsub(/^\s{6}/, '')
|
|||
|
#{s}<<LABEL
|
|||
|
foo
|
|||
|
LABEL
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
|
|||
|
%w(' " `).unshift('').each do |quote|
|
|||
|
puts <<-END.gsub(/^\s{6}/, '')
|
|||
|
<<LABEL foo<<#{quote}_bar
|
|||
|
baz
|
|||
|
LABEL
|
|||
|
#{" #{quote} # close to ensure next case clean" if %w(' ").include?(quote)}
|
|||
|
\n
|
|||
|
|
|||
|
<<LABEL foo<<-#{quote}_bar
|
|||
|
baz
|
|||
|
LABEL
|
|||
|
#{" #{quote} # close to ensure next case clean" if %w(' ").include?(quote)}
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
|
|||
|
puts "# }}} End of INVALID cases'\n\n"
|
|||
|
end
|
|||
|
# }}}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
# blocks {{{
|
|||
|
# simple blocks (def, class, module, do, begin, case)
|
|||
|
if arg == 'blocks'
|
|||
|
puts <<-END.gsub(/^\s{4}/, '')
|
|||
|
def
|
|||
|
foo
|
|||
|
def
|
|||
|
bar
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
|
|||
|
%w(class module do begin case).each do |s|
|
|||
|
puts <<-END.gsub(/^\s{6}/, '')
|
|||
|
#{s}
|
|||
|
foo
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
end
|
|||
|
# }}}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
# brackets {{{
|
|||
|
# curly bracket block and hash literal
|
|||
|
if arg == 'brackets'
|
|||
|
puts <<-END.gsub(/^\s{4}/, '')
|
|||
|
{
|
|||
|
foo
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
|
|||
|
%w<_xxx ] } )>.unshift('').each do |s|
|
|||
|
puts <<-END.gsub(/^\s{6}/, '')
|
|||
|
#{s}[
|
|||
|
foo
|
|||
|
]
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
end
|
|||
|
# }}}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
# if {{{
|
|||
|
# if/else blocks
|
|||
|
if arg == 'if'
|
|||
|
%w(if unless).each do |start|
|
|||
|
puts <<-END.gsub(/^ {6}/, '')
|
|||
|
#{start} 1
|
|||
|
foo
|
|||
|
else
|
|||
|
bar
|
|||
|
end
|
|||
|
|
|||
|
foo \\
|
|||
|
#{start} 1
|
|||
|
foo
|
|||
|
else
|
|||
|
bar
|
|||
|
end
|
|||
|
|
|||
|
baz ...= #{start} 1
|
|||
|
foo
|
|||
|
else
|
|||
|
bar
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
|
|||
|
['?', '!'].each do |mark|
|
|||
|
puts <<-END.gsub(/^ {8}/, '')
|
|||
|
42foo#{mark} #{start} 1
|
|||
|
bar
|
|||
|
else
|
|||
|
baz
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
|
|||
|
'{:,;([<>~\*%&^|+=-'.split(//).each do |expr|
|
|||
|
puts <<-END.gsub(/^ {8}/, '')
|
|||
|
foo #{expr} #{start} 1
|
|||
|
bar
|
|||
|
else
|
|||
|
baz
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
|
|||
|
# c7cb532 match correct `end`
|
|||
|
puts <<-END.gsub(/^ {6}/, '')
|
|||
|
#{start} 1
|
|||
|
(1..5).end
|
|||
|
:: end
|
|||
|
end
|
|||
|
|
|||
|
#{start} 1
|
|||
|
..end
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
|
|||
|
# INVALID cases
|
|||
|
puts <<-END.gsub(/^ {6}/, '')
|
|||
|
not_BOF #{start} 1
|
|||
|
bar
|
|||
|
else
|
|||
|
baz
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
|
|||
|
['?', '!'].each do |mark|
|
|||
|
puts <<-END.gsub(/^ {8}/, '')
|
|||
|
_foo#{mark} #{start} 1
|
|||
|
bar
|
|||
|
else
|
|||
|
baz
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
# }}}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
# for {{{
|
|||
|
# rubyRepeatExpression (for, while, until)
|
|||
|
if arg == 'for'
|
|||
|
puts <<-END.gsub(/^ {4}/, '')
|
|||
|
for 1
|
|||
|
foo
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
|
|||
|
%w(until while).each do |start|
|
|||
|
puts <<-END.gsub(/^ {6}/, '')
|
|||
|
#{start} 1
|
|||
|
foo
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
baz ...= #{start} 1
|
|||
|
foo
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
|
|||
|
'{:,;([<>~\*/%&^|+-'.split(//).each do |expr|
|
|||
|
puts <<-END.gsub(/^ {8}/, '')
|
|||
|
foo #{expr} #{start} 1
|
|||
|
bar
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
|
|||
|
# INVALID cases
|
|||
|
puts <<-END.gsub(/^ {6}/, '')
|
|||
|
not_BOF #{start} 1
|
|||
|
bar
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
|
|||
|
['?', '!'].each do |mark|
|
|||
|
puts <<-END.gsub(/^ {8}/, '')
|
|||
|
_foo#{mark} #{start} 1
|
|||
|
bar
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
# }}}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
# comment {{{
|
|||
|
if arg == 'comment'
|
|||
|
puts <<-END.gsub(/^ {4}/, '')
|
|||
|
# foo
|
|||
|
# foo
|
|||
|
# bar
|
|||
|
|
|||
|
baz
|
|||
|
|
|||
|
|
|||
|
|
|||
|
=begin foo bar
|
|||
|
comment
|
|||
|
=end baz
|
|||
|
|
|||
|
|
|||
|
END
|
|||
|
end
|
|||
|
# }}}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
# __END__ {{{
|
|||
|
if arg == '__END__'
|
|||
|
puts <<-EOF.gsub(/^ {4}/, '')
|
|||
|
__END__
|
|||
|
invalid
|
|||
|
invalid
|
|||
|
|
|||
|
|
|||
|
__END__
|
|||
|
valid
|
|||
|
valid
|
|||
|
|
|||
|
|
|||
|
EOF
|
|||
|
end
|
|||
|
# }}}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
puts "#\svim:foldmethod=syntax"
|
|||
|
|
|||
|
|
|||
|
# vim:foldmethod=marker
|