Commit a02c6105 authored by Victor Yacovlev's avatar Victor Yacovlev

Implemented #kumir2-1676

parent 12f58ed0
This diff is collapsed.
......@@ -438,6 +438,7 @@ QString Plugin::initialize(const QStringList & parameters, const ExtensionSystem
// qDebug() << "LINE DEBUG: " << QFileInfo(QString(__FILE__)).fileName() << ":" << __LINE__;
actors += loadedPlugins("st_funct");
// qDebug() << "LINE DEBUG: " << QFileInfo(QString(__FILE__)).fileName() << ":" << __LINE__;
QList<QUrl> actorHelpFiles;
foreach (ExtensionSystem::KPlugin* o, actors) {
ActorInterface * actor = qobject_cast<ActorInterface*>(o);
const QString actorName = Shared::actorCanonicalName(actor->localizedModuleName(QLocale::Russian));
......@@ -446,7 +447,7 @@ QString Plugin::initialize(const QStringList & parameters, const ExtensionSystem
QWidget * w = 0;
const QString actorHelpFile = helpPath + o->pluginSpec().name + ".xml";
if (!actor->localizedModuleName(QLocale::Russian).startsWith("_") && QFile(actorHelpFile).exists()) {
helpViewer_->addDocument(QUrl::fromLocalFile(actorHelpFile));
actorHelpFiles.append(QUrl::fromLocalFile(actorHelpFile));
}
if (actor->mainWidget()) {
QWidget * actorWidget = actor->mainWidget();
......@@ -552,6 +553,7 @@ QString Plugin::initialize(const QStringList & parameters, const ExtensionSystem
}
}
helpViewer_->addDocuments(tr("Actor's References"), actorHelpFiles);
// qDebug() << "LINE DEBUG: " << QFileInfo(QString(__FILE__)).fileName() << ":" << __LINE__;
if (!parameters.contains("nostartpage", Qt::CaseInsensitive)) {
......
......@@ -113,14 +113,18 @@ QString ContentView::renderChapter(ModelPtr data) const
return result;
}
QString ContentView::renderAbstract(ModelPtr data) const
QString ContentView::renderAbstract(ModelPtr data, bool wrapInDivClassAbstract) const
{
QString result;
result += "<div class='abstract'>";
if (wrapInDivClassAbstract) {
result += "<div class='abstract'>";
}
foreach (ModelPtr child, data->children()) {
result += renderElement(child);
}
result += "</div>";
if (wrapInDivClassAbstract) {
result += "</div>";
}
return result;
}
......@@ -136,7 +140,7 @@ QString ContentView::renderArticle(ModelPtr data) const
}
}
if (abstract) {
result += renderAbstract(abstract);
result += renderAbstract(abstract, true);
}
result += "<hr/>";
foreach (ModelPtr child, data->children()) {
......@@ -1515,9 +1519,12 @@ QString ContentView::renderSet(ModelPtr data) const
ds << dataPtr;
const QString href = QString::fromLatin1("model_ptr:") +
QString::fromLatin1(buffer.toHex());
result += "<p align=\"left\"><a href=\"" + href +"\">" +
child->title() + "</a></p>\n";
result += "<p margin='10' align='left'>" + child->subtitle() + "</p>";
result += "<h2><a href=\"" + href +"\">" +
child->title() + "</a></h2>\n";
ModelPtr abstract = child->findChildrenOfType(Abstract);
if (abstract) {
result += renderAbstract(abstract, false);
}
}
return result;
......
......@@ -42,7 +42,7 @@ private:
QString renderSet(ModelPtr data) const;
QString renderChapter(ModelPtr data) const;
QString renderArticle(ModelPtr data) const;
QString renderAbstract(ModelPtr data) const;
QString renderAbstract(ModelPtr data, bool wrapInDivClassAbstract) const;
QString renderTOC(ModelPtr data) const;
QString renderTOCElement(ModelPtr data, quint8 level, bool enumerate) const;
QString renderPlainPage(ModelPtr data) const;
......
......@@ -40,6 +40,18 @@ Document DocBookFactory::parseDocument(const QMap<ModelType,QString> roleValues,
return Document(url, content);
}
Document DocBookFactory::createNamedSet(const QString &name, const QList<Document> documents) const
{
ModelPtr namedSetRoot(new DocBookModel(ModelPtr(), Set));
namedSetRoot->title_ = name;
Q_FOREACH(const Document & doc, documents) {
namedSetRoot->children_.append(doc.root_);
doc.root_->parent_ = namedSetRoot;
}
return Document(QUrl(), namedSetRoot);
}
ModelPtr DocBookFactory::parseDocument(
const QMap<ModelType,QString> & roles,
QIODevice *stream,
......@@ -313,7 +325,7 @@ bool DocBookFactory::startElement(
model->xrefLinkEnd_ = atts.value("linkend");
model->xrefEndTerm_ = atts.value("endterm");
}
else if (element == "title" || element == "subtitle") {
else if (element == "title" || element == "subtitle" || element == "titleabbrev") {
buffer_.clear();
}
else if (element == "include" && XInclude.indexIn(namespaceURI)!=-1) {
......@@ -559,6 +571,10 @@ bool DocBookFactory::endElement(const QString &namespaceURI,
root_->title_ = buffer_;
buffer_.clear();
}
else if (root_ && element == "titleabbrev") {
root_->titleAbbrev_ = buffer_;
buffer_.clear();
}
else if (root_ && element == "subtitle") {
root_->subtitle_ = buffer_;
buffer_.clear();
......
......@@ -32,6 +32,7 @@ public:
);
static QMap<QString,ModelPtr> &
updateListOfAlgorithms(ModelPtr root, QMap<QString,ModelPtr> &result);
Document createNamedSet(const QString &name, const QList<Document> documents) const;
......
......@@ -35,6 +35,14 @@ const QString& DocBookModel::title() const
return title_;
}
QString DocBookModel::titleAbbrev() const
{
if (titleAbbrev_.isEmpty())
return title_;
else
return titleAbbrev_;
}
const QString& DocBookModel::subtitle() const
{
return subtitle_;
......@@ -80,6 +88,21 @@ ModelPtr DocBookModel::indexParent() const
return indexParent_;
}
ModelPtr DocBookModel::findChildrenOfType(const ModelType modelType) const
{
ModelPtr result;
foreach (ModelPtr child, children_) {
if (modelType == child->modelType()) {
result = child;
}
else {
result = child->findChildrenOfType(modelType);
}
if (result) break;
}
return result;
}
const QList<ModelPtr>& DocBookModel::children() const
{
return children_;
......
......@@ -36,6 +36,7 @@ public:
ModelType modelType() const;
const QString & id() const;
const QString & title() const;
QString titleAbbrev() const;
const QString & subtitle() const;
const QString & text() const;
const QString & role() const;
......@@ -52,6 +53,8 @@ public:
ModelPtr self() const;
ModelPtr findChildrenOfType(const ModelType modelType) const;
protected /*methods*/:
explicit DocBookModel(ModelPtr parent, const ModelType modelType);
......@@ -64,6 +67,7 @@ protected /*fields*/:
ModelType modelType_;
unsigned short sectionLevel_;
QString title_;
QString titleAbbrev_;
QString subtitle_;
QString text_;
QString id_;
......
......@@ -64,9 +64,14 @@ QAction * DocBookView::viewerAction(const DocBookViewAction type) const
return pImpl_->viewerAction(type);
}
Document DocBookView::addDocument(const QUrl &url, QString *error, int index)
Document DocBookView::addDocument(const QUrl &url, QString *error)
{
return pImpl_->addDocument(url, error, index);
return pImpl_->addDocument(url, error);
}
Document DocBookView::addDocuments(const QString &groupName, const QList<QUrl> &urls, QString *error)
{
return pImpl_->addDocuments(groupName, urls, error);
}
void DocBookView::removeDocument(const Document & existingDocument)
......
......@@ -51,11 +51,8 @@ public:
~DocBookView();
Document addDocument(
const QUrl & url,
QString * error = 0,
int index = -1
);
Document addDocument(const QUrl & url, QString * error = 0);
Document addDocuments(const QString & groupName, const QList<QUrl> & urls, QString * error = 0);
void removeDocument(const Document & existingDocument);
......
......@@ -239,17 +239,38 @@ QAction * DocBookViewImpl::viewerAction(const DocBookView::DocBookViewAction typ
return 0;
}
Document DocBookViewImpl::addDocument(const QUrl &url, QString *error, int index)
Document DocBookViewImpl::addDocument(const QUrl &url, QString *error)
{
DocBookFactory * factory = DocBookFactory::self();
Document doc = factory->parseDocument(roleValues_, url, error);
sidePanel_->addDocument(doc);
sidePanel_->addDocument(doc, true);
if (content_->isEmpty()) {
content_->renderData(doc.root_);
}
return doc;
}
Document DocBookViewImpl::addDocuments(const QString &groupName, const QList<QUrl> &urls, QString *error)
{
DocBookFactory * factory = DocBookFactory::self();
QList<Document> docs;
Q_FOREACH(const QUrl & url, urls) {
Document doc = factory->parseDocument(roleValues_, url, error);
if (doc.root_.isNull()) {
if (error) {
error->prepend(QString("In %1: ").arg(url.toString()));
}
}
else {
docs.append(doc);
}
}
Document set = factory->createNamedSet(groupName, docs);
sidePanel_->addDocument(set, false);
return set;
}
bool DocBookViewImpl::hasAlgorithm(const QString &name) const
{
const ModelPtr algorithm = sidePanel_->findApiFunction(name);
......
......@@ -28,11 +28,9 @@ class DocBookViewImpl
public /* methods */:
explicit DocBookViewImpl(class DocBookView * pClass);
QAction * viewerAction(const DocBookView::DocBookViewAction type) const;
class Document addDocument(
const QUrl & url,
QString * error,
int index
);
class Document addDocument(const QUrl & url, QString * error);
class Document addDocuments(const QString & groupName, const QList<QUrl> & urls, QString * error = 0);
void removeDocument(const Document & existingDocument);
bool hasAlgorithm(const QString & name) const;
......
......@@ -41,11 +41,11 @@ SidePanel::SidePanel(QWidget *parent) :
}
void SidePanel::addDocument(Document document)
void SidePanel::addDocument(Document document, bool bookSetItemsAsTopLevel)
{
QList<ModelPtr> topLevelItems;
if (document.root_) {
if (document.root_->modelType() == Set) {
if (document.root_->modelType() == Set && bookSetItemsAsTopLevel) {
topLevelItems = document.root_->children();
}
else {
......@@ -59,8 +59,11 @@ void SidePanel::addDocument(Document document)
QTreeWidgetItem * item =
new QTreeWidgetItem(ui->contentsNavigator);
ui->contentsNavigator->addTopLevelItem(item);
item->setText(0, model->title());
item->setToolTip(0, model->subtitle());
item->setText(0, model->titleAbbrev());
item->setToolTip(0, model->titleAbbrev() == model->title()
? model->subtitle()
: model->title()
);
createNavigationItems(item, model);
createListOfExamples(model);
createListOfTables(model);
......@@ -206,8 +209,10 @@ void SidePanel::createNavigationItems(QTreeWidgetItem *item,
ModelPtr child = model->children()[i];
if (child->isSectioningNode()) {
QTreeWidgetItem * childItem = new QTreeWidgetItem(item);
childItem->setText(0, child->title());
childItem->setToolTip(0, child->subtitle());
childItem->setText(0, child->titleAbbrev());
childItem->setToolTip(0, child->titleAbbrev() == child->title()
? child->subtitle()
: child->title());
modelsOfItems_[childItem] = child;
itemsOfModels_[child] = childItem;
createNavigationItems(childItem, child);
......@@ -228,7 +233,7 @@ void SidePanel::createListOfExamples(ModelPtr root)
if (listOfExamples) {
QTreeWidgetItem * topLevelItem =
new QTreeWidgetItem(ui->examplesNavigator);
topLevelItem->setText(0, listOfExamples->title());
topLevelItem->setText(0, listOfExamples->titleAbbrev());
topLevelItem->setToolTip(0, tr("List of examples in \"%1\"")
.arg(listOfExamples->title()));
ui->examplesNavigator->addTopLevelItem(topLevelItem);
......@@ -256,7 +261,7 @@ void SidePanel::createListOfTables(ModelPtr root)
if (listOfTables) {
QTreeWidgetItem * topLevelItem =
new QTreeWidgetItem(ui->tablesNavigator);
topLevelItem->setText(0, listOfTables->title());
topLevelItem->setText(0, listOfTables->titleAbbrev());
topLevelItem->setToolTip(0, tr("List of tables in \"%1\"")
.arg(listOfTables->title()));
ui->tablesNavigator->addTopLevelItem(topLevelItem);
......
......@@ -23,7 +23,7 @@ class SidePanel : public QWidget
public:
explicit SidePanel(QWidget *parent = 0);
void addDocument(Document document);
void addDocument(Document document, bool bookSetItemsAsTopLevel);
QList<ModelPtr> loadedDocuments() const;
void saveState(ExtensionSystem::SettingsPtr settings, const QString & prefix);
void restoreState(ExtensionSystem::SettingsPtr settings, const QString & prefix);
......
......@@ -5,7 +5,8 @@
[]
>
<article>
<title>Чертежник</title>
<title>Исполнитель "Чертежник"</title>
<titleabbrev>Чертежник</titleabbrev>
<!--
Write module documentation here.
......
......@@ -6,6 +6,7 @@
>
<article>
<title>Исполнитель "Вертун"</title>
<titleabbrev>Вертун</titleabbrev>
<section>
<title>Общие сведения</title>
<para>
......
......@@ -7,6 +7,7 @@
]>
<article>
<title>Исполнитель "Рисователь"</title>
<titleabbrev>Рисователь</titleabbrev>
<abstract>
<para>
Рисователь -- исполнитель системы Кумир. Назначение Рисователя -- создавать
......
......@@ -7,6 +7,7 @@
]>
<article id="Исполнитель Робот">
<title>Исполнитель "Робот"</title>
<titleabbrev>Робот</titleabbrev>
<section id="Введение">
<title>Введение</title>
<section id="Обстановки Робота">
......
......@@ -5,7 +5,8 @@
[]
>
<article>
<title>Черепаха</title>
<title>Исполнитель "Черепаха"</title>
<titleabbrev>Черепаха</titleabbrev>
<!--
Write module documentation here.
......
......@@ -5,7 +5,8 @@
[]
>
<article>
<title>Водолей</title>
<title>Исполнитель "Водолей"</title>
<titleabbrev>Водолей</titleabbrev>
<!--
Write module documentation here.
......
......@@ -3,10 +3,9 @@
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
[]>
<article xmlns="http://www.oasis-open.org/docbook/xml/4.5/" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>Исполнитель "Файлы"</title>
<subtitle>Чтение и запись файлов</subtitle>
<title>Чтение и запись файлов</title>
<section>
<title>Использование исполнителя</title>
<title>Использование исполнителя "Файлы"</title>
<para>
В версиях Кумир для начальных и средних классов алгоритмы работы с файлами
находятся в исполнителе <code role="кумир">Файлы</code>.
......
......@@ -3,10 +3,9 @@
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
[]>
<article xmlns="http://www.oasis-open.org/docbook/xml/4.5/" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>Исполнитель "Строки"</title>
<subtitle>Алгоритмы обработки строк</subtitle>
<title>Алгоритмы обработки строк</title>
<section>
<title>Использование исполнителя</title>
<title>Использование исполнителя "Строки"</title>
<para>
В версиях Кумир для начальных и средних классов алгоритмы работы со строками
находятся в исполнителе <code role="кумир">Строки</code>.
......
......@@ -3,22 +3,24 @@
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
[]>
<article xmlns="http://www.oasis-open.org/docbook/xml/4.5/" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>Исполнители "Строки" и "Файлы"</title>
<subtitle>Обработка строк и работа с файлами</subtitle>
<para>
В версиях Кумир для старших классов и Кумир для олимпиад
исполнители <code role="кумир">Строки</code> и <code role="кумир">Файлы</code>
входят в базовую часть языка программирования.
</para>
<para>
Таким образом, явное подключение этих исполнителя с помощью оператора
<code role="кумир">использовать</code> не требуется. В то же время, явное использование не будет
считаться ошибкой.
</para>
<para>Описание алгоритмов работы со строками находятся в описании языка Кумир
<xref linkend="string-utils"></xref>.
</para>
<para>Описание алгоритмов работы с файлами находится в описании языка Кумир
<xref linkend="files"></xref>.
</para>
<title>Примечания к версии</title>
<section>
<title>Исполнители "Строки" и "Файлы"</title>
<para>
В версиях Кумир для старших классов и Кумир для олимпиад
исполнители <code role="кумир">Строки</code> и <code role="кумир">Файлы</code>
входят в базовую часть языка программирования.
</para>
<para>
Таким образом, явное подключение этих исполнителя с помощью оператора
<code role="кумир">использовать</code> не требуется. В то же время, явное использование не будет
считаться ошибкой.
</para>
<para>Описание алгоритмов работы со строками находятся в описании языка Кумир
<xref linkend="string-utils"></xref>.
</para>
<para>Описание алгоритмов работы с файлами находится в описании языка Кумир
<xref linkend="files"></xref>.
</para>
</section>
</article>
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment