def interpolate_string(string, line, column)
ss = StringScanner.new(string)
first = true
value, terminator = get_string_segment(ss, '"$')
until value.nil?
if terminator == "\""
if first
tokens << new_token(:STRING, value, value.size + 2, :line => line, :column => column)
first = false
else
line += value.scan(/(\r\n|\r|\n)/).size
token_column = column + (ss.pos - value.size)
tokens << new_token(:DQPOST, value, value.size + 1, :line => line, :column => token_column)
end
else
if first
tokens << new_token(:DQPRE, value, value.size + 1, :line => line, :column => column)
first = false
else
line += value.scan(/(\r\n|\r|\n)/).size
token_column = column + (ss.pos - value.size)
tokens << new_token(:DQMID, value, value.size, :line => line, :column => token_column)
end
if ss.scan(/\{/).nil?
var_name = ss.scan(/(::)?([\w-]+::)*[\w-]+/)
if var_name.nil?
token_column = column + ss.pos - 1
tokens << new_token(:DQMID, "$", 1, :line => line, :column => token_column)
else
token_column = column + (ss.pos - var_name.size)
tokens << new_token(:UNENC_VARIABLE, var_name, var_name.size, :line => line, :column => token_column)
end
else
contents = ss.scan_until(/\}/)[0..-2]
if contents.match(/\A(::)?([\w-]+::)*[\w-]+(\[.+?\])*/)
contents = "$#{contents}"
end
lexer = PuppetLint::Lexer.new
lexer.tokenise(contents)
lexer.tokens.each do |token|
tok_col = column + token.column + (ss.pos - contents.size - 1)
tok_line = token.line + line - 1
tokens << new_token(token.type, token.value, token.value.size, :line => tok_line, :column => tok_col)
end
end
end
value, terminator = get_string_segment(ss, '"$')
end
end