QList<GumboWellFormedError> GumboInterface::error_check() { QList<GumboWellFormedError> errlist; int line_offset = 0; // In case we ever have to revert to earlier versions, please note the following // additional initialization is needed because Microsoft Visual Studio 2013 (and earlier?) // do not properly initialize myoptions from the static const kGumboDefaultOptions defined // in the gumbo library. Instead whatever was in memory at the time is used causing random // issues later on so if reverting remember to keep these specific changes as the bug // they work around took a long long time to track down GumboOptions myoptions = kGumboDefaultOptions; myoptions.tab_stop = 4; myoptions.use_xhtml_rules = true; myoptions.stop_on_first_error = false; myoptions.max_errors = -1; if (!m_source.isEmpty() && (m_output == NULL)) { // fix any non html valid self-closing tags m_source = fix_self_closing_tags(m_source); m_utf8src = m_source.toStdString(); // remove any xml header line and trailing whitespace if (m_utf8src.compare(0,5,"<?xml") == 0) { size_t end = m_utf8src.find_first_of('>', 0); end = m_utf8src.find_first_not_of("\n\r\t\v\f ",end+1); m_utf8src.erase(0,end); line_offset++; } // add in doctype if missing if ((m_utf8src.compare(0,9,"<!DOCTYPE") != 0) && (m_utf8src.compare(0,9,"<!doctype") != 0)) { m_utf8src.insert(0,"<!DOCTYPE html>\n"); line_offset--; } // GumboInterface::m_mutex.lock(); m_output = gumbo_parse_with_options(&myoptions, m_utf8src.data(), m_utf8src.length()); // GumboInterface::m_mutex.unlock(); } const GumboVector* errors = &m_output->errors; for (unsigned int i=0; i< errors->length; ++i) { GumboError* er = static_cast<GumboError*>(errors->data[i]); GumboWellFormedError gperror; gperror.line = er->position.line + line_offset;; gperror.column = er->position.column; // unsigned int typenum = er->type; GumboStringBuffer text; gumbo_string_buffer_init(&text); gumbo_error_to_string(er, &text); std::string errmsg(text.data, text.length); gperror.message = QString::fromStdString(errmsg); gumbo_string_buffer_destroy(&text); errlist.append(gperror); } return errlist; }
QList<GumboWellFormedError> GumboInterface::error_check() { QList<GumboWellFormedError> errlist; int line_offset = 0; GumboOptions myoptions = kGumboDefaultOptions; myoptions.use_xhtml_rules = true; myoptions.tab_stop = 4; // leave this as false to prevent pre-mature stopping when no error exists myoptions.stop_on_first_error = false; if (!m_source.isEmpty() && (m_output == NULL)) { m_utf8src = m_source.toStdString(); // remove any xml header line and trailing whitespace if (m_utf8src.compare(0,5,"<?xml") == 0) { size_t end = m_utf8src.find_first_of('>', 0); end = m_utf8src.find_first_not_of("\n\r\t ",end+1); m_utf8src.erase(0,end); line_offset++; } // add in doctype if missing if ((m_utf8src.compare(0,9,"<!DOCTYPE") != 0) && (m_utf8src.compare(0,9,"<!doctype") != 0)) { m_utf8src.insert(0,"<!DOCTYPE html>\n"); line_offset--; } m_output = gumbo_parse_with_options(&myoptions, m_utf8src.data(), m_utf8src.length()); } const GumboVector* errors = &m_output->errors; for (int i=0; i< errors->length; ++i) { GumboError* er = static_cast<GumboError*>(errors->data[i]); GumboWellFormedError gperror; gperror.line = er->position.line + line_offset;; gperror.column = er->position.column; unsigned int typenum = er->type; GumboStringBuffer text; gumbo_string_buffer_init(&text); gumbo_error_to_string(er, &text); std::string errmsg(text.data, text.length); gperror.message = QString::fromStdString(errmsg); gumbo_string_buffer_destroy(&text); errlist.append(gperror); } return errlist; }
void gumbo_caret_diagnostic_to_string(GumboParser* parser, const GumboError* error, const char* source_text, GumboStringBuffer* output) { gumbo_error_to_string(parser, error, output); const char* line_start = find_last_newline(source_text, error->original_text); const char* line_end = find_next_newline(source_text, error->original_text); GumboStringPiece original_line; original_line.data = line_start; original_line.length = line_end - line_start; gumbo_string_buffer_append_codepoint(parser, '\n', output); gumbo_string_buffer_append_string(parser, &original_line, output); gumbo_string_buffer_append_codepoint(parser, '\n', output); gumbo_string_buffer_reserve( parser, output->length + error->position.column, output); int num_spaces = error->position.column - 1; memset(output->data + output->length, ' ', num_spaces); output->length += num_spaces; gumbo_string_buffer_append_codepoint(parser, '^', output); gumbo_string_buffer_append_codepoint(parser, '\n', output); }