# TITLE: # # String Bracketing Extensoins # # SUMMARY: # # String extension methods which enclose on unenclose a striong. # # CREDITS: # # - Thomas Sawyer # class String BRA2KET = { '['=>']', '('=>')', '{'=>'}', '<'=>'>' } # Return a new string embraced by given brakets. # If only one bracket char is given it will be placed # on either side. # # "wrap me".bracket('{') #=> "{wrap me}" # "wrap me".bracket('--','!') #=> "--wrap me!" def bracket(bra, ket=nil) #ket = String.bra2ket[$&] if ! ket && /^[\[({<]$/ =~ bra ket = BRA2KET[bra] unless ket "#{bra}#{self}#{ket ? ket : bra}" end # Inplace version of #braket. def bracket!(bra, ket=nil) self.replace(bracket(bra, ket)) end # Return a new string embraced by given brakets. # If only one bracket char is given it will be placed # on either side. # # "{unwrap me}".debracket('{') #=> "unwrap me" # "--unwrap me!".debracket('--','!') #=> "unwrap me!" def unbracket(bra=nil, ket=nil) if bra ket = BRA2KET[bra] unless ket ket = ket ? ket : bra s = self.dup s.gsub!(%r[^#{Regexp.escape(bra)}], '') s.gsub!(%r[#{Regexp.escape(ket)}$], '') return s else if m = BRA2KET[ self[0,1] ] return self.slice(1...-1) if self[-1,1] == m end end return self.dup # if nothing else end # Inplace version of #debraket. def unbracket!(bra=nil, ket=nil) self.replace( unbracket(bra, ket) ) end # Return a new string embraced by given quotes. # If no quotes are specified, then assumes single quotes. # # "quote me".quote #=> "'quote me'" # "quote me".quote(2) #=> "\"quote me\"" def quote(type=:s) case type.to_s.downcase when 's', 'single' bracket("'") when 'd', 'double' bracket('"') when 'b', 'back' bracket('`') else bracket("'") end end # Remove quotes from string. def dequote s = self.dup case self[0,1] when "'", '"', '`' s[0] = '' end case self[-1,1] when "'", '"', '`' s[-1] = '' end return s end end # _____ _ # |_ _|__ ___| |_ # | |/ _ \/ __| __| # | | __/\__ \ |_ # |_|\___||___/\__| # =begin test require 'test/unit' class TestStringBracket < Test::Unit::TestCase def test_bracket assert_equal( '#X#', 'X'.bracket('#') ) assert_equal( 'xX!', 'X'.bracket('x','!') ) assert_equal( '{X}', 'X'.bracket('{','}') ) assert_equal( '', 'X'.bracket('<') ) assert_equal( '(X)', 'X'.bracket('(') ) assert_equal( '[X]', 'X'.bracket('[') ) assert_equal( '{X}', 'X'.bracket('{') ) end def test_braket! a = 'X' ; a.bracket!('#') assert_equal( '#X#', a ) a = 'X' ; a.bracket!('x','!') assert_equal( 'xX!', a ) a = 'X' ; a.bracket!('{','}') assert_equal( '{X}', a ) a = 'X' ; a.bracket!('<') assert_equal( '', a ) a = 'X' ; a.bracket!('(') assert_equal( '(X)', a ) a = 'X' ; a.bracket!('[') assert_equal( '[X]', a ) a = 'X' ; a.bracket!('{') assert_equal( '{X}', a ) end def test_quote_01 a = "hi" assert_raises( ArgumentError ) { a.quote(1,2) } end def test_quote_02 a = "hi" assert_equal( %{'hi'}, a.quote ) end def test_quote_03 a = "hi" assert_equal( %{"hi"}, a.quote(:d) ) assert_equal( %{"hi"}, a.quote(:double) ) end def test_quote_04 a = "hi" assert_equal( %{'hi'}, a.quote(:s) ) assert_equal( %{'hi'}, a.quote(:single) ) end def test_quote_05 a = "hi" assert_equal( %{`hi`}, a.quote(:b) ) assert_equal( %{`hi`}, a.quote(:back) ) end end =end