void ClassesWidget::import_ocad_iofxml() { qfLogFuncFrame(); QString fn = qfd::FileDialog::getOpenFileName(this, tr("Open file"), QString(), "XML files (*.xml);; All files (*)"); if(fn.isEmpty()) return; try { QFile f(fn); if(f.open(QFile::ReadOnly)) { QDomDocument xdoc; QString err_str; int err_line; if(!xdoc.setContent(&f, &err_str, &err_line)) QF_EXCEPTION(QString("Error parsing xml file '%1' at line: %2").arg(err_str).arg(err_line)); QDomNodeList xml_courses = xdoc.elementsByTagName(QStringLiteral("Course")); QList<CourseDef> defined_courses_list; for (int i = 0; i < xml_courses.count(); ++i) { QDomElement el_course = xml_courses.at(i).toElement(); if(el_course.isNull()) QF_EXCEPTION(QString("Xml file format error: bad element '%1'").arg("Course")); CourseDef coursedef; QString course_name = element_text(el_course, QStringLiteral("CourseName")); course_name.replace(' ', QString()); course_name.replace(';', '-'); course_name.replace(',', '-'); course_name.replace(':', '-'); course_name.replace('+', '-'); coursedef.setName(course_name); QStringList class_names; QDomNodeList xml_classes = el_course.elementsByTagName(QStringLiteral("ClassShortName")); for (int j = 0; j < xml_classes.count(); ++j) { QString class_name = xml_classes.at(j).toElement().text().trimmed(); class_names << class_name; } coursedef.setClasses(class_names); QDomElement el_course_variantion = el_course.firstChildElement(QStringLiteral("CourseVariation")); if(el_course_variantion.isNull()) QF_EXCEPTION(QString("Xml file format error: missing element '%1'").arg("CourseVariation")); coursedef.setLenght(element_text(el_course_variantion, QStringLiteral("CourseLength")).trimmed().toInt()); coursedef.setClimb(element_text(el_course_variantion, QStringLiteral("CourseClimb")).trimmed().toInt()); QMap<int, QVariant> codes; QDomNodeList xml_controls = el_course.elementsByTagName(QStringLiteral("CourseControl")); for (int j = 0; j < xml_controls.count(); ++j) { QDomElement el_control = xml_controls.at(j).toElement(); int no = element_text(el_control, QStringLiteral("Sequence")).trimmed().toInt(); if(no <= 0) QF_EXCEPTION(QString("Xml file format error: bad sequence number %1 in %2").arg(no).arg(dump_element(el_control))); int code = element_text(el_control, QStringLiteral("ControlCode")).trimmed().toInt(); if(code <= 0) QF_EXCEPTION(QString("Xml file format error: bad control code %1 in %2").arg(code).arg(dump_element(el_control))); codes[no] = code; } coursedef.setCodes(codes.values()); defined_courses_list << coursedef; } importCourses(defined_courses_list); } } catch (const qf::core::Exception &e) { qf::qmlwidgets::framework::MainWindow *fwk = qf::qmlwidgets::framework::MainWindow::frameWork(); qf::qmlwidgets::dialogs::MessageBox::showException(fwk, e); } }
/* 2149 */ void isolate_last_space (ELEMENT *current, enum element_type element_type) { ELEMENT *last = last_contents_child (current); if (!element_type) element_type = ET_spaces_at_end; if (last) { int index = -1; ELEMENT *indexed_elt; /* Ignore space before a misc command that is last on line. (I don't understand this. ) */ if (element_contents_number (current) > 1) { if (last->cmd) { if (command_flags(last) & CF_misc) index = -2; } } indexed_elt = contents_child_by_index (current, index); if (indexed_elt) { char *text = element_text (indexed_elt); if (!text || !*text) return; if (indexed_elt->type == ET_NONE) { int text_len = strlen (text); /* 2170 */ /* Does the text end in whitespace? */ if (strchr (whitespace_chars, text[text_len - 1])) { /* If text all whitespace */ if (text[strspn (text, whitespace_chars)] == '\0') indexed_elt->type = element_type; else { /* 2173 */ ELEMENT *new_spaces; int i, trailing_spaces; /* "strrcspn" */ trailing_spaces = 0; for (i = strlen (text) - 1; i > 0 && strchr (whitespace_chars, text[i]); i--) trailing_spaces++; new_spaces = new_element (element_type); text_append_n (&new_spaces->text, text + text_len - trailing_spaces, trailing_spaces); text[text_len - trailing_spaces] = '\0'; if (index == -1) add_to_element_contents (current, new_spaces); else insert_into_contents (current, new_spaces, -1); } } } } } }