#!/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";