crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Программа для создания электронных книг, Обсуждение программы и кода
xwicked
  опции профиля:
сообщение 8.8.2011, 20:36
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 66
Регистрация: 2.8.2011
Из: Старый Оскол
Пользователь №: 2781

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте! Вот вторая моя программа, написанная на C++(Qt). Выношу на обсуждение её и исходник - 0.0.7.

Ссылка на SourceForge.net. Код под GNU GPL v2 - OpenSource.

Она предназначена для создания электронных книг, с централизованным хранением в базе данных SQLite3.

Этот код публикуется впервые. Его не было нигде, включая репозиторий программ Sisyphus от дистрибутива AltLinux. Там был только Клёст-кроссворд(0.1.9, 0.2.0). Комментируем Windows-версия.

Описание:
Страница книги представляет собой одну переменную QString Page.
Текст книги отображается в компоненте QTextEdit TextBook.
Текст в компоненте TextBook имеет форматирование документа HTML. Поэтому редактирование текста страницы осуществляется редактированием html-кода.

Стандартное сохранение идёт в базу данных. Но есть и возможность экспорта в файл.

Изображения хранятся, как в обычной html-странице - отдельно от текста в папке "temp". В тексте указывается путь.
При загрузке книги - во всех страницах происходит перезапись тегов изображения "<img src=":
      QString str1;
      int iFirst,
          iLast,
          iLength,
          iSearch;
          for(int i = 0; i < ListPages.count(); i++)
              {
                  str1 = ListPages.at(i);
                      if(str1.indexOf("<img src=\"") != -1)
                          {
                               int z = 1;
                               iSearch = 0;
                                   while(str1.indexOf("<img src=\"", iSearch) != -1)
                                       {
                                                if(z == 1) iSearch = -1;
                                                if(iSearch == -1)
                                                    {
                                                         iFirst = str1.indexOf("<img src=\"", 0);
                                                         iLast = str1.indexOf("/temp/Image", 0);
                                                         z++;
                                                    }
                                                else
                                                    {
                                                         iFirst = str1.indexOf("<img src=\"", iSearch);
                                                         iLast = str1.indexOf("/temp/Image", iFirst);
                                                    }
                                            iFirst += 10;
                                            iLength = iLast - iFirst;
                                            str1.remove(iFirst, iLength);
                                            str1.insert(iFirst, "/tmp/xwel");
                                            ListPages.replace(i, str1);
                                            iSearch = iLast;
                                       }
                          }
              }
Это актуально для переносимой версии. В этом случае необходимо будет поменять строку:
str1.insert(iFirst, "/tmp/xwel");
на
str1.insert(iFirst, QApplication::applicationDirPath());//Текущая папка, из которой запущено приложение
Пароль книги хранится в открытом виде в переменной QString Password.
Список страниц хранится в списке строк QStringList ListPages.
Изображения хранятся в массиве QByteArray ListImages[255]. Здесь видно, что изображений на всю книгу 255.

Сохранение в базу происходит обычными SQL-запросами:
      strBook = "DROP TABLE Table" + sNumBook + ";";
      QueryBook.exec(strBook);
      strBook = "CREATE TABLE Table" + sNumBook + " (Pages VARCHAR, Images BLOB);";
      QueryBook.exec(strBook);
      ...
      //Сохранение страниц
      if(ListPages.count() != 0)
          for(int i = 0; i < ListPages.count(); i++)
              {
                 QueryBook.prepare("INSERT INTO Table" + sNumBook + " (Pages) VALUES (?);");
                 QueryBook.bindValue(0, ListPages.at(i));
                 QueryBook.exec(/*strBook*/);
              }
      //Сохранение изображений
          for(int i = 0; i < 75; i++)//Здесь видно - что сохраняются только 75 изображений(!) из 255 :(
              {
                    if(ListImages[i].count() != 0)
                       {
                          QueryBook.prepare("INSERT INTO Table" + sNumBook + " (Images) VALUES (?);");
                          QueryBook.bindValue(0, ListImages[i]);
                          QueryBook.exec(/*strBook*/);
                       }
                   else break;
       }
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
xwicked
  опции профиля:
сообщение 12.8.2011, 21:11
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 66
Регистрация: 2.8.2011
Из: Старый Оскол
Пользователь №: 2781

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте!

Следующая версия программы 0.0.8. Исходник + сборки. Её ключевой особенностью является импорт html-файла. Вот функция:
void ElectronicLibrary::OpenHTMLFile()
{
     QString FileNameBook, str, sHTML;
     FileNameBook = QFileDialog::getOpenFileName(0, tr("Book import"), "", "*.html");

         if(FileNameBook == "") return;
         else
             {
                 QFile ifile(FileNameBook);
                 QTextStream istream(&ifile);
                 float i = 0;//Величина %
                 float ipt,//Численное значние "pt"
               iptc;//Отвечает за таблицу
                 iptc = 0;
                 ipt = 0;
                 ifile.open(QIODevice::ReadOnly);

                     while(!ifile.atEnd())
                         {
                             str.append(istream.readLine());
                             str.append(" ");
                             sHTML.append(str);

                                 if(str.indexOf("<TABLE") != -1) iptc = 1;//Начало таблицы
                                 if(str.indexOf("/TABLE>") != -1) iptc = 2;//Конец таблицы

                             int j, iptc2;
                             QString s1,s2;
                             s1.clear();
                             s2.clear();
                             iptc2 = 0;

                //Поиск элемента обозначения шрифта
                             j = str.indexOf("font-size:");

//Если элемент найден и найдено вхождение "pt", то
                                 if(j != -1 && str.indexOf("pt", j) != -1)
                                     {
                      //Добавление одной цифры, стоящей за "pt"
                                          s1.append(str.at(str.indexOf("pt", j) - 1));

//Если второй символ стоящий за первым числом не пробел, то
                                              if(str.at(str.indexOf("pt", j) - 2) != ' ')
                      //Добавить его как вторую цифру числа шрифта(ex. "14pt")
                          s2.append(str.at(str.indexOf("pt", j) - 2));

              //Соединить с первой цифрой в s1. Образовать число.
                                              if(s2 != "") s1.append(s2);

                                          bool bOk;
                                          ipt = s1.toFloat(&bOk);
//6pt = 113 = 0.885% от страницы
//16pt = 42 = 2.380% от страницы
//0.1375 - условный средний коэффициент % занимаемого значения 6pt на одной странице, формата A4
//Усреднённая формула нахождения % текущей строки от страницы, формата A4, относительно 6pt
                                          ipt = (ipt / 6) * 0.1375;
                                     }

//Поиск элемента обозначения шрифта другой формы
                                 if(j == -1)
                                     {
                                         if(str.indexOf("FONT SIZE=1") != -1) j = 1;
                                         if(str.indexOf("FONT SIZE=2") != -1) j = 2;
                                         if(str.indexOf("FONT SIZE=3") != -1) j = 3;
                                         if(str.indexOf("FONT SIZE=4") != -1) j = 4;
                                         if(str.indexOf("FONT SIZE=5") != -1) j = 5;
                                         if(str.indexOf("FONT SIZE=6") != -1) j = 6;
                                         if(str.indexOf("FONT SIZE=7") != -1) j = 7;

                                             switch(j)//Вычисление процента
                                                 {
                                                      case 1:
                                                          ipt = (8 / 6) * 0.1375;
                                                      case 2:
                                                          ipt = (10 / 6) * 0.1375;
                                                      case 3:
                                                          ipt = (12 / 6) * 0.1375;
                                                      case 4:
                                                          ipt = (14 / 6) * 0.1375;
                                                      case 5:
                                                          ipt = (18 / 6) * 0.1375;
                                                      case 6:
                                                          ipt = (24 / 6) * 0.1375;
                                                      case 7:
                                                          ipt = (36 / 6) * 0.1375;
                                                 }
                                     }

                             i += ipt;//Суммирование процента

                                 if(i >= 100)//Если набралось 100%
                                     {
                                         if(iptc == 0)//Если нет таблицы в конце страницы
                                             {
                                                  sHTML.append("</body></html>");
                                                  ListPages << sHTML;
                                                  sHTML.clear();
                                                  sHTML.append("<html><body>");
                                                  i = 0;
                                             }
                                         else
                                             {
        //Если таблица была закрыта на данной странице
                                                  if(iptc == 2)
                                                      {
                                                           sHTML.append("</body></html>");
                                                           ListPages << sHTML;
                                                           sHTML.clear();
                                                           sHTML.append("<html><body>");
                                                           i = 0;
                                                           iptc = 0;//Значение = таблиц нет
                                                      }
                                             }
                                     }

                             str.clear();
                         }

                     if(sHTML != "") ListPages << sHTML << "</body></html>";

                 ifile.close();

                     if(gRegimeViewing == true) return;
}
Она производит разбивку на страницы, подсчитывая условное значение количества строк располагаемых на странице, формата A4. Была ещё задумка подсчитать количество символов в строке но, пока решил остановиться на таком варианте.

Разбивая страницы, она переносит всю таблицу на одну страницу до конца, даже, если таблица физически должна быть на 2-х или более страницах.

Импортируются пока только html-страницы, созданные в OpenOffice. Это делалось для того, чтобы преподаватели, у которых имеются методички в формате MSWord(*.doc) могли наиболее быстро перегнать своё пособие в мою программу.

Как Вам эта функция и есть ли возможность всё это максимально упростить? Благодарю за ответ.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- xwicked   Программа для создания электронных книг   8.8.2011, 20:36
- - Алексей1153   лично я просел на фразе "Этот код публикуется...   8.8.2011, 21:32
|- - xwicked   Цитата(Алексей1153 @ 8.8.2011, 21:32) ......   9.8.2011, 22:27
- - xwicked   Вот спекфайл, по которому можно собрать rpm-пакет ...   10.8.2011, 9:00
- - xwicked   Здравствуйте! Следующая версия программы 0.0....   12.8.2011, 21:11
- - xwicked   Теперь и счастливым обладателям дистрибутивов GNU ...   15.8.2011, 6:31
- - xwicked   Здравствуйте! В этой версии я сделал одно важ...   17.8.2011, 21:42
|- - xwicked   Цитата(xwicked @ 17.8.2011, 22:42) ... Та...   27.8.2011, 20:49
- - xwicked   Здравствуйте! Вот новая версия 0.1.1 - исходны...   18.8.2011, 21:08
- - xwicked   Здравствуйте! Версия 0.1.3 содержит добавление...   16.10.2011, 12:14
- - xwicked   В версии 0.1.4 добавилась функция печати: void Ele...   20.11.2011, 19:28
- - xwicked   Здравствуйте! Версия 0.1.8 //Изменение таблицы...   31.1.2012, 21:52
- - xwicked   В версии 0.1.9 добавлена работа с несколькими библ...   11.2.2012, 23:05
- - xwicked   Здравствуйте! Оптимизирована функция изменения...   17.2.2012, 21:40
- - xwicked   Здравствуйте! Новый код. Версия 1.0.0 - это пе...   3.4.2012, 20:10
- - xwicked   Здравствуйте! Новая версия. 1.0.5. Тут прошу ...   2.2.2013, 22:17


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 5:04