Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
マークダウンパーサーの自作
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
suzakutakumi
December 11, 2021
Technology
130
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
マークダウンパーサーの自作
suzakutakumi
December 11, 2021
More Decks by suzakutakumi
See All by suzakutakumi
ピクロス作成の中間発表
suzakutakumi
0
110
しゅみろん
suzakutakumi
0
180
trap-search
suzakutakumi
1
58
Pyramid Makerの作成
suzakutakumi
0
42
絵文字ジェネレータボットの作成
suzakutakumi
0
170
send_discord
suzakutakumi
0
62
独自ドメインについて
suzakutakumi
0
60
ESP32とAlexaを用いたエアコン制御
suzakutakumi
0
1.4k
スターリンマージソート
suzakutakumi
3
600
Other Decks in Technology
See All in Technology
アンオフィシャルな、オフィシャルからのお願い
wyamazak_devrel
0
140
自分が詳しくない領域でAIを使う #プロヒス2026
konifar
13
5.2k
2026 TECHFRESH 畢業分享會 - 開發日常大解密!從領域驅動到企業級上線
line_developers_tw
PRO
0
1.3k
人材育成分科会.pdf
_awache
4
300
自宅LLMの話
jacopen
1
650
LayerX コーポレートエンジニアリング室におけるサプライチェーンセキュリティへの取り組み / Supply Chain Security at LayerX Corporate Engineering
yuyatakeyama
2
680
Android の公式 Skill / Android skills
yanzm
0
160
AI駆動開発を通して感じた、 AI時代のデザイナーの役割変化
whisaiyo
4
2.3k
AWS Security Hub CSPMの成功・失敗体験
cmusudakeisuke
0
260
【セミナー資料】Claude Code をセキュアに使うための考え方と設定の勘どころ / Claude Code Webinar 20260616
masahirokawahara
2
420
新しいUbuntu/GNOMEが使いたいからXからWaylandへ移行頑張ってるの巻 2026-06-20
nobutomurata
0
150
手塩にかけりゃいいってもんじゃない
ming_ayami
0
610
Featured
See All Featured
Mind Mapping
helmedeiros
PRO
1
250
Amusing Abliteration
ianozsvald
1
210
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
480
Building AI with AI
inesmontani
PRO
1
1.1k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.7k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
970
For a Future-Friendly Web
brad_frost
183
10k
Abbi's Birthday
coloredviolet
2
8.1k
How STYLIGHT went responsive
nonsquared
100
6.2k
Marketing to machines
jonoalderson
1
5.5k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.5k
Writing Fast Ruby
sferik
630
63k
Transcript
マークダウンパーサー の自作 2021/12/11 Zli 大LT
自己紹介 HN:朱雀 匠(本名:鈴木 拓眞) Twitter: @suzakutakumi3 Portfolio: http://suzakutakumi.mydns.jp/
None
None
マークダウンパーサーとは マークダウンをHTML等に変換してくれる奴です。
マークダウンを使うところ - Notion - Qiita - GitHub - esa.io -
VSCode
使ってて思ったこと - 色変えたい - 改行がスペース2個書かないとされないの意味わからん - 文字サイズも変更したい どうしたら良いのか?
自分で作る!
注意点! 構文解析とか文法解析とかは知らない 行きあたりばったりの何となくで作成しています
見出しの実装 if l>0 and row[0]=='#': cnt=1 while row[cnt]=='#': cnt+=1 if
row[cnt]==" ": row="<h%d>"%cnt+row[cnt+1:-4]+"</h%d>"%cnt これは1行:1行の対応なので、簡単に実装できました。
リンクの実装 ans=re.search(r"\[.+\]\(.+\)",row) if ans!=None: sl=ans.span() first=row[:sl[0]] second=row[sl[0]:sl[1]] last=row[sl[1]:] content=re.search(r"\[.+\]",second).span() link=re.search(r"\(.+\)",second).span()
row=first+'<a href="%s">%s</a>'%(second[link[0]+1:link[1]-1],second[content[0]+1:content[1]-1])+last こちらも1行:1行の対応なので、簡単に実装できました。 正規表現で、その行にリンクがあるか?リンクの位置などを抽出しています。
画像の実装 ans=re.search(r"!\[.*\]\(.+\)",row) if ans!=None: sl=ans.span() first=row[:sl[0]] second=row[sl[0]:sl[1]] last=row[sl[1]:] content=re.search(r"\[.+\]",second).span() link=re.search(r"\(.+\)",second).span()
row=first+'<img src="%s" alt="%s"/>'%(second[link[0]+1:link[1]-1],second[content[0]+1:content[1]-1])+last ほぼ、リンクと変わらないですね
リストの実装1 リストとは
リストの実装2 コードは省略 こちらは一番時間がかかっています。 リストのネストに対応しています。
サイズ変更の実装 ans=re.search(r"<[0-9]+>",row) if ans!=None: sl=ans.span() first=row[:sl[0]] second='<font size="%s">'%row[sl[0]+1:sl[1]-1] last=row[sl[1]:] row=first+second+last
fin_list.append("</font>") こちらも、正規表現を用いて、サイズの実装をしました。
色の実装 ans=re.search(r"<#[0-9a-fA-F]+>",row) if ans!=None: sl=ans.span() first=row[:sl[0]] second='<font color="%s">'%row[sl[0]+1:sl[1]-1] last=row[sl[1]:] row=first+second+last
fin_list.append("</font>") colorTexts=["black","gray","silver","white","blue","navy","teal","green","lime","aqua","yellow","red","fuchsia","olive"," purple","maroon"] for texts in colorTexts: ans=re.search("<%s>"%texts,row) if ans!=None: sl=ans.span() first=row[:sl[0]] second='<font color="%s">'%row[sl[0]+1:sl[1]-1] last=row[sl[1]:] row=first+second+last fin_list.append("</font>") こちらも正規表現を利用して、実装しています。
デモ
Webサーバでの実装 将来的には、自分のポートフォリオサイトで使いたいので、Webで編 集できるようにしたい!
Flaskで実装 from flask import Flask,render_template,request import sys sys.path.append( '../') from
command import MarkdownParser as MP app = Flask(__name__) @app.route('/') def Index(): return render_template( "index.html") @app.route('/test',methods=['GET','POST']) def Test(): data=request.get_data().decode() ans=MP.main(data.split( '\n')) return '\n'.join(ans) if __name__ == "__main__": app.run(debug=True) /testにアクセスすると、bodyの内容を 先ほど作ったマークダウンパーサーを呼び出し、変換しています。
デモ
今後について • シンタックスハイライトの対応やその他の便利機能を追加する • 構文解析などを習ったので、もう少ししっかりした設計にしたい • CSSをしっかりさせる • 自分のポートフォリオ用に適応させる
最後に 下のリンクからプログラムがおいてあるリポジトリを見ることができます。 https://github.com/suzakutakumi/MarkdownParser