Skip to content

feat: create new feature #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jan 6, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
__pycache__/
.DS_Store
.DS_Store
.python-version
14 changes: 14 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
- repo: https://github.com/psf/black
rev: 24.10.0
hooks:
- id: black
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,14 @@ python mdconverter.py --filename <notebook-file-path>
python mdconverter.py --filename sample/05-GoogleGenerativeAI.ipynb
```

개발 중...
```python

from mdconverter.mdconverter_class import Mdconverter
app = Mdconverter()
app.filename = "sample/05-GoogleGenerativeAI.ipynb"
app.output_filename = 'sample/New-05-GoogleGenerativeAI.md'
app.css_filename = "css/styles.css"

app.run()
```
15 changes: 15 additions & 0 deletions css/styles.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
.custom {
background-color: #008d8d;
color: white;
padding: 0.25em 0.5em 0.25em 0.5em;
white-space: pre-wrap; /* css-3 */
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */
word-wrap: break-word;
}

pre {
background-color: #027c7c;
padding-left: 0.5em;
}
Empty file added mdconverter/__init__.py
Empty file.
39 changes: 17 additions & 22 deletions mdconverter.py → mdconverter/mdconverter.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,15 @@
from typing import List, Dict, Any, Optional


def get_default_css() -> str:
def get_default_css(css_filename: str) -> str:
"""기본 CSS 스타일을 반환합니다."""
return """<style>
.custom {
background-color: #008d8d;
color: white;
padding: 0.25em 0.5em 0.25em 0.5em;
white-space: pre-wrap; /* css-3 */
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */
word-wrap: break-word;
}

pre {
background-color: #027c7c;
padding-left: 0.5em;
}
</style>"""
try:
with open(css_filename, "r", encoding="utf-8") as f:
css_content = f.read()
return f"<style>\n{css_content}\n</style>"
except FileNotFoundError:
print("Could not find styles.css file.")
return ""


def _read_notebook_file(filename: str) -> Dict[str, Any]:
Expand Down Expand Up @@ -92,7 +82,7 @@ def _process_code_cell(cell: Dict[str, Any], cells: List[str]) -> None:
cells.append("```\n\n")


def _convert_markdown_from_notebook(filename: str, output_filename: str) -> str:
def _process_converter(filename: str, output_filename: str, css_filename: str) -> str:
"""노트북을 마크다운으로 변환합니다."""
notebook = _read_notebook_file(filename)
cells: List[str] = []
Expand All @@ -103,8 +93,10 @@ def _convert_markdown_from_notebook(filename: str, output_filename: str) -> str:
elif cell["cell_type"] == "markdown":
cells.extend(cell["source"])
cells.append("\n")
else:
print(f"Unknown cell type. Verification Needed. file : {filename}")

final_output = f"{get_default_css()}\n\n{''.join(cells)}"
final_output = f"{get_default_css(css_filename)}\n\n{''.join(cells)}"

with open(output_filename, "w") as f:
f.write(final_output)
Expand All @@ -113,13 +105,15 @@ def _convert_markdown_from_notebook(filename: str, output_filename: str) -> str:


def convert_markdown_from_notebook(
filename: str, post_fix: str = "-(NEED-REVIEW)"
filename: str,
css_filename: str = "css/styles.css",
post_fix: str = "-(NEED-REVIEW)",
) -> str:
"""노트북 파일을 마크다운으로 변환하는 메인 함수입니다."""

output_filename = filename.replace(".ipynb", f"{post_fix}.md")

return _convert_markdown_from_notebook(filename, output_filename)
return _process_converter(filename, output_filename, css_filename)


if __name__ == "__main__":
Expand All @@ -129,6 +123,7 @@ def convert_markdown_from_notebook(
parser.add_argument(
"--filename", required=True, help="변환할 주피터 노트북 파일 경로"
)
parser.add_argument("--css", default="css/styles.css", help="css file path")
args = parser.parse_args()

convert_markdown_from_notebook(args.filename)
50 changes: 50 additions & 0 deletions mdconverter/mdconverter_class.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from typing import Any
from mdconverter.mdconverter import get_default_css
from nbconvert import MarkdownExporter
import nbformat


class Mdconverter:
def __init__(self) -> None:
self.css_filename = ""
self.filename = ""
self.output_filename = ""

def run(self):
# TODO making mdconverter using mdconvert.py
# self.run_mdconverter()
self.run_ndconverter(
filename=self.filename,
output_filename=self.output_filename,
css_filename=self.css_filename,
)

def run_ndconverter(
self, filename: str, output_filename: str, css_filename: str
) -> None:
notebook_content = self.load_ipynb(filename)
script = self.markdown_exporter(notebook_content)
self.ndconverter_script = self.add_prefix_css(script, css_filename)
self.save_script(self.ndconverter_script, output_filename)

def load_ipynb(self, filename: str) -> Any:
with open(filename, "r", encoding="utf-8") as f:
notebook_content = nbformat.read(f, as_version=4)
return notebook_content

def markdown_exporter(self, notebook_content: Any) -> str:
exporter = MarkdownExporter()
# MarkdownExporter를 사용하여 md로 변환
(script, resources) = exporter.from_notebook_node(notebook_content)
return script

def add_prefix_css(self, script: str, css_filename: str):
return f"{get_default_css(css_filename)}\n\n{''.join(script)}"

def save_script(self, script: str, output_filename: str) -> None:
# 변환된 스크립트 저장
with open(output_filename, "w", encoding="utf-8") as f:
f.write(script)


# TODO Creating Multi loader
Loading