Merge pull request #1094 from ONLYOFFICE/fix/x2ttester

Fix bug 60093
This commit is contained in:
Oleg Korshul
2022-12-20 15:04:28 +03:00
committed by GitHub
3 changed files with 103 additions and 6 deletions

View File

@ -30,6 +30,27 @@ You need to create an xml configuration file. It must contain:
# (non-required) timestamp in report file name (default - 1)
<timestamp> </timestamp>
# (non-required) is take params for csv/txt conversions from filename (default - 1).
<filenameCsvTxtParams> </filenameCsvTxtParams>
# params in any order, in any place, delimiter is unicode code in hex
# encoding is case sensitive
# input file with csv:
filename[cp(codepage)][del%(unicode code)]
# example:
some_csv_file[cpUTF-8][del%3b].csv
# same with txt file, but only encoding:
filename[cp(codepage)]
# example
some_txt_file[cpUTF-8].txt
# (non-required) default encoding for csv/txt files, if filenameCsvTxtParams is 0, or no param in filename (default - UTF-8)
<defaultCsvTxtEncoding> </defaultCsvTxtEncoding>
# (non-required) default unicode code delimiter for csv files, if filenameCsvTxtParams is 0, or no param in filename (default - 3b)
<defaultCsvDelimiter> </defaultCsvDelimiter>
# (non-required) path to xml file with a list of input files
<inputFilesList> </inputFilesList>

View File

@ -210,6 +210,9 @@ Cx2tTester::Cx2tTester(const std::wstring& configPath)
m_bIsErrorsOnly = false;
m_bIsTimestamp = true;
m_bIsDeleteOk = false;
m_bIsfilenameCsvTxtParams = true;
m_defaultCsvDelimiter = L";";
m_defaultCsvTxtEndcoding = L"UTF-8";
m_inputFormatsList.SetDefault();
m_outputFormatsList.SetOutput();
SetConfig(configPath);
@ -277,10 +280,13 @@ void Cx2tTester::SetConfig(const std::wstring& configPath)
else if(name == L"outputDirectory") m_outputDirectory = node.GetText();
else if(name == L"x2tPath") m_x2tPath = node.GetText();
else if(name == L"cores") m_maxProc = std::stoi(node.GetText());
else if(name == L"errorsOnly") m_bIsErrorsOnly = std::stoi(node.GetText());
else if(name == L"timestamp") m_bIsTimestamp = std::stoi(node.GetText());
else if(name == L"deleteOk") m_bIsDeleteOk = std::stoi(node.GetText());
else if(name == L"inputFilesList")
else if(name == L"errorsOnly" && !node.GetText().empty()) m_bIsErrorsOnly = std::stoi(node.GetText());
else if(name == L"timestamp" && !node.GetText().empty()) m_bIsTimestamp = std::stoi(node.GetText());
else if(name == L"deleteOk" && !node.GetText().empty()) m_bIsDeleteOk = std::stoi(node.GetText());
else if(name == L"filenameCsvTxtParams" && !node.GetText().empty()) m_bIsfilenameCsvTxtParams = std::stoi(node.GetText());
else if(name == L"defaultCsvTxtEncoding" && !node.GetText().empty()) m_defaultCsvTxtEndcoding = node.GetText();
else if(name == L"defaultCsvDelimiter" && !node.GetText().empty()) m_defaultCsvDelimiter = (wchar_t)std::stoi(node.GetText(), nullptr, 16);
else if(name == L"inputFilesList" && !node.GetText().empty())
{
XmlUtils::CXmlNode files_list_root;
XmlUtils::CXmlNodes files_list_nodes;
@ -300,14 +306,14 @@ void Cx2tTester::SetConfig(const std::wstring& configPath)
std::cerr << "Input files list is not open!" << std::endl;
}
}
else if(name == L"input")
else if(name == L"input" && !node.GetText().empty())
{
default_input_formats = false;
std::wstring extensions = node.GetText();
extensions += L' ';
m_inputFormats = ParseExtensionsString(extensions, m_inputFormatsList);
}
else if(name == L"output")
else if(name == L"output" && !node.GetText().empty())
{
default_output_formats = false;
std::wstring extensions = node.GetText();
@ -405,6 +411,7 @@ void Cx2tTester::Start()
for(int i = 0; i < files.size(); i++)
{
std::wstring& input_file = files[i];
std::wstring input_filename = NSFile::GetFileName(input_file);
std::wstring input_ext = L'.' + NSFile::GetFileExtention(input_file);
int input_format = COfficeFileFormatChecker::GetFormatByExtension(input_ext);
@ -449,6 +456,38 @@ void Cx2tTester::Start()
}
}
std::wstring csvTxtEncodingS = m_defaultCsvTxtEndcoding;
std::wstring csvDelimiter = m_defaultCsvDelimiter;
// setup csv & txt additional params
if(m_bIsfilenameCsvTxtParams
|| input_format == AVS_OFFICESTUDIO_FILE_DOCUMENT_TXT
|| input_format == AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV)
{
std::wstring find_str = L"[cp";
size_t pos1 = input_filename.find(find_str);
size_t pos2 = input_filename.find(L"]", pos1 + 1);
if(pos1 != std::wstring::npos && pos2 != std::wstring::npos)
csvTxtEncodingS = input_filename.substr(pos1 + find_str.size(), pos2 - pos1 - find_str.size());
}
int csvTxtEncoding;
for(auto &val : NSUnicodeConverter::Encodings)
if(val.Name == U_TO_UTF8(csvTxtEncodingS))
{
csvTxtEncoding = val.Index;
break;
}
if(m_bIsfilenameCsvTxtParams || input_format == AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV)
{
std::wstring find_str = L"[del%";
size_t pos1 = input_filename.find(find_str);
size_t pos2 = input_filename.find(L"]", pos1 + 1);
if(pos1 != std::wstring::npos && pos2 != std::wstring::npos)
csvDelimiter = (wchar_t)std::stoi(input_filename.substr(pos1 + find_str.size(), pos2 - pos1 - find_str.size()), nullptr, 16);
}
// setup folder for output files
if(NSDirectory::Exists(output_files_directory))
NSDirectory::DeleteDirectory(output_files_directory);
@ -473,6 +512,8 @@ void Cx2tTester::Start()
converter->SetErrorsOnly(m_bIsErrorsOnly);
converter->SetDeleteOk(m_bIsDeleteOk);
converter->SetXmlErrorsDirectory(m_errorsXmlDirectory);
converter->SetCsvTxtEncoding(csvTxtEncoding);
converter->SetCsvDelimiter(csvDelimiter);
converter->SetFilesCount(files.size(), i + 1);
converter->DestroyOnFinish();
m_currentProc++;
@ -617,6 +658,14 @@ void CConverter::SetXmlErrorsDirectory(const std::wstring& errorsXmlDirectory)
{
m_errorsXmlDirectory = errorsXmlDirectory;
}
void CConverter::SetCsvTxtEncoding(int csvTxtEncoding)
{
m_csvTxtEncoding = csvTxtEncoding;
}
void CConverter::SetCsvDelimiter(std::wstring csvDelimiter)
{
m_csvDelimiter = csvDelimiter;
}
void CConverter::SetFilesCount(int totalFiles, int currFile)
{
m_totalFiles = totalFiles;
@ -692,6 +741,23 @@ DWORD CConverter::ThreadProc()
builder.WriteString(L"</format><aspect>2</aspect><first>false</first><zip>false</zip><width>1000</width><height>1000</height></m_oThumbnail>");
}
// csv & txt needs encoding param
if(m_inputFormat == AVS_OFFICESTUDIO_FILE_DOCUMENT_TXT || m_inputFormat == AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV)
{
builder.WriteString(L"<m_nCsvTxtEncoding>");
builder.WriteEncodeXmlString(std::to_wstring(m_csvTxtEncoding));
builder.WriteString(L"</m_nCsvTxtEncoding>");
}
// csv needs delimiter param
if(m_inputFormat == AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV)
{
builder.WriteString(L"<m_nCsvDelimiterChar>");
builder.WriteEncodeXmlString(m_csvDelimiter);
builder.WriteString(L"</m_nCsvDelimiterChar>");
}
builder.WriteString(L"<m_sJsonParams>{&quot;spreadsheetLayout&quot;:{&quot;gridLines&quot;:true,&quot;headings&quot;:true,&quot;fitToHeight&quot;:1,&quot;fitToWidth&quot;:1,&quot;orientation&quot;:&quot;landscape&quot;}}</m_sJsonParams>");
builder.WriteString(L"</Root>");

View File

@ -19,6 +19,7 @@
#include "../../../DesktopEditor/fontengine/ApplicationFontsWorker.h"
#include "../../../OfficeUtils/src/OfficeUtils.h"
#include "../../../UnicodeConverter/UnicodeConverter_Encodings.h"
class CFormatsList
{
@ -125,6 +126,10 @@ private:
bool m_bIsErrorsOnly;
bool m_bIsTimestamp;
bool m_bIsDeleteOk;
bool m_bIsfilenameCsvTxtParams;
std::wstring m_defaultCsvTxtEndcoding;
std::wstring m_defaultCsvDelimiter;
DWORD m_timeStart;
};
@ -145,6 +150,8 @@ public:
void SetErrorsOnly(bool bIsErrorsOnly);
void SetDeleteOk(bool bIsDeleteOk);
void SetXmlErrorsDirectory(const std::wstring& errorsXmlDirectory);
void SetCsvTxtEncoding(int csvTxtEncoding);
void SetCsvDelimiter(std::wstring csvDelimiter);
void SetFilesCount(int totalFiles, int currFile);
virtual DWORD ThreadProc();
@ -164,6 +171,9 @@ private:
std::wstring m_x2tPath;
std::wstring m_errorsXmlDirectory;
int m_csvTxtEncoding;
std::wstring m_csvDelimiter;
bool m_bIsErrorsOnly;
bool m_bIsDeleteOk;