Pertanyaan Di YAML, bagaimana cara memutus string melalui beberapa baris?


Di YAML, saya memiliki string yang sangat panjang. Saya ingin menyimpan ini dalam tampilan 80-kolom (atau lebih) dari editor saya, jadi saya ingin mematahkan string. Apa sintaksnya untuk ini?

Dengan kata lain, saya punya ini:

Key: 'this is my very very very very very very long string'

dan saya ingin memiliki ini (atau sesuatu untuk efek ini):

Key: 'this is my very very very ' +
     'long string'

Saya ingin menggunakan tanda kutip seperti di atas, jadi saya tidak perlu melarikan diri apa pun dalam string.


934
2017-09-24 19:47


asal


Jawaban:


Menggunakan gaya dilipat yaml, setiap jeda baris diganti dengan spasi. Indentasi di setiap baris akan diabaikan.

>
  This is a very long sentence
  that spans several lines in the YAML
  but which will be rendered as a string
  without carriage returns.

http://symfony.com/doc/current/components/yaml/yaml_format.html


535
2017-09-24 19:54



Ada 5  6  SEMBILAN (atau 63 *, tergantung bagaimana Anda menghitung) cara yang berbeda untuk menulis string multi-baris dalam YAML.

Blok gaya skalar (>, |)

Ini memungkinkan karakter seperti \ dan " tanpa melarikan diri, dan tambahkan baris baru (\n) ke ujung string Anda.

>  Gaya dilipat menghapus baris baru tunggal dalam string (tetapi menambahkan satu di bagian akhir, dan mengubah baris baru ganda menjadi single):

Key: >
  this is my very very very
  long string

this is my very very very long string\n

|  Gaya harfiah mengubah setiap baris baru di dalam string menjadi baris baru, dan menambahkan satu di akhir:

Key: |
  this is my very very very 
  long string

this is my very very very\nlong string\n

Inilah definisi resmi dari YAML Spec 1.2

Konten skalar dapat ditulis dalam notasi blok, menggunakan gaya literal (ditunjukkan oleh "|") di mana semua jeda baris signifikan. Alternatifnya, mereka dapat ditulis dengan gaya terlipat (dilambangkan dengan ">") di mana setiap jeda baris dilipat ke ruang kecuali berakhir baris kosong atau lebih-indentasi.

Blok gaya dengan indikator pencekikan blok (>-, |-, >+, |+)

Anda dapat mengontrol penanganan baris baru akhir dalam string, dan setiap baris kosong di belakang (\n\n) dengan menambahkan blok indikator mengunyah karakter:

  • >, |: "klip": simpan feed baris, hapus garis kosong di belakangnya.
  • >-, |-: "strip": hapus feed baris, hapus garis kosong di belakangnya.
  • >+, |+: "keep": simpan feed baris, teruskan garis kosong.

"Aliran" gaya skalar (, ", ')

Ini telah terbatas melarikan diri, dan membangun string single-line tanpa karakter baris baru. Mereka dapat memulai pada baris yang sama dengan kunci, atau dengan tambahan baris baru terlebih dahulu.

gaya polos (tidak melarikan diri, tidak # atau : kombinasi, batas pada karakter pertama):

Key: this is my very very very 
  long string

gaya yang dikutip ganda (\ dan " harus lolos \, baris baru dapat disisipkan dengan literal \n urutan, garis dapat digabung tanpa spasi dengan trailing \):

Key: "this is my very very \"very\" loooo\
  ng string.\n\nLove, YAML."

"this is my very very \"very\" loooong string.\n\nLove, YAML."

gaya yang dikutip tunggal (harfiah ' harus digandakan, tidak ada karakter khusus, mungkin berguna untuk mengekspresikan string yang dimulai dengan tanda kutip ganda):

Key: 'this is my very very "very"
  long string, isn''t it.'

"this is my very very \"very\" long string, isn't it."

Ringkasan

Di tabel ini, _ cara space character. \n berarti "karakter baris baru" (\n di JavaScript), kecuali untuk baris "baris inline", di mana itu berarti secara harfiah backslash dan n).

                      >     |            "     '     >-     >+     |-     |+
-------------------------|------|-----|-----|-----|------|------|------|------  
Trailing spaces   | Kept | Kept |     |     |     | Kept | Kept | Kept | Kept
Single newline => | _    | \n   | _   | _   | _   | _    |  _   | \n   | \n
Double newline => | \n   | \n\n | \n  | \n  | \n  | \n   |  \n  | \n\n | \n\n
Final newline  => | \n   | \n   |     |     |     |      |  \n  |      | \n
Final dbl nl's => |      |      |     |     |     |      | Kept |      | Kept  
In-line newlines  | No   | No   | No  | \n  | No  | No   | No   | No   | No
Spaceless newlines| No   | No   | No  | \   | No  | No   | No   | No   | No 
Single quote      | '    | '    | '   | '   | ''  | '    | '    | '    | '
Double quote      | "    | "    | "   | \"  | "   | "    | "    | "    | "
Backslash         | \    | \    | \   | \\  | \   | \    | \    | \    | \
" #", ": "        | Ok   | Ok   | No  | Ok  | Ok  | Ok   | Ok   | Ok   | Ok
Can start on same | No   | No   | Yes | Yes | Yes | No   | No   | No   | No
line as key       |

Contoh

Perhatikan spasi tambahan pada garis sebelum "spasi."

- >
  very "long"
  'string' with

  paragraph gap, \n and        
  spaces.
- | 
  very "long"
  'string' with

  paragraph gap, \n and        
  spaces.
- very "long"
  'string' with

  paragraph gap, \n and        
  spaces.
- "very \"long\"
  'string' with

  paragraph gap, \n and        
  s\
  p\
  a\
  c\
  e\
  s."
- 'very "long"
  ''string'' with

  paragraph gap, \n and        
  spaces.'
- >- 
  very "long"
  'string' with

  paragraph gap, \n and        
  spaces.

[
  "very \"long\" 'string' with\nparagraph gap, \\n and         spaces.\n", 
  "very \"long\"\n'string' with\n\nparagraph gap, \\n and        \nspaces.\n", 
  "very \"long\" 'string' with\nparagraph gap, \\n and spaces.", 
  "very \"long\" 'string' with\nparagraph gap, \n and spaces.", 
  "very \"long\" 'string' with\nparagraph gap, \\n and spaces.", 
  "very \"long\" 'string' with\nparagraph gap, \\n and         spaces."
]

Blok gaya dengan indikator indentasi

Untuk jaga-jaga hal di atas tidak cukup untuk Anda, Anda dapat menambahkan "indentasi blok indikator"(setelah indikator chomping blok Anda, jika Anda memilikinya):

- >8
        My long string
        starts over here
- |+1
 This one
 starts here

Tambahan

Jika Anda memasukkan spasi ekstra di awal garis tidak-yang-pertama dalam gaya Dilipat, mereka akan disimpan, dengan bonus baris baru. Ini tidak terjadi dengan gaya aliran:

- >
    my long
      string
- my long
    string

["my long\n string\n", "my long string"]

Saya bahkan tidak bisa.

*2 gaya blok, masing-masing dengan 2 indikator pencekalan blok yang mungkin (atau tidak ada), dan dengan 9 indikator indentasi yang mungkin (atau tidak ada), 1 gaya polos dan 2 gaya kutip: 2 x (2 + 1) x (9 + 1) + 1 + 2 = 63

Beberapa dari informasi ini juga telah dirangkum sini.


2230
2018-02-11 10:27



Untuk melestarikan baris baru menggunakan |, sebagai contoh:

|
  This is a very long sentence
  that spans several lines in the YAML
  but which will be rendered as a string
  with newlines preserved.

diterjemahkan ke "Ini adalah kalimat yang sangat panjang"\ n yang membentang beberapa garis dalam YAML‌\ n tetapi yang akan diterjemahkan sebagai string‌\ n dengan baris baru yang diawetkan. "


149
2018-03-12 15:28



Anda mungkin tidak mempercayainya, tetapi YAML juga dapat melakukan kunci multi-baris:

?
 >
 multi
 line
 key
:
  value

34
2017-10-24 21:17



1. Notasi Blok:  Baris baru menjadi spasi dan tambahan baris baru setelah blok dihapus

---
# Note: it has 1 new line after the string
content:
    Arbitrary free text
    over multiple lines stopping
    after indentation changes...

...

Setara JSON

{
 "content": "Arbitrary free text over multiple lines stopping after indentation changes..."
}

2. Literal Block Scalar:  Skalar Blok Literal | akan menyertakan baris baru dan spasi tambahan. tetapi menghapus ekstra

baris baru setelah blokir.

---
# After string we have 2 spaces and 2 new lines
content1: |
 Arbitrary free text
 over "multiple lines" stopping
 after indentation changes...  


...

Setara JSON

{
 "content1": "Arbitrary free text\nover \"multiple lines\" stopping\nafter indentation changes...  \n"
}

3. Indikator + dengan Skalar Blok Literal: simpan tambahan baris baru setelah pemblokiran

---
# After string we have 2 new lines
plain: |+
 This unquoted scalar
 spans many lines.


...

Setara JSON

{
 "plain": "This unquoted scalar\nspans many lines.\n\n\n"
}

4. - indikator dengan Skalar Blok Literal: - berarti baris baru di akhir string dihapus.

---
# After string we have 2 new lines
plain: |-
 This unquoted scalar
 spans many lines.


...

Setara JSON

{
 "plain": "This unquoted scalar\nspans many lines."
}

5. Dilipat Blok Skalar (>):

akan melipat baris baru ke spasi dan menghapus tambahan baris baru setelah pemblokiran.

---
folded_newlines: >
 this is really a
 single line of text
 despite appearances


...

Setara JSON

{
 "fold_newlines": "this is really a single line of text despite appearances\n"
}

untuk lebih lanjut Anda dapat mengunjungi saya blog


30
2018-04-06 05:08



Untuk menggabungkan garis panjang tanpa spasi, gunakan tanda kutip ganda dan hindari baris baru dengan garis miring terbalik:

key: "Loremipsumdolorsitamet,consecteturadipiscingelit,seddoeiusmodtemp\
  orincididuntutlaboreetdoloremagnaaliqua."

(Terima kasih @Tobia)


22
2018-04-11 19:39



Jika Anda menggunakan yml dan Twig untuk terjemahan di Symfony, dan ingin menggunakan terjemahan multi-baris di Javascript, pengembalian carriage ditambahkan tepat setelah terjemahan. Jadi, bahkan kode berikut:

var javascriptVariable = "{{- 'key'|trans -}}";

Yang memiliki terjemahan yml berikut:

key: >
    This is a
    multi line 
    translation.

Masih akan menghasilkan kode berikut di html:

var javascriptVariable = "This is a multi line translation.
";

Jadi, tanda minus di Twig tidak menyelesaikan ini. Solusinya adalah dengan menambahkan tanda minus ini setelah lebih besar dari tanda di yml:

key: >-
    This is a
    multi line 
    translation.

Akan memiliki hasil yang tepat, terjemahan multi-baris pada satu baris di Twig:

var javascriptVariable = "This is a multi line translation.";

15
2018-05-06 15:02



Untuk situasi yang string mungkin berisi spasi atau tidak, saya lebih suka tanda kutip ganda dan garis lanjutan dengan garis miring terbalik:

key: "String \
  with long c\
  ontent"

Tetapi perhatikan tentang jebakan untuk kasus bahwa garis kelanjutan dimulai dengan spasi, itu perlu diloloskan (karena akan dilucuti di tempat lain):

key: "String\
  \ with lon\
  g content"

Jika string berisi jeda baris, ini harus ditulis dalam gaya C \n.

Lihat juga pertanyaan ini.


5
2017-09-06 08:13