2016-06-17 3 views
1

При создании блога с использованием django я понял, что было бы очень удобно хранить текст статьи и всю связанную информацию (название, автор и т. Д.) Вместе в формат, читаемый человеком, и затем загружать эти файлы в базу данных с помощью простого сценария.Отдельный YAML и простой текст в том же документе

Теперь, когда сказал, YAML привлекло мое внимание к его читаемости и простоты использования, единственным недостатком синтаксиса YAML является отступы:

--- 
title: Title of the article 
author: Somebody 
# Other stuffs here ... 
text:| 
    This is the text of the article. I can write whatever I want 
    but I need to be careful with the indentation...and this is a 
    bit boring. 
--- 

Я считаю, что это не самое лучшее решение (особенно если файлы будут написаны случайными пользователями). Формат, подобный этому, может быть намного лучше

--- 
title: Title of the article 
author: Somebody 
# Other stuffs here ... 
--- 
Here there is the text of the article, it is not valid YAML but 
just plain text. Here I could put **Markdown** or <html>...or whatever 
I want... 

Есть ли решение? Предпочтительно использовать python. Другие предложения в форматах файлов приветствуются!

ответ

0

К сожалению, это не возможно, то, что можно было бы подумать мог работать использует | для скаляр в отдельном документе:

import ruamel.yaml 

yaml_str = """\ 
title: Title of the article 
author: Somebody 
--- 
| 
Here there is the text of the article, it is not valid YAML but 
just plain text. Here I could put **Markdown** or <html>...or whatever 
I want... 
""" 

for d in ruamel.yaml.load_all(yaml_str): 
    print(d) 
    print('-----') 

, но это не потому, что | является block indentation indicator. И хотя на верхнем уровне будет легко работать отступ 0 (ноль), ruamel.yaml (и PyYAML) не позволяют этого.

Это, однако, легко разобрать это самостоятельно, что имеет преимущество перед использованием пакета переднего корпуса, который вы можете использовать YAML 1.2, и не ограничивается использованием YAML 1.1 из-за использования frontmaker с помощью PyYAML. Также обратите внимание, что я использовал более подходящий конец документа маркер ... отделить YAML от уценки:

import ruamel.yaml 

combined_str = """\ 
title: Title of the article 
author: Somebody 
... 
Here there is the text of the article, it is not valid YAML but 
just plain text. Here I could put **Markdown** or <html>...or whatever 
I want... 
""" 

with open('test.yaml', 'w') as fp: 
    fp.write(combined_str) 


data = None 
lines = [] 
yaml_str = "" 
with open('test.yaml') as fp: 
    for line in fp: 
     if data is not None: 
      lines.append(line) 
      continue 
     if line == '...\n': 
      data = ruamel.yaml.round_trip_load(yaml_str) 
      continue 
     yaml_str += line 

print(data['author']) 
print(lines[2]) 

, который дает:

Somebody 
I want... 

(round_trip_load позволяет демпинг с сохранением комментариев, имен анкерных и т.д.).

Смежные вопросы