Module: SyntaxTree::Quotes
- Defined in:
- lib/syntax_tree/node.rb
Overview
Responsible for providing information about quotes to be used for strings and dynamic symbols.
Constant Summary collapse
- PAIRS =
The matching pairs of quotes that can be used with % literals.
{ "(" => ")", "[" => "]", "{" => "}", "<" => ">" }.freeze
Class Method Summary collapse
-
.locked?(node, quote) ⇒ Boolean
If there is some part of this string that matches an escape sequence or that contains the interpolation pattern (“#{”), then we are locked into whichever quote the user chose. (If they chose single quotes, then double quoting would activate the escape sequence, and if they chose double quotes, then single quotes would deactivate it.).
-
.matching(quote) ⇒ Object
Find the matching closing quote for the given opening quote.
-
.normalize(content, enclosing) ⇒ Object
Escape and unescape single and double quotes as needed to be able to enclose
content
withenclosing
.
Class Method Details
.locked?(node, quote) ⇒ Boolean
If there is some part of this string that matches an escape sequence or that contains the interpolation pattern (“#{”), then we are locked into whichever quote the user chose. (If they chose single quotes, then double quoting would activate the escape sequence, and if they chose double quotes, then single quotes would deactivate it.)
4621 4622 4623 4624 4625 |
# File 'lib/syntax_tree/node.rb', line 4621 def self.locked?(node, quote) node.parts.any? do |part| !part.is_a?(TStringContent) || part.value.match?(/\\|#[@${]|#{quote}/) end end |
.matching(quote) ⇒ Object
Find the matching closing quote for the given opening quote.
4628 4629 4630 |
# File 'lib/syntax_tree/node.rb', line 4628 def self.matching(quote) PAIRS.fetch(quote) { quote } end |
.normalize(content, enclosing) ⇒ Object
Escape and unescape single and double quotes as needed to be able to enclose content
with enclosing
.
4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 |
# File 'lib/syntax_tree/node.rb', line 4634 def self.normalize(content, enclosing) return content if enclosing != "\"" && enclosing != "'" content.gsub(/\\([\s\S])|(['"])/) do _match, escaped, quote = Regexp.last_match.to_a if quote == enclosing "\\#{quote}" elsif quote quote else "\\#{escaped}" end end end |