From 2a6672084441eaff238a901ea995b9bc3f1a1883 Mon Sep 17 00:00:00 2001 From: naghim Date: Thu, 7 Mar 2024 23:08:05 +0200 Subject: [PATCH] Initial commit --- .github/workflows/build.yaml | 30 ++++++ .gitignore | 2 + requirements.txt | 1 + resources/about.png | Bin 0 -> 5944 bytes resources/curly_braces.png | Bin 0 -> 2675 bytes resources/curly_braces_icon.png | Bin 0 -> 2672 bytes resources/no_curly_braces.png | Bin 0 -> 4497 bytes resources/styles.css | 55 +++++++++++ resources/subassistant.ico | Bin 0 -> 111816 bytes subassistant/__init__.py | 0 subassistant/__main__.py | 13 +++ subassistant/gui/__init__.py | 0 subassistant/gui/tab.py | 157 ++++++++++++++++++++++++++++++++ subassistant/gui/window.py | 28 ++++++ subassistant/logic/__init__.py | 0 subassistant/logic/logic.py | 87 ++++++++++++++++++ 16 files changed, 373 insertions(+) create mode 100644 .github/workflows/build.yaml create mode 100644 .gitignore create mode 100644 requirements.txt create mode 100644 resources/about.png create mode 100644 resources/curly_braces.png create mode 100644 resources/curly_braces_icon.png create mode 100644 resources/no_curly_braces.png create mode 100644 resources/styles.css create mode 100644 resources/subassistant.ico create mode 100644 subassistant/__init__.py create mode 100644 subassistant/__main__.py create mode 100644 subassistant/gui/__init__.py create mode 100644 subassistant/gui/tab.py create mode 100644 subassistant/gui/window.py create mode 100644 subassistant/logic/__init__.py create mode 100644 subassistant/logic/logic.py diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000..936b3a7 --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,30 @@ +name: Build + +on: [push, repository_dispatch, workflow_dispatch] + +jobs: + build: + runs-on: windows-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Setup Visual Studio + uses: ilammy/msvc-dev-cmd@v1 + - name: Setup Python + uses: actions/setup-python@v3 + with: + python-version: "3.11" + architecture: "x64" + - name: Install Python requirements + shell: bash + run: > + python -OO -m pip install --disable-pip-version-check --upgrade nuitka zstandard && + python -OO -m pip install --disable-pip-version-check -r requirements.txt + - name: Build executable + shell: powershell + run: > + python -OO -m nuitka --standalone --onefile --python-flag=-OO --assume-yes-for-downloads --static-libpython=auto --windows-disable-console --windows-icon-from-ico=resources/subassistant.ico --windows-product-name=SubAssistant --windows-company-name=naghim --windows-file-version=1.0.0.0 --windows-file-description=SubAssistant --enable-plugin=pyside6 -o SubAssistant.exe subassistant/__main__.py + - uses: actions/upload-artifact@v3 + with: + name: SubAssistant + path: SubAssistant.exe diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4a74598 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.py[c|o] +__pycache__ \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..cd180fa --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +pyside6 \ No newline at end of file diff --git a/resources/about.png b/resources/about.png new file mode 100644 index 0000000000000000000000000000000000000000..91199c4d7016aee2d88f931793c9132c4b9ce651 GIT binary patch literal 5944 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 literal 0 HcmV?d00001 diff --git a/resources/curly_braces.png b/resources/curly_braces.png new file mode 100644 index 0000000000000000000000000000000000000000..6daae408036b87dd6663f525f11cfbf17f560d9b GIT binary patch literal 2675 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 VZ)NLL>w^s=fWsPJDa8=N{smV$<`Vz_ literal 0 HcmV?d00001 diff --git a/resources/curly_braces_icon.png b/resources/curly_braces_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e457214447aabaf5c04fcea0c378ce6dcd136827 GIT binary patch literal 2672 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

SubAssistant

" + ) + + self.text = QLabel("

👀 What is this? This is a specialized desktop application designed to simplify the translation process for subtitle files, specifically .ass (Advanced SubStation Alpha) format. Tailored for translators, CommentOut facilitates seamless collaboration by allowing users to comment out the original English dialogue text, write their translations alongside it, and enable proofreaders or quality checkers to review both versions within the same file. By providing a unified platform for bilingual text management, this application enhances the efficiency and accuracy of subtitle translation workflows.

" + ) + + self.text_how_to = QLabel("

👀 How to use? Choose the action you wish to take from the side menu—whether to comment out text or delete comments. Use the \"Select File\" button to open the .ass file. The program will automatically propose an output filename within the same folder. If you prefer a different folder or wish to rename the output, utilize the \"Browse\" button or directly edit the output path. Upon clicking the button, the selected operation will be executed.

" + ) + + self.text_slogan = QLabel("

Made with 50% 💕 and 50% ☕
by naghim @ GitHub

" + ) + + self.text_slogan.setOpenExternalLinks(True) + self.text.setWordWrap(True) + self.text_how_to.setWordWrap(True) + self.text.setObjectName("About_txt") + self.text_how_to.setObjectName("About_txt") + self.text_slogan.setObjectName("Label_txt_bold_mini") + self.text_logo.setObjectName("Label_txt_bold") + self.content_layout.addWidget(self.text_logo) + self.content_layout.addWidget(self.text_how_to) + self.content_layout.addWidget(self.text) + self.content_layout.addWidget(self.text_slogan) + self.content_widget.setLayout(self.content_layout) + + self.setLayout(self.layout) diff --git a/subassistant/gui/window.py b/subassistant/gui/window.py new file mode 100644 index 0000000..4c2953f --- /dev/null +++ b/subassistant/gui/window.py @@ -0,0 +1,28 @@ +import sys +from PySide6.QtGui import QIcon +from PySide6.QtWidgets import QTabWidget, QWidget, QVBoxLayout +from subassistant.gui.tab import CommentTab, RemoveCommentTab, AboutTab + +class SubAssistantWindow(QWidget): + def __init__(self): + super().__init__() + self.setWindowTitle("SubAssistant") + self.setWindowIcon(QIcon("./resources/curly_braces_icon.png")) + self.setFixedSize(550, 350) + self.initUI() + + def initUI(self): + layout = QVBoxLayout() + + self.tab_widget = QTabWidget() + self.tab_widget.setTabPosition(QTabWidget.West) + + self.tab_widget.addTab(CommentTab(), QIcon("./resources/curly_braces.png"), "") + self.tab_widget.addTab(RemoveCommentTab(), QIcon("./resources/no_curly_braces.png"), "") + self.tab_widget.addTab(AboutTab(), QIcon("./resources/about.png"), "") + + + self.tab_widget.setStyleSheet("QTabBar::tab { height: 60px; width: 100px;}") + layout.addWidget(self.tab_widget) + + self.setLayout(layout) diff --git a/subassistant/logic/__init__.py b/subassistant/logic/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/subassistant/logic/logic.py b/subassistant/logic/logic.py new file mode 100644 index 0000000..cb92262 --- /dev/null +++ b/subassistant/logic/logic.py @@ -0,0 +1,87 @@ +import sys, os + +class ProcessSubtitles(object): + def __init__(self, input_file: str, output_file: str) -> None: + self.input_file = input_file + self.output_file = output_file + + def process_file(self) -> None: + with open(self.input_file, 'r', encoding='utf-8') as infile, open(self.output_file, 'w', encoding='utf-8') as outfile: + for line in infile: + modified_line = self.process_line(line) + outfile.write(modified_line) + + def process_line(self, line: str) -> str: + raise NotImplementedError + + + +class RemoveComments(ProcessSubtitles): + def process_line(self, line: str) -> str: + modified_line = '' + inside_braces = False + + for i, char in enumerate(line): + if char == '{' and line[i + 1] != '\\': + inside_braces = True + elif char == '}' and inside_braces: + inside_braces = False + elif not inside_braces: + modified_line += char + + return modified_line + + def process_file(self) -> None: + super().process_file() + print("Text within {} removed and written to", self.output_file) + +class CommentDialogue(ProcessSubtitles): + def process_line(self, line: str) -> str: + if not line.startswith("Dialogue"): + return line + + modified_line = '' + inside_braces = False + comma_count = 0 + str_buffer = '' + + for i, char in enumerate(line.strip()): + if char == ',': + comma_count += 1 + if comma_count == 9: + modified_line += char + continue + + # Check if the text part has started + if comma_count >= 9: + # Don't comment out the text if it's a formatting tag + if char == '{': + # But if the opening brace was preceeded by dialog, we want to comment that part out + inside_braces = True + if str_buffer != '': + modified_line += f"{{{str_buffer}}}" + modified_line += char + elif char == '}': + inside_braces = False + modified_line += char + + # Buffer the text outside of the braces to comment out later + elif not inside_braces: + str_buffer += char + + # We don't want to modify the line until the actual text part + else: + modified_line += char + + else: + modified_line += char + + if str_buffer != '': + modified_line += f"{{{str_buffer}}}" + + return f"{modified_line}\n" + + def process_file(self) -> None: + super().process_file() + print("Subtitle successfully commented and saved to ", self.output_file) +