Maki
commited on
Commit
•
4fff69a
1
Parent(s):
b224f0e
[feat] Markdownを入力するとSlidevスライドを生成するアプリケーションの機能を追加
Browse files- Streamlitを使用してマークダウンからSlidevスライドを生成するWebアプリケーションを作成
- ユーザーがマークダウンを入力するテキストエリアを提供
- "Generate Slides"ボタンをクリックすると、以下の処理が行われる:
1. `slides/out`フォルダを初期化
2. 一時ファイル`temp.md`にマークダウンの内容を書き込む
3. `slidev`コマンドを実行してスライドを生成
4. 生成されたスライド画像を表示
5. 各スライド画像のダウンロードリンクを提供
6. すべてのスライドをZIPファイルに圧縮し、ダウンロードリンクを提供
7. 一時ファイルとZIPファイルを削除
[chore] Dockerfileの更新とビルドプロセスの改善
- Dockerfileを更新し、以下の変更を行った:
- `playwright`の依存関係をインストール
- ユーザー権限の設定を調整
- `slides`ディレクトリの作成
- README.mdにアプリケーションのメタデータを追加
- 開発用のコマンドをREADME.mdに追加
[docs] README.mdの更新
- アプリケーションのタイトル、色、SDKなどのメタデータをREADME.mdに追加
- 開発用のコマンドを追加
[chore] GitHub Actionsワークフローの追加
- Hugging Face hubへの同期用のGitHub Actionsワークフローを追加
- `main`ブランチへのプッシュまたは手動トリガーでワークフローが実行される
- リポジトリをチェックアウトし、Hugging Face hubにプッシュする
- .github/workflows/run.yaml +19 -0
- Dockerfile +6 -6
- README.md +18 -0
- app.py +32 -3
- slides/out/001.png +0 -3
- slides/out/002.png +0 -3
- slides/out/003.png +0 -3
- temp.md +17 -0
.github/workflows/run.yaml
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
name: Sync to Hugging Face hub
|
2 |
+
on:
|
3 |
+
push:
|
4 |
+
branches: [main]
|
5 |
+
|
6 |
+
# to run this workflow manually from the Actions tab
|
7 |
+
workflow_dispatch:
|
8 |
+
jobs:
|
9 |
+
sync-to-hub:
|
10 |
+
runs-on: ubuntu-latest
|
11 |
+
steps:
|
12 |
+
- uses: actions/checkout@v3
|
13 |
+
with:
|
14 |
+
fetch-depth: 0
|
15 |
+
lfs: true
|
16 |
+
- name: Push to hub
|
17 |
+
env:
|
18 |
+
HF_TOKEN: ${{ secrets.HF_TOKEN }}
|
19 |
+
run: git push --force https://MakiAi:$HF_TOKEN@huggingface.co/spaces/MakiAi/TimeLinR main
|
Dockerfile
CHANGED
@@ -12,20 +12,20 @@ RUN apt-get update && apt-get install -y python3 python3-pip
|
|
12 |
# 作業ディレクトリの設定
|
13 |
WORKDIR /app
|
14 |
|
15 |
-
# Slidevのインストール
|
16 |
RUN npm install -g @slidev/cli@latest
|
17 |
-
RUN npm install -D playwright-chromium
|
18 |
RUN npx playwright install-deps
|
19 |
RUN npx playwright install
|
|
|
|
|
|
|
20 |
|
21 |
-
#
|
22 |
-
|
23 |
|
24 |
# スライドディレクトリの作成
|
25 |
RUN mkdir slides
|
26 |
|
27 |
-
|
28 |
-
RUN chown -R user:user /usr/local/lib/node_modules/@slidev/
|
29 |
|
30 |
USER user
|
31 |
|
|
|
12 |
# 作業ディレクトリの設定
|
13 |
WORKDIR /app
|
14 |
|
|
|
15 |
RUN npm install -g @slidev/cli@latest
|
|
|
16 |
RUN npx playwright install-deps
|
17 |
RUN npx playwright install
|
18 |
+
RUN chown -R user:user /app
|
19 |
+
RUN chown -R user:user /usr/local/lib/node_modules/@slidev/
|
20 |
+
USER user
|
21 |
|
22 |
+
# Slidevのインストール
|
23 |
+
RUN npm install -D playwright-chromium
|
24 |
|
25 |
# スライドディレクトリの作成
|
26 |
RUN mkdir slides
|
27 |
|
28 |
+
|
|
|
29 |
|
30 |
USER user
|
31 |
|
README.md
CHANGED
@@ -1,3 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
2 |
<p align="center">
|
3 |
<img src="https://media.githubusercontent.com/media/Sunwood-ai-labs/SlideNova/develop/docs/SlideNova_icon.png" width="100%">
|
@@ -57,6 +69,12 @@ docker-compose up --build
|
|
57 |
2. 「Generate Slides」ボタンをクリックします。
|
58 |
3. 生成されたスライドが表示されます。
|
59 |
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
## 📖 ドキュメント
|
61 |
|
62 |
より詳細な情報は、[ドキュメント](docs/)を参照してください。
|
|
|
1 |
+
---
|
2 |
+
title: SlideNova
|
3 |
+
emoji: 🐠
|
4 |
+
colorFrom: indigo
|
5 |
+
colorTo: green
|
6 |
+
sdk: docker
|
7 |
+
pinned: false
|
8 |
+
license: mit
|
9 |
+
app_port: 8501
|
10 |
+
---
|
11 |
+
|
12 |
+
|
13 |
|
14 |
<p align="center">
|
15 |
<img src="https://media.githubusercontent.com/media/Sunwood-ai-labs/SlideNova/develop/docs/SlideNova_icon.png" width="100%">
|
|
|
69 |
2. 「Generate Slides」ボタンをクリックします。
|
70 |
3. 生成されたスライドが表示されます。
|
71 |
|
72 |
+
## Develop command
|
73 |
+
|
74 |
+
```bash
|
75 |
+
yes | npx slidev export temp.md --format png --output slides/out/ --dark -t
|
76 |
+
```
|
77 |
+
|
78 |
## 📖 ドキュメント
|
79 |
|
80 |
より詳細な情報は、[ドキュメント](docs/)を参照してください。
|
app.py
CHANGED
@@ -2,22 +2,29 @@
|
|
2 |
import streamlit as st
|
3 |
import os
|
4 |
import subprocess
|
|
|
|
|
|
|
5 |
|
6 |
def main():
|
7 |
st.title("Markdown to Slidev")
|
8 |
|
9 |
# マークダウンファイルの内容を入力するテキストエリア
|
10 |
markdown_text = st.text_area("Enter your markdown content here:", height=400)
|
11 |
-
# os.remove("/app/slides/out/*")
|
12 |
|
13 |
# スライドを生成するボタン
|
14 |
if st.button("Generate Slides"):
|
|
|
|
|
|
|
|
|
|
|
15 |
# 一時ファイルにマークダウンの内容を書き込む
|
16 |
with open("temp.md", "w") as f:
|
17 |
f.write(markdown_text)
|
18 |
|
19 |
# slidevコマンドを実行してスライドを生成
|
20 |
-
subprocess.run(["
|
21 |
|
22 |
# 生成されたスライドを表示
|
23 |
slides = []
|
@@ -27,10 +34,32 @@ def main():
|
|
27 |
slides.sort()
|
28 |
|
29 |
for slide in slides:
|
|
|
30 |
st.image(f"slides/out/{slide}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
31 |
|
32 |
-
#
|
33 |
os.remove("temp.md")
|
|
|
34 |
|
35 |
if __name__ == "__main__":
|
36 |
main()
|
|
|
2 |
import streamlit as st
|
3 |
import os
|
4 |
import subprocess
|
5 |
+
import zipfile
|
6 |
+
import shutil
|
7 |
+
import base64
|
8 |
|
9 |
def main():
|
10 |
st.title("Markdown to Slidev")
|
11 |
|
12 |
# マークダウンファイルの内容を入力するテキストエリア
|
13 |
markdown_text = st.text_area("Enter your markdown content here:", height=400)
|
|
|
14 |
|
15 |
# スライドを生成するボタン
|
16 |
if st.button("Generate Slides"):
|
17 |
+
# slides/outフォルダを綺麗にする
|
18 |
+
if os.path.exists("slides/out"):
|
19 |
+
shutil.rmtree("slides/out")
|
20 |
+
os.makedirs("slides/out")
|
21 |
+
|
22 |
# 一時ファイルにマークダウンの内容を書き込む
|
23 |
with open("temp.md", "w") as f:
|
24 |
f.write(markdown_text)
|
25 |
|
26 |
# slidevコマンドを実行してスライドを生成
|
27 |
+
subprocess.run(["npx", "slidev", "export", "temp.md", "--format", "png", "--output", "slides/out/", "--dark", "-t"])
|
28 |
|
29 |
# 生成されたスライドを表示
|
30 |
slides = []
|
|
|
34 |
slides.sort()
|
35 |
|
36 |
for slide in slides:
|
37 |
+
# 画像を表示
|
38 |
st.image(f"slides/out/{slide}")
|
39 |
+
|
40 |
+
# 画像をダウンロードするリンクを表示
|
41 |
+
with open(f"slides/out/{slide}", "rb") as f:
|
42 |
+
img_bytes = f.read()
|
43 |
+
b64 = base64.b64encode(img_bytes).decode()
|
44 |
+
href = f'<a href="data:image/png;base64,{b64}" download="{slide}">Download {slide}</a>'
|
45 |
+
st.markdown(href, unsafe_allow_html=True)
|
46 |
+
|
47 |
+
# スライドをZIPファイルに圧縮
|
48 |
+
zip_filename = "slides.zip"
|
49 |
+
with zipfile.ZipFile(zip_filename, "w") as zip_file:
|
50 |
+
for slide in slides:
|
51 |
+
zip_file.write(f"slides/out/{slide}", slide)
|
52 |
+
|
53 |
+
# ZIPファイルをダウンロードするリンクを表示
|
54 |
+
with open(zip_filename, "rb") as f:
|
55 |
+
bytes = f.read()
|
56 |
+
b64 = base64.b64encode(bytes).decode()
|
57 |
+
href = f'<a href="data:application/zip;base64,{b64}" download="{zip_filename}">Download All Slides</a>'
|
58 |
+
st.markdown(href, unsafe_allow_html=True)
|
59 |
|
60 |
+
# 一時ファイルとZIPファイルを削除
|
61 |
os.remove("temp.md")
|
62 |
+
os.remove(zip_filename)
|
63 |
|
64 |
if __name__ == "__main__":
|
65 |
main()
|
slides/out/001.png
DELETED
Git LFS Details
|
slides/out/002.png
DELETED
Git LFS Details
|
slides/out/003.png
DELETED
Git LFS Details
|
temp.md
ADDED
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Slidev
|
2 |
+
|
3 |
+
Hello World
|
4 |
+
|
5 |
+
---
|
6 |
+
|
7 |
+
# Page 2
|
8 |
+
|
9 |
+
Directly use code blocks for highlighting
|
10 |
+
|
11 |
+
```ts
|
12 |
+
console.log('Hello, World!')
|
13 |
+
```
|
14 |
+
|
15 |
+
---
|
16 |
+
|
17 |
+
# Page 3
|