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