mirror of
1
0
Fork 0
ultimate-vim/sources_non_forked/vim-ruby/etc/examples/generators/syntax.rb

622 lines
9.0 KiB
Ruby
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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