WordPress → Code Extractor (PyQt6 alat)

Preuzmite i izdvojite kod blokove sa WordPress stranica jednim klikom

Ako često posećujete tehničke blogove ili tutorijale koji koriste EnlighterJS za prikaz koda (kao što su Python, HTML, CSS, JavaScript ili C++), sigurno ste se bar jednom našli u situaciji da želite preuzeti sve te kodove lokalno – bez ručnog kopiranja svakog bloka.

Upravo zbog toga nastao je WordPress → Code Extractor, jednostavan Python GUI alat zasnovan na PyQt6 koji automatski preuzima bilo koju WordPress stranicu i izdvaja sve EnlighterJS blokove koda u odvojene fajlove.


🚀 Kako funkcioniše

Program funkcioniše u tri koraka:

  1. Unosite URL WordPress stranice (npr. članak sa tutorijalima ili primerima koda)
  2. Kliknete na dugme „Preuzmi i izdvoji kod“
  3. Program automatski:
    • preuzima HTML sadržaj,
    • analizira sve <pre class="EnlighterJS"> blokove,
    • iz svakog bloka izdvaja kod i
    • snima ih u poseban folder sa nazivom stranice.

Svaki izdvojeni fajl dobija naziv i ekstenziju na osnovu jezika (npr. program01.py, program02.html, program03.css itd).
Ako blok sadrži ime fajla u prvoj liniji (npr. # script.py), program koristi upravo to ime.


🖥️ Grafički interfejs (PyQt6)

Za razliku od komandne verzije, nova varijanta koristi PyQt6 i dolazi sa modernim grafičkim interfejsom.
Korisnički interfejs sadrži:

  • polje za unos URL adrese,
  • dugme „Preuzmi i izdvoji kod“,
  • tekstualni prikaz svih poruka i statusa,
  • i naprednu indikaciju toka preuzimanja.

Sve se odvija u pozadini preko QThread, tako da aplikacija ne zamrzava rad tokom preuzimanja.


⚙️ Instalacija

Da biste pokrenuli aplikaciju, potrebno je imati instaliran Python 3.
Zatim jednostavno instalirajte sve potrebne biblioteke jednom komandom:

python3 -m pip install --upgrade pip requests beautifulsoup4 PyQt6

Zatim pokrenite program:

python3 wordpress2code_qt6.py

Unesite URL željene stranice i program će automatski kreirati novi folder sa svim izdvojenim kodovima.


💡 Prednosti

  • Automatsko izdvajanje svih kod blokova sa WordPress stranica
  • Prepoznavanje programskog jezika i ispravnih ekstenzija
  • Jednostavan grafički interfejs bez potrebe za komandnom linijom
  • Rad bez internog WordPress API pristupa – funkcioniše na svim javnim člancima

🔐 Privatnost i otvoreni kod

WordPress → Code Extractor ne koristi nikakve spoljne API-je, ne prikuplja podatke i sav sadržaj obrađuje lokalno.
Kod je otvoren i možete ga slobodno menjati i prilagođavati sopstvenim potrebama.


🧩 Zaključak

Ako se bavite programiranjem, web razvojem ili često proučavate WordPress tutorijale, ovaj mali alat može vam uštedeti mnogo vremena.
Samo unesite URL, kliknite dugme i svi primeri koda biće uredno sačuvani u vašem folderu — spremni za dalju upotrebu, analizu ili učenje.


📦 Naziv programa: WordPress → Code Extractor
🧰 Tehnologije: Python 3, PyQt6, BeautifulSoup4, Requests
🕹️ Platforma: Windows / macOS / Linux
💻 Licenca: Open Source


Instalacija potrebnih zavisnosti:

python3 -m pip install --upgrade pip requests beautifulsoup4 PyQt6

Programski kod za wordpress2code_qt6.py

# wordpress2code_qt6.py
# GUI alat za preuzimanje WordPress stranica i izdvajanje EnlighterJS kod blokova
# Instalacija: python3 -m pip install --upgrade pip requests beautifulsoup4 PyQt6

import sys
import os
import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse
from PyQt6.QtWidgets import (
    QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel,
    QLineEdit, QPushButton, QTextEdit, QProgressBar, QFileDialog, QMessageBox
)
from PyQt6.QtCore import Qt, QThread, pyqtSignal


# ---------------------- Radna nit ----------------------

class Worker(QThread):
    progress = pyqtSignal(str)
    finished = pyqtSignal()

    def __init__(self, url):
        super().__init__()
        self.url = url

    def run(self):
        try:
            parsed = urlparse(self.url)
            base_name = parsed.path.strip("/").split("/")[-1] or "wordpress_stranica"
            html_file = f"{base_name}.html"

            self.progress.emit(f"📥 Preuzimam: {self.url}")
            response = requests.get(self.url)
            response.raise_for_status()

            with open(html_file, "w", encoding="utf-8") as f:
                f.write(response.text)
            self.progress.emit(f"✅ Stranica sačuvana kao {html_file}")

            self.extract_enlighter_code(html_file, base_name)

            os.remove(html_file)
            self.progress.emit(f"🧹 Obrisan privremeni fajl: {html_file}")

        except Exception as e:
            self.progress.emit(f"❌ Greška: {str(e)}")
        finally:
            self.finished.emit()

    def get_language(self, block):
        lang = block.get("data-enlighter-language", "").strip().lower()
        if not lang:
            classes = block.get("class", [])
            for c in classes:
                c = c.lower()
                if c in ["python", "html", "css", "javascript", "bash", "cpp"]:
                    lang = c
                    break
        ext_map = {
            "python": "py", "html": "html", "css": "css",
            "javascript": "js", "bash": "sh", "cpp": "cpp",
            "c++": "cpp", "json": "json", "xml": "xml", "php": "php",
        }
        return ext_map.get(lang, "txt")

    def extract_enlighter_code(self, html_file, base_name):
        with open(html_file, "r", encoding="utf-8") as f:
            soup = BeautifulSoup(f, "html.parser")

        code_blocks = soup.find_all("pre", class_=["EnlighterJS", "enlighterjs", "EnlighterJSRAW"])
        if not code_blocks:
            self.progress.emit("⚠️ Nema pronađenih EnlighterJS kod blokova.")
            return

        code_folder = os.path.splitext(base_name)[0]
        os.makedirs(code_folder, exist_ok=True)

        count = 0
        for i, block in enumerate(code_blocks, start=1):
            code_text = block.get_text().strip()
            if not code_text:
                continue
            first_line = code_text.splitlines()[0].strip()
            if first_line.startswith("#") and "." in first_line:
                file_name = first_line.lstrip("#").strip()
            else:
                ext = self.get_language(block)
                file_name = f"program{str(i).zfill(2)}.{ext}"

            file_path = os.path.join(code_folder, file_name)
            with open(file_path, "w", encoding="utf-8") as f:
                f.write(code_text)

            count += 1
            self.progress.emit(f"💾 Snimljen kod: {file_path}")

        self.progress.emit(f"✅ Ukupno izdvojeno {count} EnlighterJS blokova u folder: {code_folder}")


# ---------------------- GUI ----------------------

class WordPress2CodeApp(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("WordPress → Code Extractor (Qt6)")
        self.setGeometry(200, 200, 700, 400)

        self.layout = QVBoxLayout()
        self.setLayout(self.layout)

        # Unos URL-a
        self.url_label = QLabel("Unesite WordPress URL:")
        self.url_input = QLineEdit()
        self.url_input.setPlaceholderText("https://primer.com/moj-post")

        self.layout.addWidget(self.url_label)
        self.layout.addWidget(self.url_input)

        # Dugmad
        btn_layout = QHBoxLayout()
        self.download_btn = QPushButton("Preuzmi i izdvoji kod")
        self.download_btn.clicked.connect(self.start_download)
        btn_layout.addWidget(self.download_btn)

        self.layout.addLayout(btn_layout)

        # Tekstualni prikaz
        self.output_box = QTextEdit()
        self.output_box.setReadOnly(True)
        self.layout.addWidget(self.output_box)

        # Napredak
        self.progress_bar = QProgressBar()
        self.progress_bar.setRange(0, 0)
        self.progress_bar.hide()
        self.layout.addWidget(self.progress_bar)

        self.worker = None

    def start_download(self):
        url = self.url_input.text().strip()
        if not url:
            QMessageBox.warning(self, "Greška", "Molimo unesite URL adresu.")
            return

        self.output_box.clear()
        self.progress_bar.show()
        self.download_btn.setEnabled(False)

        self.worker = Worker(url)
        self.worker.progress.connect(self.log_message)
        self.worker.finished.connect(self.download_finished)
        self.worker.start()

    def log_message(self, msg):
        self.output_box.append(msg)

    def download_finished(self):
        self.progress_bar.hide()
        self.download_btn.setEnabled(True)
        QMessageBox.information(self, "Završeno", "Proces preuzimanja i izdvajanja je gotov.")


# ---------------------- Pokretanje aplikacije ----------------------

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = WordPress2CodeApp()
    window.show()
    sys.exit(app.exec())

#MIT_License.txt
MIT License

Copyright (c) [2025] [Aleksandar Maričić]

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. 

By Abel

Leave a Reply

Your email address will not be published. Required fields are marked *