2016-06-17 23 views
1

Während ich einen Blog mit Django erstellte, erkannte ich, dass es äußerst praktisch wäre, den Text eines Artikels und alle damit verbundenen Informationen (Titel, Autor, etc ...) zusammen zu speichern ein für Menschen lesbares Dateiformat, und laden Sie dann diese Dateien in der Datenbank mit einem einfachen Skript auf.Separate YAML und Klartext auf demselben Dokument

Nun, was gesagt, YAML meine Aufmerksamkeit für seine Lesbarkeit und Benutzerfreundlichkeit gefangen, der einzige Nachteil der YAML Syntax ist die Vertiefung:

--- 
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. 
--- 

Ich glaube, das ist nicht die beste Lösung (vor allem, wenn die Dateien werden von gelegentlichen Benutzern geschrieben). Ein Format wie dieses könnte viel besser sein

--- 
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... 

Gibt es eine Lösung? Vorzugsweise mit Python. Andere Dateiformate Vorschläge sind ebenfalls willkommen!

Antwort

0

Leider ist dies nicht möglich, was würde man denken, arbeiten könnte | für einen einzigen skalar im separaten Dokument verwendet:

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('-----') 

aber es funktioniert nicht, weil | die block indentation indicator ist. Und obwohl auf der obersten Ebene eine Einrückung von 0 (Null) leicht funktionieren würde, erlauben ramel.yaml (und PyYAML) dies nicht.

Es ist jedoch leicht, dies selbst zu analysieren, was den Vorteil gegenüber dem Front-Package hat, dass Sie YAML 1.2 verwenden können und nicht auf YAML 1.1 beschränkt sind, weil Frontmaker den PyYAML verwendet. Beachten Sie auch, dass ich das geeignetere Ende des Dokument Markers ... verwendet YAML vom Abschlag zu trennen:

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]) 

die gibt:

Somebody 
I want... 

(die round_trip_load ermöglicht mit der Erhaltung der Kommentare Dumping, Ankernamen usw.).