2016-06-17 8 views
1

django를 사용하여 블로그를 작성하는 동안 기사의 텍스트와 모든 관련 정보 (제목, 작성자 등 ...)를 함께 저장하는 것이 매우 실용적이라는 것을 깨달았습니다. 사람이 읽을 수있는 파일 형식으로 변환 한 다음 간단한 스크립트를 사용하여 데이터베이스에 파일을 부과 할 수 있습니다. 나는 그것이 최선의 해결책 (특히 파일이 아니라면 믿을동일한 문서에서 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. 
--- 

: 말했다

지금은, YAML 자신의 가독성과 사용 편의성에 대한 내 관심을 끌었의 YAML 구문의 유일한 단점은 들여 쓰기입니다 일반 사용자가 작성합니다). 이 형식이 훨씬 더 좋을 수도 있습니다.

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

어떤 해결책이 있습니까? 파이썬을 사용하는 것이 바람직합니다. 다른 파일 형식 제안도 환영합니다!

답변

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를 사용할 수있는 프론트 매터 리 패키지를 사용하는 것보다 이점이 있으며 PyYAML을 사용하는 프론트 메이커 때문에 YAML 1.1을 사용하는 데 제한되지 않습니다.

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는 등 의견의 보존, 앵커 이름으로 투기 허용 또한 나는 인하에서 YAML을 분리하는 문서 마커 ...의 더 적절한 말을 사용주의).