2013-10-11 13 views
5

Ruby 2.0, Yaml używający Psych wydaje się mieć problem z wydostaniem się z podwójnego cudzysłowu. Czy ktoś ma pomysł na rozwiązanie tego problemu?YAML: błąd parsujący ciąg znaków z podwójnym podwójnym apostrofem

data_ =<<END_ 
description: "Acme acquires ILM: Lucas says \"Inevitable!\"" 
END_ 

ap YAML.load(data_) 

produkuje

/Users/x/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych.rb:205:in `parse': (<unknown>): did not find expected key while parsing a block mapping at line 1 column 1 (Psych::SyntaxError)  

Uciekając wpis z apostrofami działa, ale jeśli zawiera apostrofów, uciekając im wyniki w błąd, zbyt.

description: 'Acme acquires ILM: Lucas says "It\'s Inevitable!"' 

W idealnym świecie, wpisy będą zawierać odpowiednie cytaty unicode typograficzne, ale nie mam kontroli nad tymi (choć mogę je wymienić przed przetworzeniem z YAML) ...

pomysłów o tym, czy YAML poprawnie to przeanalizuje?

Aktualizacja: odpowiadanie na moje pytanie. Okazało się, że jest możliwe, aby uciec apostrof przez powielenie go, tak to działa:

description: 'Acme acquires ILM: Lucas says "It''s Inevitable!"' 

odkryłem to za pomocą YAML.dump (the-życzenia-string)

Odpowiedz

7

Twój problem polega na tym heredocs zachowują się jak podwójne cudzysłowy, jeśli chodzi o ucieczkę. Oznacza to, że \" w twoim heredoc kończy się jako " w twoim ciągu. Przestrzegać:

>> data_ =<<END_ 
description: "Acme acquires ILM: Lucas says \"Inevitable!\"" 
END_ 
>> puts data_ 
description: "Acme acquires ILM: Lucas says "Inevitable!"" 

Chcesz uzyskać \ w ciągu YAML więc będziesz musiał uciec:

data_ =<<END_ 
description: "Acme acquires ILM: Lucas says \\"Inevitable!\\"" 
END_ 

Alternatywnie, użyj %q{...} zacytować swój ciąg tak, że zachowuje się bardziej jak pojedynczy ciąg cytowany:

data_ = %q{ 
description: "Acme acquires ILM: Lucas says \"Inevitable!\"" 
} 
+0

A-ha! Więc szukałem w niewłaściwym miejscu. Dziękuję Ci! – aaandre

+0

Najprawdopodobniej zbuduję strukturę, która ma być obiektami Ruby, a następnie 'to_yaml', aby uzyskać ciąg znaków, mniej cytując bzdury, aby się tym martwić. –