package Kephra::Config;
our $VERSION = '0.35';
use strict;
use warnings;
use Cwd();
use File::Spec ();
#
# Files and Dirs
#
my $dir;
sub _dir { if (defined $_[0]) {$dir = $_[0]} else {$dir} }
# Generate a path to a configuration file
sub filepath { File::Spec->catfile( $dir, @_ ) if $_[0] }
sub existing_filepath {
my $path = filepath( @_ );
unless ( -f $path ) {
warn("The config file '$path' does not exist");
}
return $path;
}
sub path_from_node {
my $node = shift;
return unless defined $node and ref $node eq 'HASH';
if (exists $node->{file}){
if (exists $node->{directory}){
return filepath($node->{directory}, $node->{file});
} else {
return filepath($node->{file});
}
} else { warn "Wrong node to build config path from." }
}
sub dirpath { File::Spec->catdir( $dir, @_ ) }
sub existing_dirpath {
my $path = dirpath( @_ );
unless ( -d $path ) {
warn("The config directory '$path' does not exist");
}
return $path;
}
sub standartize_path_slashes { File::Spec->canonpath( shift ) }
sub path_matches {
my $given = shift;
return unless defined $given and $given and @_;
for my $path (@_) {
return 1 if defined $path
and index (standartize_path_slashes($path), $given) > -1;
}
return 0;
}
sub open_file { open_file_absolute( filepath(@_) ) }
sub open_file_absolute {
Kephra::Document::add( $_[0] );
Kephra::Document::Data::set_attribute('config_file',1);
Kephra::App::TabBar::refresh_current_label();
}
#
# Wx GUI Stuff
#
# Create a Wx::Colour from a config string
# Either hex "0066FF" or decimal "0,128,255" is allowed.
sub color {
my $string = shift;
return Kephra::App::warn("Color string is not defined") unless defined $string;
# Handle hex format
$string = lc $string;
if ( $string =~ /^([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i ) {
return Wx::Colour->new( hex $1, hex $2, hex $3 );
}
# Handle comma-seperated
if ( $string =~ /^(\d+),(\d+),(\d+)$/ ) {
return Wx::Colour->new( $1 + 0, $2 + 0, $3 + 0 );
}
# Unknown
die "Unknown color string '$string'";
}
# Create an icon bitmap Wx::Bitmap for a named icon
sub icon_bitmap {
# Find the path from the name
my $name = shift;
unless ( defined $name ) {
warn "Did not provide an icon name to icon_bitmap";
return;
}
$name .= '.xpm' unless $name =~ /\.xpm$/ ;
my $path = filepath( Kephra::API::settings()->{app}{iconset_path}, $name );
return Wx::Bitmap->new(16,16) unless -e $path;
my $bitmap = Wx::Bitmap->new( $path, &Wx::wxBITMAP_TYPE_ANY );
unless ( $bitmap ) {
warn "Failed to create bit map from $path";
return;
}
return $bitmap;
}
sub set_xp_style {
my $xp_def_file = "$^X.manifest";
if ( $^O eq 'MSWin32' ) {
if ( ( Kephra::API::settings()->{app}{xp_style} eq '1' )
and ( !-r $xp_def_file ) ) {
Kephra::Config::Default::drop_xp_style_file($xp_def_file);
}
if ( ( Kephra::API::settings()->{app}{xp_style} eq '0' )
and ( -r $xp_def_file ) ) {
unlink $xp_def_file;
}
}
}
#
# misc helper stuff
#
sub build_fileendings2syntaxstyle_map {
foreach ( keys %{ Kephra::API::settings()->{file}{endings} } ) {
my $language_id = $_;
my @fileendings
= split( /\s+/, Kephra::API::settings()->{file}{endings}{$language_id} );
foreach ( @fileendings ) {
$Kephra::temp{file}{end2langmap}{$_} = $language_id;
}
}
}
sub build_fileendings_filterstring {
my $l18n = Kephra::Config::Localisation::strings()->{dialog};
my $files = $l18n->{file}{files};
my $all = $l18n->{general}{all} . " $files ";
$all .= $^O =~ /win/i
? "(*.*)|*.*"
: "(*)|*";
my $tfile = $Kephra::temp{file};
$tfile->{filterstring}{all} = $all;
my $conf = Kephra::API::settings()->{file};
foreach ( keys %{$conf->{group}} ) {
my ( $filter_id, $file_filter ) = ( $_, '' );
my $filter_name = ucfirst($filter_id);
my @language_ids = split( /\s+/, $conf->{group}{$filter_id} );
foreach ( @language_ids ) {
my @fileendings = split( /\s+/, $conf->{endings}{$_} );
foreach (@fileendings) { $file_filter .= "*.$_;"; }
}
chop($file_filter);
$tfile->{filterstring}{all} .= "|$filter_name $files ($file_filter)|$file_filter";
}
$tfile->{filterstring}{config} = "Config $files (*.conf;*.yaml)|*.conf;*.yaml|$all";
$tfile->{filterstring}{scite} = "Scite $files (*.ses)|*.ses|$all";
}
sub _map2hash {
my ( $style, $types_str ) = @_;
my $stylemap = {}; # holds the style map
my @types = split( /\s+/, $types_str );
foreach (@types) { $$stylemap{$_} = $style; }
return ($stylemap);
}
sub _lc_utf {
my $uc = shift;
my $lc = "";
for ( 0 .. length($uc) - 1 ) {
$lc .= lcfirst( substr( $uc, $_, 1 ) );
}
$lc;
}
#pce:dialog::msg_box(undef,$mode,''); #Wx::wxUNICODE()
1;
=head1 NAME
Kephra::Config - low level config stuff and basics
=head1 DESCRIPTION
=cut