180 lines
3.2 KiB
C++
Executable File
180 lines
3.2 KiB
C++
Executable File
/*
|
|
* This file is a part of Winix
|
|
* and is not publicly distributed
|
|
*
|
|
* Copyright (c) 2011-2012, Tomasz Sowa
|
|
* All rights reserved.
|
|
*
|
|
*/
|
|
|
|
#include "patterns.h"
|
|
#include "core/log.h"
|
|
|
|
|
|
|
|
|
|
Patterns::Patterns()
|
|
{
|
|
utf8 = false;
|
|
del_white_items = false;
|
|
ezc_fun = 0;
|
|
locale = 0;
|
|
locale_filter = 0;
|
|
}
|
|
|
|
|
|
|
|
void Patterns::SetUTF8(bool _utf8)
|
|
{
|
|
utf8 = _utf8;
|
|
}
|
|
|
|
|
|
void Patterns::SetDeleteWhiteItems(bool del_white)
|
|
{
|
|
del_white_items = del_white;
|
|
}
|
|
|
|
|
|
void Patterns::SetDirectories(const std::wstring & tmpl_dir, const std::wstring & tmpl_dir_def)
|
|
{
|
|
templates_dir = tmpl_dir;
|
|
templates_dir_def = tmpl_dir_def;
|
|
}
|
|
|
|
|
|
|
|
|
|
void Patterns::SetLocale(Locale * plocale)
|
|
{
|
|
locale = plocale;
|
|
}
|
|
|
|
|
|
void Patterns::SetLocaleFilter(LocaleFilter * plocale_filter)
|
|
{
|
|
locale_filter = plocale_filter;
|
|
}
|
|
|
|
|
|
void Patterns::SetEzcFunctions(TemplatesFunctions::EzcFun * fun)
|
|
{
|
|
ezc_fun = fun;
|
|
}
|
|
|
|
|
|
size_t Patterns::Add(const wchar_t * file_name, bool read_pattern)
|
|
{
|
|
for(size_t i=0 ; i<pat_tab.size() ; ++i)
|
|
{
|
|
if( pat_tab[i].references > 0 && pat_tab[i].file_name == file_name )
|
|
{
|
|
pat_tab[i].references += 1;
|
|
return i;
|
|
}
|
|
}
|
|
|
|
template_temp.to_delete = false;
|
|
template_temp.file_name = file_name;
|
|
template_temp.references = 1;
|
|
template_temp.patterns.clear();
|
|
pat_tab.push_back(template_temp);
|
|
|
|
if( read_pattern )
|
|
ReadPatterns(pat_tab.back());
|
|
|
|
return pat_tab.size()-1;
|
|
}
|
|
|
|
|
|
size_t Patterns::Add(const std::wstring & file_name, bool read_pattern)
|
|
{
|
|
return Add(file_name.c_str(), read_pattern);
|
|
}
|
|
|
|
|
|
|
|
void Patterns::ReadPatterns(Template & templ)
|
|
{
|
|
size_t len = locale->Size();
|
|
templ.patterns.resize(len);
|
|
|
|
for(size_t i=0 ; i<len ; ++i)
|
|
{
|
|
templ.patterns[i].UTF8(utf8);
|
|
templ.patterns[i].DeleteWhiteTextItems(del_white_items);
|
|
templ.patterns[i].Directory(templates_dir, templates_dir_def);
|
|
templ.patterns[i].ParseFile(templ.file_name);
|
|
|
|
if( ezc_fun )
|
|
templ.patterns[i].CacheFunctions(*ezc_fun);
|
|
|
|
locale_filter->Filter(templ.patterns[i], *locale, i);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
Ezc::Pattern * Patterns::Get(size_t index, size_t lang_id)
|
|
{
|
|
if( index >= pat_tab.size() || pat_tab[index].references == 0 )
|
|
return 0;
|
|
|
|
size_t lang_index = locale->IdToIndex(lang_id);
|
|
|
|
if( lang_index >= pat_tab[index].patterns.size() )
|
|
return 0;
|
|
|
|
return &pat_tab[index].patterns[lang_index];
|
|
}
|
|
|
|
|
|
const std::wstring & Patterns::GetFileName(size_t index)
|
|
{
|
|
if( index >= pat_tab.size() || pat_tab[index].references == 0 )
|
|
return empty_str;
|
|
|
|
return pat_tab[index].file_name;
|
|
}
|
|
|
|
|
|
void Patterns::Reload()
|
|
{
|
|
for(size_t i=0 ; i<pat_tab.size() ; ++i)
|
|
if( pat_tab[i].references > 0 )
|
|
ReadPatterns(pat_tab[i]);
|
|
}
|
|
|
|
|
|
void Patterns::Clear()
|
|
{
|
|
pat_tab.clear();
|
|
}
|
|
|
|
|
|
void Patterns::Erase(size_t index)
|
|
{
|
|
if( index < pat_tab.size() && pat_tab[index].references > 0 )
|
|
{
|
|
pat_tab[index].references -= 1;
|
|
|
|
if( pat_tab[index].references == 0 )
|
|
{
|
|
log << log3 << "Patterns: removing pattern: " << pat_tab[index].file_name << logend;
|
|
|
|
pat_tab[index].file_name.clear();
|
|
pat_tab[index].patterns.clear();
|
|
// don't erase pat_tab.erase() here
|
|
// because indices would be invalidated
|
|
// those gaps will be cleared when Clear() method is called
|
|
// normally in reload/templates winix function
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
size_t Patterns::Size()
|
|
{
|
|
return pat_tab.size();
|
|
}
|