void gumbo_print_caret_diagnostic( GumboParser* parser, const GumboError* error, const char* source_text) { GumboStringBuffer text; gumbo_string_buffer_init(parser, &text); gumbo_caret_diagnostic_to_string(parser, error, source_text, &text); printf("%.*s", (int) text.length, text.data); gumbo_string_buffer_destroy(parser, &text); }
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; }
void gumbo_string_buffer_clear(GumboStringBuffer* input) { input->length = 0; if (input->capacity > kDefaultStringBufferSize * 8) { // This approach to clearing means that the buffer can grow unbounded and // tie up memory that may be needed for parsing the rest of the document, so // we free and reinitialize the buffer if its grown more than 3 doublings. gumbo_string_buffer_destroy(input); gumbo_string_buffer_init(input); } }
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; }