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にプッシュする

Files changed (8) hide show
  1. .github/workflows/run.yaml +19 -0
  2. Dockerfile +6 -6
  3. README.md +18 -0
  4. app.py +32 -3
  5. slides/out/001.png +0 -3
  6. slides/out/002.png +0 -3
  7. slides/out/003.png +0 -3
  8. 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
- # Pythonスクリプトのコピー
22
- COPY run_slidev.py .
23
 
24
  # スライドディレクトリの作成
25
  RUN mkdir slides
26
 
27
- RUN chown -R user:user /app
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(["yes", "|", "npx", "slidev", "export", "temp.md", "--format", "png", "--output", "slides/out/", "--dark", "-t"])
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

  • SHA256: becd0ac314aad220580ba42120bfa0e74a925c78ce2436f75c2d0babe95bd6c7
  • Pointer size: 130 Bytes
  • Size of remote file: 10.2 kB
slides/out/002.png DELETED

Git LFS Details

  • SHA256: 1bfc54b7bce01acf5f990ed1f005380522cd8b908e23a361955dc0467a4bc06c
  • Pointer size: 130 Bytes
  • Size of remote file: 14 kB
slides/out/003.png DELETED

Git LFS Details

  • SHA256: c4d0b0be593f688342f03660cc31c69a4d5791a9beb6e626480fcfc2c9bf5c43
  • Pointer size: 129 Bytes
  • Size of remote file: 7.01 kB
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