Програм за претрагу Ибарских новости

Програм је писан за оперативни систем Linux Ubuntu. Програм са базом података можете преузети на: http://abel.rs/as/trag_py.zip . Направио сам и верзију истог програма за Widows. Њу ћу касније објавити кад напишем упутство за инсталацију јер је програм за Wodnows писан у програмском језику C++. Помоћу овог програма смо нашли податке за виртуелну изложбу Историјског Архива Краљево Наша прошлост од оснивања до забране 1964-1976. У посебном чланку ћу описати израду те виртуалне изложбе.

Да би програм у Python 3 који користи библиотеке попут Gtk и GLib успешно радио, потребно је инсталирати неколико зависности и подесити окружење. Ово су кораци и потребне компоненте:


1. Python 3 и pip

Пре свега, провери да ли је Python 3 инсталиран на систему. Отвори терминал и покрени:

python3 --version
pip3 --version

Ако није инсталиран, додај га на свој систем:

  • За Ubuntu/Debian:
sudo apt update sudo apt install python3 python3-pip

2. GTK+3 и gi (GObject Introspection)

Библиотека Gtk и GLib су део GTK+3 графичког интерфејса и захтевају GObject Introspection како би радиле у Python-у.

Инсталација GTK+3 и GObject Introspection:

На Ubuntu/Debian системима:

sudo apt update
sudo apt install libgtk-3-dev gir1.2-gtk-3.0 python3-gi python3-gi-cairo

Објашњење пакета:

  • libgtk-3-dev: Библиотека и заглавља за GTK+3.
  • gir1.2-gtk-3.0: GObject Introspection подршка за GTK+3.
  • python3-gi: Python binding за GObject Introspection.
  • python3-gi-cairo: Подршка за Cairo у Python-у (ако радиш са графиком).

3. Провера и тестирање инсталације

Да провериш да ли су Gtk и GLib успешно инсталирани, покрени Python 3 интерпретер:

python3

Унутар Python-а пробај следеће:

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib

print("Gtk и GLib су успешно учитани!")

Ако нема грешака, све је исправно инсталирано.


4. Подршка за webbrowser модул

Модул webbrowser је део стандардне библиотеке Python-а и не захтева додатну инсталацију. Модул се користи за отварање URL-ова у подразумеваном веб-прегледачу.

Пример:

import webbrowser

webbrowser.open("https://example.com")

Ово ће отворити линк у подразумеваном веб-прегледачу система.


5. Инсталација осовних пакета (опционо)

Ако твој програм користи додатне функционалности које зависе од os модула, он је такође део стандардне Python библиотеке и не захтева посебну инсталацију.


Резиме – шта је све потребно инсталирати:

  1. Python 3 и pip3 sudo apt install python3 python3-pip
  2. GTK+3 и GObject Introspection: sudo apt install libgtk-3-dev gir1.2-gtk-3.0 python3-gi python3-gi-cairo

Након ових корака, твој Python програм који користи Gtk, GLib, webbrowser и os би требало да ради без проблема.

Programski kod:

import os
import webbrowser
import gi
from gi.repository import Gtk, GLib

gi.require_version('Gtk', '3.0')

class HTMLSearcher(Gtk.Window):
    def __init__(self):
        super().__init__(title="Претрага Ибарских Новости")
        self.set_border_width(10)
        self.set_default_size(250, 120)

        # Layout
        self.grid = Gtk.Grid()
        self.add(self.grid)

        # Input field
        self.search_entry = Gtk.Entry()
        self.grid.attach(self.search_entry, 0, 0, 2, 1)

        # Search button
        self.search_button = Gtk.Button(label="Претражи")
        self.search_button.connect("clicked", self.on_search_button_clicked)
        self.grid.attach(self.search_button, 2, 0, 1, 1)

        # Progress bar
        self.progress_bar = Gtk.ProgressBar()
        self.grid.attach(self.progress_bar, 0, 1, 3, 1)

        # Labels for current file, progress and status
        self.file_label = Gtk.Label(label="Фајл који се тренутно претражује: ")
        self.grid.attach(self.file_label, 0, 2, 3, 1)

        self.progress_label = Gtk.Label(label="Напредак: 0/0")
        self.grid.attach(self.progress_label, 0, 3, 3, 1)

        self.status_label = Gtk.Label(label="Статус: Чека се претрага...")
        self.grid.attach(self.status_label, 0, 4, 3, 1)

        self.show_all()

    def on_search_button_clicked(self, widget):
        search_phrase = self.search_entry.get_text()
        if search_phrase:
            self.progress_bar.set_fraction(0)
            self.progress_bar.show()
            self.file_label.set_text("Претрага је почела...")
            self.status_label.set_text("Статус: Почетак претраге...")
            GLib.idle_add(self.search_html_files, './html/', search_phrase)

    def search_html_files(self, directory, search_phrase):
        matching_files = []
        html_files = [f for f in os.listdir(directory) if f.endswith('.html')]
        total_files = len(html_files)

        for index, filename in enumerate(html_files):
            file_path = os.path.join(directory, filename)
            self.file_label.set_text(f"Тренутно претражујем: {filename}")
            self.progress_label.set_text(f"Напредак: {index + 1}/{total_files}")
            self.status_label.set_text("Статус: Претрага у току...")

            # Osvežavanje GTK prozora da bi se odmah prikazale promene
            while Gtk.events_pending():
                Gtk.main_iteration()

            try:
                with open(file_path, 'r', encoding='utf-8') as file:
                    content = file.read()
                    if search_phrase.lower() in content.lower():
                        matching_files.append(filename)
            except Exception as e:
                print(f"Greška pri čitanju fajla {file_path}: {e}")

            # Update progress bar
            progress = (index + 1) / total_files
            GLib.idle_add(self.progress_bar.set_fraction, progress)

        self.generate_html_file(matching_files, os.path.join(directory, 'results.html'), search_phrase)
        self.status_label.set_text("Статус: Претрага завршена.")
        return False

    def generate_html_file(self, matching_files, output_file, search_phrase):
        with open(output_file, 'w', encoding='utf-8') as file:
            file.write('<!DOCTYPE html>\n<html lang="sr">\n<head>\n')
            file.write('<meta charset="UTF-8">\n<title>Rezultati pretrage HTML fajlova</title>\n')
            file.write('</head>\n<body>\n')
            file.write('<h1>Ибарске Новости</h1>\n')
            file.write(f'<p>Задата реченица: <strong>{search_phrase}</strong></p>\n')
            
            if matching_files:
                file.write('<ul>\n')
                for html_file in matching_files:
                    pdf_file = html_file.replace('.html', '.pdf')
                    file.write(f'<li><a href="http://kraljevcani.rs/{pdf_file}">{pdf_file}</a></li>\n')
                file.write('</ul>\n')
            else:
                file.write('<p>Нема фајлова који садрже задату реченицу.</p>\n')
            file.write('</body>\n</html>')

        webbrowser.open('file://' + os.path.realpath(output_file))

if __name__ == "__main__":
    win = HTMLSearcher()
    win.connect("destroy", Gtk.main_quit)
    Gtk.main()

Покретање програма: После распакивања зиповане датотеке trag_py.zip уђите у фолдер trag_py и из конзоле стартујте програм:

Појавиће вам се прозор за унос кључне речи:

После уноса кључне речи притисните дугме Претражи. Претрага 3269 бројева Ибарских новости траје неколико секунди. Као резултат добијате листу бројева у којима се појављује кључна реч:

Кликните мишем на неки од излистаних PDF фајлова Ибарских новости да га отоворите:

Потом комбинацијом тастера Ctrl+F отворите претрагу у browser-у и упишите опет исту кључну реч. Добићете број погодака. Притисните стрелицу на доле да би позиционирали први погодак:

By Abel

Leave a Reply

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