#!/usr/bin/perl -w
use strict;
use warnings;
use File::Find;
use JSON; # Встановіть: cpan JSON
use utf8;
binmode(STDOUT, ":utf8");
# Шлях до веб-кореня
my $root_dir = '/home/user/public_html'; # Замініть на ваш
my $index_file = '/path/to/search_index.json'; # Замініть, наприклад /var/tmp/search_index.json (поза веб-доступом для безпеки!)
# Словник: слово => [ {path: '/page.html', title: 'Заголовок', snippet: 'Фрагмент...'} ]
my %index;
find(
sub {
return if (\( _ =~ /^\./ || !/\.html \)/i || -d);
my $full_path = $File::Find::name;
return unless -r $full_path;
open(my $fh, '<:utf8', $full_path) or return;
local $/; # Читати весь файл
my $content = <$fh>;
close($fh);
my $rel_path = $full_path;
$rel_path =~ s/^$root_dir//;
my $title = $rel_path;
$title = $1 if $content =~ /
(.*?)<\/title>/is;
# Розбити контент на слова (просто, без стемінгу)
my %words;
for my $word (grep { length >= 3 } $content =~ /\b\w+\b/ug) {
my $lc_word = lc($word);
$words{$lc_word} = 1;
}
for my $word (keys %words) {
# Додати сніпет: знайти фрагмент з словом (перші 100 символів навколо)
my $snippet = '';
if ($content =~ /(.{0,50}\b\Q$word\E\b.{0,50})/is) {
$snippet = $1;
\( snippet =~ s/^\s+|\s+ \)//g;
$snippet = substr($snippet, 0, 100) . '...' if length($snippet) > 100;
}
push @{ $index{$word} }, { path => $rel_path, title => $title, snippet => $snippet };
}
},
$root_dir
);
# Зберегти JSON (з сортуванням для зручності)
open(my $json_fh, '>:utf8', $index_file) or die "Не можу записати $index_file: $!";
print $json_fh encode_json(\%index);
close($json_fh);
print "Індекс згенеровано: " . scalar(keys %index) . " слів.\n";