package Kephra::File::IO;
our $VERSION = '0.20';
use strict;
use warnings;
# read a file into a scintilla buffer, is much faster then open_buffer
sub open_buffer {
my $doc_nr = shift;
my $file = shift || Kephra::Document::Data::get_file_path($doc_nr);
my $ep = shift || Kephra::Document::Data::_ep($doc_nr);
my $err_txt= Kephra::API::localisation->{dialog}{error};
my $input;
unless ($file) {
Kephra::Dialog::warning_box("file_read " . $err_txt->{no_param}, $err_txt->{general} );
} else {
unless ( -r $file ) {
Kephra::Dialog::warning_box( $err_txt->{file_read} . " " . $file, $err_txt->{file} );
} else {
my $did_open = open my $FH,'<', $file;
unless ($did_open){
Kephra::Dialog::warning_box($err_txt->{file_read} . " $file", $err_txt->{file});
return 0;
}
my $codepage = Kephra::Document::Data::get_attribute('codepage', $doc_nr);
if ($codepage eq 'auto'){
binmode $FH;
read $FH, my $probe, 20000;
if ($probe){
my $enc = Encode::Guess::guess_encoding( $probe, 'latin1' );
seek $FH, 0, 0;
$codepage = $enc =~ /utf8/ ? 'utf8' : '8bit';
Kephra::Document::Data::set_attribute('codepage', $codepage, $doc_nr);
} else {
$codepage = Kephra::File::_config->{defaultsettings}{new}{codepage};
}
Kephra::Document::Data::set_attribute('codepage', $codepage, $doc_nr);
}
binmode $FH, $codepage eq 'utf8' ? ":utf8" : ":raw"; # ":encoding(utf8)"
Kephra::EventTable::freeze('document.text.change');
my $content = do { local $/; <$FH> };
$ep->AddText( $content ) if defined $content;
Kephra::EventTable::thaw('document.text.change');
return 1;
}
}
return 0;
}
# wite into file from buffer variable
sub write_buffer {
my $doc_nr = shift || Kephra::Document::Data::current_nr();
my $file = shift || Kephra::Document::Data::get_file_path($doc_nr);
my $ep = shift || Kephra::Document::Data::_ep($doc_nr);
my $err_txt = Kephra::API::localisation->{dialog}{error};
# check if there is a name or if file that you overwrite is locked
if ( not $file or (-e $file and not -w $file) ) {
Kephra::Dialog::warning_box
("file_write " . $err_txt->{'no_param'}, $err_txt->{general} );
} else {
my $codepage = Kephra::Document::Data::get_attribute('codepage', $doc_nr);
my $did_open = open my $FH, '>', $file;
unless ($did_open){
Kephra::Dialog::warning_box($err_txt->{file_write} . " $file", $err_txt->{file} );
return 0;
}
binmode $FH, $codepage eq 'utf8' ? ":utf8" : ":raw"; # ":encoding(utf8)"
print $FH $ep->GetText();
}
}
sub get_age {
my $file = shift;
return (stat $file)[9] if -e $file;
}
1;