PyYAML+Jinja2를 사용하여 다양한 질문집 만들기
하고 싶은 일
이루어지다
이렇게 사용할 프로그램 라이브러리를 결정했습니다.
입력 데이터 예
큰 프로젝트와 문제 두 단계를 가정해 보세요.
traning.yml
---
- title: ディレクトリの移動・操作
quizzes:
- question: |-
現在の作業中のディレクトリ(ワーキングディレクトリ)のパスを表示するコマンドは何か
answer: |-
~~~{.bash}
pwd
~~~
- question: |-
現在のディレクトリから`/tmp`に移動する操作を書きなさい
answer: |-
~~~{.bash}
cd /tmp
~~~
※ |-
를 사용하면 여러 칸을 사용할 수 있습니다.끝에서 행 분리를 삭제합니다.코드 생성
generater.py
import yaml
import markdown
import jinja2
import sys, io
# always utf-8 encoding.
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
# markdown extension
MARKDOWN_EXTENSIONS = ['markdown.extensions.extra']
# add filter (markdown)
loader = jinja2.FileSystemLoader('./templates')
env = jinja2.Environment(autoescape=True, loader=loader)
env.filters['markdown'] = lambda text: markdown.markdown(text, MARKDOWN_EXTENSIONS)
# render
tranings = yaml.load(sys.stdin.buffer)
template : jinja2.Template = env.get_template("traning.j2")
html = template.render(tranings = tranings)
# output
print(html)
마크다운의 변환 처리를 진자2 필터로 쓰는 데 신경을 썼다.템플릿 예
답변을 숨기고 싶을 때는
<div class="quiz-answer">
근처를 삭제하면 된다.templates/tranings.j2
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<title>とれーにんぐ</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" integrity="sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB"
crossorigin="anonymous">
<style>
.quiz-content{
margin-left: 1em;
}
.quiz-answer::before{
content: "A."
}
</style>
<script>
window.addEventListener('load', function(){
Array.from(document.querySelectorAll('pre code')).forEach(function(el){
hljs.highlightBlock(el);
})
})
</script>
</head>
<body>
<div class="container-fluid">
<section>
<ul>
{% for traning in tranings %} {% set traning_loop = loop %}
<li>
<div><a href="#{{traning.title}}">{{ traning_loop.index }}.{{traning.title}}</a></div>
<ul>
{% for quiz in traning.quizzes %}
<li><a href="#quiz-{{ traning_loop.index }}-{{ loop.index }}">{{ traning_loop.index }}.{{ loop.index }}. {{quiz.question}}</a></li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
</section>
{% for traning in tranings %} {% set traning_loop = loop %}
<section class="traning">
<h2 id="{{ traning.title }}">{{ traning_loop.index }}. {{ traning.title }}</h2>
{% for quiz in traning.quizzes %}
<div class="quiz">
<h3 id="quiz-{{ traning_loop.index }}-{{ loop.index }}" class="quiz-no">Q. {{ traning_loop.index }}-{{ loop.index }}.</h3>
<div class="quiz-content">
<div class="quiz-question">
{{ quiz.question | markdown | safe }}
</div>
<div class="quiz-answer">
{{ quiz.answer | markdown | safe }}
</div>
</div>
</div>
{% endfor %}
</section>
{% endfor %}
</div>
</body>
사용 예
python generator.py < traning.yml > output.html
출력 예
이렇게까지 했지만 문제가 생겨 귀찮아서 사용할지 모르겠다.
Reference
이 문제에 관하여(PyYAML+Jinja2를 사용하여 다양한 질문집 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/fukasawah/items/487d214ecf995209ba4c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)