WsParser_VS/libWords/libwords.cpp

119 lines
3.1 KiB
C++

#include "libwords.h"
#include <QtCore/QFile>
#include <QtCore/QTextStream>
using namespace lib_words;
std::shared_ptr<const IPrimitiveWord> WordReader::wordsFrom(QTextStream &tin, const QString& path) const {
auto primary_words = extract_primary(tin, path);
if (!primary_words.size())
return nullptr;
std::shared_ptr<const IPrimitiveWord> prev_ptr = std::make_shared<const WordImpl>(primary_words.last(), nullptr);
for (auto idx = primary_words.size() - 2; idx >= 0; --idx) {
auto content_ptr = primary_words[idx];
prev_ptr = std::make_shared<const WordImpl>(content_ptr, prev_ptr);
}
return prev_ptr;
}
QList<std::shared_ptr<const IWordBase>> lib_words::WordReader::extract_primary(QTextStream& tin, const QString& f) const{
QList<std::shared_ptr<const IWordBase>> ret_list;
int line_number = 1;
while (!tin.atEnd()) {
uint64_t relative_offset = line_number;
relative_offset = relative_offset << 32;
auto line = tin.readLine();
ret_list.append(this->parse_line(relative_offset, line_number++, line, f));
}
return ret_list;
}
#include <QRegExp>
QList<std::shared_ptr<const IWordBase>> WordReader::parse_line(uint64_t start_pos, int row, const QString& line_text, const QString& path) const {
QRegExp split_char("\\s");
auto words = line_text.split(split_char, QString::SplitBehavior::SkipEmptyParts);
QList<std::shared_ptr<const IWordBase>> primary_words;
int columns_offset = 0;
for (auto& w : words) {
auto column_start = line_text.indexOf(w, columns_offset);
auto token = std::make_shared<WordContent>(row, column_start + 1, w, path);
primary_words << token;
columns_offset = column_start + w.length();
}
return primary_words;
}
WordImpl::WordImpl(std::shared_ptr<const IWordBase> content, std::shared_ptr<const IPrimitiveWord> next)
: content_ptr(content), next_ptr(next) { }
QString WordImpl::file() const {
return content_ptr->file();
}
uint64_t WordImpl::position() const {
return content_ptr->position();
}
QString WordImpl::content() const {
return content_ptr->content();
}
int WordImpl::row() const {
return content_ptr->row();
}
int WordImpl::column() const {
return content_ptr->column();
}
std::shared_ptr<const IPrimitiveWord> WordImpl::nextWord() const {
return next_ptr;
}
WordsException::WordsException(const QString& message)
: msg_store(message) { }
QString WordsException::message() const {
return msg_store;
}
WordContent::WordContent(int r, int c, const QString& t, const QString& p)
: row_n(r), col_n(c), doc_offset(r * std::pow(2, 20) + c), text_n(t), path_p(p) { }
QString WordContent::file() const {
return path_p;
}
uint64_t WordContent::position() const {
return doc_offset;
}
QString WordContent::content() const {
return text_n;
}
int WordContent::row() const {
return row_n;
}
int WordContent::column() const {
return col_n;
}
std::shared_ptr<const IPrimitiveWord> WordContent::nextWord() const {
return nullptr;
}
LIBWORDS_EXPORT uint lib_words::qHash(const std::shared_ptr<const IPrimitiveWord>& t, uint seed) noexcept {
if(t)
return qHash(QString("W:%1").arg(t->position()), seed);
return qHash(QString(), seed);
}