MS Word search strings – търсене на думи в Word файлове

Проста програмка за търсене на думи в MS Word файлове. Програмата е само за 32-bit Windows. Тествана е само под WinXP, но може би ще работи и под други OS.
Писана само за трнировка. Разполага само с базови възможности. Би могло да и се добавят доста повече опции, като рекурсивно преравяне на директории, търсене на кирилица, търсене с регулярни изрази, запазване на резултата в текстов файл и т.н. Към момента ги няма тия дивотии, но ако ми текне музата някой ден може и да я пооправя. Използвал съм 2 езика за програмиране – AutoIt и Perl. Използвах компилатор-пакетера pp, за да компилирам Perl-файла.

Програмата е с отворен код и ако на някой му се занимава, може да си я пипне. Изглежда така:
MS Word Search
Сорс кода:
AutoIt-файла

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
 
Local $line
 
$Form1 = GUICreate("Search in word files", 621, 473, 192, 124)
$Label2 = GUICtrlCreateLabel("Text to Find", 8, 13, 60, 23)
$Rezult = GUICtrlCreateEdit("", 8, 64, 609, 369)
; GUICtrlSetData(-1, "Edit1")
$String = GUICtrlCreateInput("", 80, 8, 393, 21)
$SelectDir = GUICtrlCreateButton("Select Dir", 8, 32, 65, 25)
$Directory = GUICtrlCreateInput("", 80, 32, 393, 21)
$Search = GUICtrlCreateButton("SEARCH", 480, 8, 137, 49)
$Help = GUICtrlCreateButton("?", 584, 440, 25, 25)
$Label1 = GUICtrlCreateLabel("--==[ Programming by Nedialko Voinigovski ]==--", 8, 448, 444, 17)
GUISetState(@SW_SHOW)
 
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $SelectDir
			_seldir()
		Case $Search
			_search()
		Case $Help
			_help()
	EndSwitch
WEnd
 
 
func _seldir()
	$outfolder = FileSelectFolder("Choose a folder.", "")
	GUICtrlSetData($Directory, $outfolder)
EndFunc
 
func _search()
$command = @comspec & ' /c ws.exe' & ' "' & GUICtrlRead($String) & '"' & ' "' & GUICtrlRead($Directory) & '"'
$cmd = Run($command, @WorkingDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
 
	$line = "Wait ..." & @CRLF
	While 1
		$line &= StdoutRead($cmd)
		If @error <> 0 Then ExitLoop
		Sleep(1000)
		GUICtrlSetData($Rezult, $line)
	WEnd
	$line &= "--------------------------" & @CRLF & "All done!"
	GUICtrlSetData($Rezult, $line)
EndFunc
 
func _help()
	MsgBox(0,"HELP","Програмата е комбинация от езиците за програмиране" &@CRLF& "AutoIt (за графичната част) и Perl (за ровичкането в Word-файловете)." &@CRLF&"Има възможност да се използват PCRE (perl регулярни изрази) за търсене в файловете, но " &@CRLF&"все още липсва добра поддръжка на кирилица."&@CRLF&@CRLF&"За да работи всичко нормално трябва и двете exe-та да са в една директория.")
EndFunc

Perl-файла, който върши съществената работа:

use Win32::OLE;
use Win32::OLE::Enum;
use Cwd 'abs_path';
 
$dir = $ARGV[1]; chdir $dir;
@files = <*.doc *.docx>;
$find = $ARGV[0];
 
 
 
foreach $file (@files) {
	$doc = Win32::OLE -> GetObject(abs_path($file));
	open (FH,">jgfd75w43589azwq210");
 
	$paragraphs = $doc->Paragraphs();
	$enumerate = new Win32::OLE::Enum($paragraphs);
	while(defined($paragraph = $enumerate->Next())){
		$text = $paragraph->{Range}->{Text};
		print FH "$text\n";
	}
	$doc->Close;
	close FH;
 
	open (FH,"<jgfd75w43589azwq210");
	while ($line = <FH>) {
		if($line =~ m/$find/i){
			print "$find\t-->\t$ARGV[1]\\$file\n";
			last;
		}
	}
	close FH;
	unlink("jgfd75w43589azwq210");
}

Пакетите за Perl, които ми бяха необходими за компилирането:

gcc environment - 3.4.5 (mingw-vista special r3)
PAR Packager, version 1.009 (PAR version 1.002)

Компилирането на Perl стана елементарно. Просто написах в промпта:

pp search_in_word.pl

Програмата може да се изтегли от тук: MS Word Search

wxPerl example TextCtrl – Button getValue(), appendValue()

Един интересен пример с WxPerl, който може да ми е полезен, ако реша да програмирам GUI за Windows.
За примера съм инсталирал:
Perl 5.10.1.1008 в директорията D:\installed\perl
Wx 0.9914
Alien-wxWidgets 0.61
Win32-GUI 1.06

Целия пакет с разни други полезни модули може да се изтегли от тук:
ActivePerl-5.10.1.1008-Win32+Win32GUI+WxPerl.rar

Програмата в примера не прави нищо собено, но е достатъчна базова информация, за да се започне скромна диалогова програмка. В общи линии, при натискане на бутон взима текста от едното поле и го добавя към другото поле:

#!/usr/bin/perl -w
use strict;
use Wx;
 
package MyFrame;
 
use Wx qw (wxVERTICAL wxTOP wxGROW wxHORIZONTAL wxTE_MULTILINE wxFIXED_MINSIZE wxLEFT );
use base 'Wx::Frame';
# import the event registration function
use Wx::Event qw(EVT_BUTTON);
 
sub new {
    my $ref = shift;
    my $self = $ref->SUPER::new( undef,           # parent window
                                 -1,              # ID -1 means any
                                 'wxPerl rules',  # title
                                 [-1, -1],        # default position
                                 [430, 360],      # size
                                 );
 
    my $panel = Wx::Panel->new( $self,            # parent window
                                -1,               # ID
                                );
    my $button = Wx::Button->new( $panel,         # parent window
                                  -1,             # ID
                                  'Click me!',    # label
                                  [30, 20],       # position
                                  [-1, -1],       # default size
                                  );
    $self->{txt} = Wx::TextCtrl->new(
            $panel,                      # parent window
            -1,                         # control identifier
            "Type your message here",   # default text value
            [10, 50],              # text control position [x, y]
            [400, 20],                  # text control size [width, height]
                         # style: wxTE_MULTILINE=The text control allows multiple lines
    );
    $self->{txt2} = Wx::TextCtrl->new(
            $panel,                      # parent window
            -1,                         # control identifier
            "",   # default text value
            [10, 100],              # text control position [x, y]
            [400, 200],                  # text control size [width, height]
            wxTE_MULTILINE, #=The text control allows multiple lines   style => wxTE_MULTILINE
    );
 
    # register the OnClick method as an handler for the
    # 'button clicked' event. The first argument is a Wx::EvtHandler
    # that receives the event
    EVT_BUTTON( $self, $button, \&OnClick );
 
    return $self;
}
 
# this method receives as its first parameter the first argument
# passed to the EVT_BUTTON function. The second parameter
# always is a Wx::Event subclass
sub OnClick {
    my( $self, $event ) = @_;
 
    if (my $rr = $self->{txt}->GetValue()) {
        print $rr."\n";
 
		$self->{txt2}->AppendText($rr."\n");
    }
 
    $self->SetTitle( 'Clicked' );
}
 
package MyApp;
use base 'Wx::App';
 
sub OnInit {
    my $frame = MyFrame->new;
    $frame->Show( 1 );
}
 
package main;
 
my $app = MyApp->new;
$app->MainLoop;

wx_example

Кода може да се компилира с Cava Packager 2.0. Това чудо прави страхотни екзета от Perl-скриптове, като добавя всички необходими модули.

Perl start from batch file – md5 sum check

Има много хитър начин да си набавим в Windows някои от популярните инструменти в Mac, UNIX, Linux, Android и т.н., като е достатъчно да имаме инсталиран Perl. Ето един пример, как да си набавим md5 sum checker за стрингове от командния ред:

@rem = 'source http://www.dostips.com
@CD/d"%~dp0"&perl -s "%~nx0" %*&Exit/b&:';
 
#perl script starts below here
use strict;
use Digest::MD5  qw(md5_hex);
if($ARGV[0]== ""){
	print "Vyvedi string!!!\n";
	exit;
}
my $md5_data = $ARGV[0];
my $md5_hash = md5_hex( $md5_data );
print "$md5_hash\n";

Запазваме кода в batch-файл, като md5.bat. Добра идея е да го запазим там където имаме достъп, чрез променлива на обвивката, примерно директорията system32. След това си генерираме md5 суми от стрингове директно през промпта:

md5 "proba"

Резултата е: c0a8e1e5e307cc5b33819b387b5f01fd

GTK2 and Perl GUI – simple example

Често ми се налага да правя GUI-та за малки програмки на perl, ruby, python и за това ще постна простичък интерфейс, който показва основните неща:

#!/usr/bin/perl -w
 
use utf8;
use Gtk2 '-init';
use strict;
 
my $buffer;
my $wm   = Gtk2::Window->new;
   $wm->set_title ('GTK2 + Perl GUI');
my $vbox = Gtk2::VBox->new;
my $hbox = Gtk2::HBox->new( 0, 0 );
my $sw   = Gtk2::ScrolledWindow->new( undef, undef );
my $tw   = Gtk2::TextView->new();
my $button = Gtk2::Button->new( "Click me" );
my $entry = Gtk2::Entry->new_with_max_length( 50 );
 
sub create_widgets {
    $wm->signal_connect (destroy => sub { Gtk2->main_quit; });
 
    $wm->set_default_size( 260, 150 );
    $sw->add( $tw );
    $sw->set_policy( 'automatic', 'automatic' );
 
    $button->signal_connect( clicked => sub { \&button_click() } );
 
    $vbox->pack_start($hbox,0,0,0);
    $hbox->set_border_width(2);
 
    $hbox->pack_start( $entry, 0, 0, 0 );
    $hbox->pack_start( $button, 0, 0, 0 );
    $vbox->pack_start( $sw, 1, 1, 0 );
 
    $wm->add( $vbox );
    $wm->show_all();
}
 
create_widgets();
 
sub button_click{
    my $str = $entry->get_text();
    my $buffer = $tw->get_buffer();
    # append text:
    # $buffer->insert ($buffer->get_end_iter, "$str\n");
    $buffer->set_text($str);
}
 
Gtk2->main;

Резултат:
GTK2 Perl Simple Example

Ако все пак нямате инсталиран GTK2 на вашата дистрибуция, можете да го инсталирате така (за Debian базирани):

sudo apt-get install libgtk2.0-dev
sudo apt-get install libgtk2-perl

PoetryHaxor for Linux

Скоро написах една програмка за търсене на рими – PoetryHaxor за Windows. Преработих програмката и за linux, но вместо C++ използвах Perl, че е доста по-лесен.
Работи нормално под Gnome среда, защото GUI-то ползва GTK2.
Тествана е под Debian 2.6.32-5-686 и Ubuntu 11.04 с десктоп Gnome 2.30.2.
Версия на интерпретатора: perl v5.10.1
Изглежда ето така:
PoetryHaxor for linux
За да се стартира програмата се стартира perl-файла poetryhaxor.pl. Това може да се направи по няколко начина. Примерно:

perl poetryhaxor.pl

или да я направим да се отваря с двоен клик:

chmod +x poetryhaxor.pl

Скрипта може да се изтегли от тук: PoetryHaxor 1.0
Ако все пак нямате инсталиран GTK2 на вашата дистрибуция, можете да го инсталирате така (за Debian базирани):

sudo apt-get install libgtk2.0-dev
sudo apt-get install libgtk2-perl