00001
00002
00003 #include "ncc.h"
00004 #include "exceptions.h"
00005
00006 namespace freedaisy {
00007 NCC::NCC() {
00008 _xmldoc = NULL;
00009 createDoc();
00010 }
00011
00012 void NCC::createDoc(std::string title, std::string lang) {
00013 _createDoc();
00014 XMLNode html = createRootNode("html");
00015 html.setAttr("xmlns", "http://www.w3.org/1999/xhtml");
00016
00017 XMLNode head("head");
00018 html.addChild(&head);
00019
00020 XMLNode titlenode("title");
00021 titlenode.setContent(title);
00022 head.addChild(&titlenode);
00023
00024 XMLNode meta("meta");
00025 meta.setAttr("http-equiv", "Content-type");
00026 meta.setAttr("content", "text/html");
00027 head.addChild(&meta);
00028
00029 XMLNode generator("meta");
00030 generator.setAttr("name", "ncc:generator");
00031 generator.setAttr("content", "libdaisy v0.1 (c) 2006 Alexis ROBERT");
00032 head.addChild(&generator);
00033
00034 XMLNode body("body");
00035 html.addChild(&body);
00036
00037 setLang(lang);
00038 }
00039
00040 std::string NCC::getTitle() {
00041 XMLNode node;
00042 node = xpathEval("//*[local-name() = 'title']")[0];
00043 return node.getContent();
00044 }
00045
00046 void NCC::setTitle(std::string newtitle) {
00047 XMLNode node;
00048 node = xpathEval("//*[local-name() = 'title']")[0];
00049 return node.setContent(newtitle);
00050 }
00051
00052 void NCC::setLang(std::string lang) {
00053
00054 XMLNode node;
00055 node = xpathEval("//*[local-name() = 'head']")[0];
00056 node.setAttr("lang", lang);
00057 node.setAttr("xml:lang", lang);
00058 }
00059
00060 std::string NCC::getLang() {
00061
00062 XMLNode node;
00063 node = xpathEval("//*[local-name() = 'head']")[0];
00064 if (node.hasAttr("lang") == 0) {
00065 return node["lang"];
00066 } else {
00067 return "en";
00068 }
00069 }
00070
00071 std::vector<Meta> NCC::getMeta(std::string name) {
00072 std::vector<Meta> metas;
00073 std::vector<XMLNode> nodes;
00074 nodes = xpathEval("//*[local-name() = 'meta']");
00075 for (int i = 0; i < nodes.size(); i++) {
00076 if (nodes[i].hasAttr("name") == 0) {
00077 if (nodes[i]["name"] == name) {
00078 } else if ((name == "dc:format") &&
00079 (nodes[i]["name"] == "ncc:format")) {
00080 } else if ((name == "dc:identifier") &&
00081 (nodes[i]["name"] == "ncc:identifier")) {
00082 } else if ((name == "ncc:pageFront") &&
00083 (nodes[i]["name"] == "ncc:page-front")) {
00084 } else if ((name == "ncc:pageSpecial") &&
00085 (nodes[i]["name"] == "ncc:page-special")) {
00086 } else if ((name == "ncc:setInfo") &&
00087 (nodes[i]["name"] == "ncc:setinfo")) {
00088 } else if ((name == "ncc:tocItems") &&
00089 ((nodes[i]["name"] == "ncc:tocitems") |
00090 (nodes[i]["name"] == "ncc:TOCitems"))) {
00091 } else if ((name == "ncc:totalTime") &&
00092 (nodes[i]["name"] == "ncc:totaltime")) {
00093 } else {
00094 continue;
00095 }
00096 Meta entry(nodes[i]);
00097 metas.push_back(entry);
00098 }
00099 }
00100 return metas;
00101 }
00102
00103 void NCC::addMeta(Meta *m) {
00104 XMLNode node;
00105 node = xpathEval("//*[local-name() = 'head']")[0];
00106 node.addChild(m);
00107 }
00108
00109 XMLNode NCC::getPage(std::string number) {
00110 std::vector<XMLNode> nodes;
00111 nodes = xpathEval("//*[local-name() = 'span']");
00112 for (int i = 0; i < nodes.size(); i++) {
00113 if (nodes[i].getContent() == number)
00114 return nodes[i];
00115 }
00116
00117 throw Exceptions::PageNotFound(number);
00118 }
00119
00120 XMLNode NCC::getBody() {
00121 return xpathEval("//*[local-name() = 'body']")[0];
00122 }
00123
00124 std::vector<XMLNode> NCC::getHeadings() {
00125 std::vector<XMLNode> bodynodes = getBody().getChildren();
00126 std::vector<XMLNode> finalnodes;
00127
00128 for (std::vector<XMLNode>::iterator i = bodynodes.begin(); i != bodynodes.end(); i++) {
00129 std::string name = (*i).getName();
00130 if ((name[0] == 'h') && (name.size() == 2)) {
00131 finalnodes.push_back((*i));
00132 }
00133 }
00134 return finalnodes;
00135 }
00136 }