Some changes.

This commit is contained in:
Xnoe 2020-07-22 00:19:29 +01:00 committed by Elsie
parent 8f2b13fc18
commit b53a0ef467

View File

@ -30,41 +30,40 @@ string32 readfile(std::string name) {
class frontMatter { class frontMatter {
void set(string32 key, string32 val) { void set(string32 key, string32 val) {
values[std::string(key.asChar())] = val; char* asChar = key.asChar();
values[std::string(asChar)] = val;
delete asChar;
} }
public: public:
char* layout; char* layout;
bool hasLayout = false; bool hasLayout = false;
string32 parsed; string32 parsed;
std::unordered_map<std::string, string32> values; std::unordered_map<std::string, string32> values;
frontMatter(string32 unparsedPage) { frontMatter(string32 unparsedPage) {
std::vector<string32> lines = unparsedPage.split("\n"); std::vector<string32> lines = unparsedPage.split("\n");
if (lines.front() == "---") { if (lines.front() != "---")
int line = 1; parsed = unparsedPage;
for (;lines[line]!="---";line++) { else {
std::vector dataToParse = lines[line].split(": "); int line (0);
if (dataToParse[0] == "layout") { while (line++, lines[line]!="---") {
layout = dataToParse[1].asChar(); std::vector<string32> dataToParse = lines[line].split(": ");
hasLayout = true; if (dataToParse[0] == "layout")
} else hasLayout = layout = dataToParse[1].asChar(), true;
else
set("page." + dataToParse[0], dataToParse[1]); set("page." + dataToParse[0], dataToParse[1]);
} }
line++; line++;
for (;line<lines.size();line++) { for (;line<lines.size();line++)
parsed += lines[line] + "\n"; parsed += lines[line] + "\n";
}
} else {
parsed = unparsedPage;
} }
std::vector<string32> config = readfile("source/_config.yml").split("\n"); std::vector<string32> config = readfile("source/_config.yml").split("\n");
for (string32 line : config) { for (string32 line : config) {
std::vector<string32> split = line.split(": "); std::vector<string32> split = line.split(": ");
set("site." + split[0], split[1]); set("site." + split[0], split[1]);
} }
} }
string32 operator[](string32 s) {
return values[std::string(s.asChar())];
}
}; };
string32 parsePageHTML(string32 pageContents) { string32 parsePageHTML(string32 pageContents) {
@ -74,48 +73,44 @@ string32 parsePageHTML(string32 pageContents) {
page = readfile("source/_layouts/" + std::string(fm.layout) + ".html").replace("{{ content }}", fm.parsed); page = readfile("source/_layouts/" + std::string(fm.layout) + ".html").replace("{{ content }}", fm.parsed);
else else
page = fm.parsed; page = fm.parsed;
for (auto pair : fm.values) for (auto pair : fm.values)
page.replaceSelfAll("{{ " + pair.first + " }}", pair.second); page.replaceSelfAll("{{ " + pair.first + " }}", pair.second);
int i (0);
string32 searchString = "{% "; string32 searchString = "{% ";
string32 endString = " %}"; int tofind (searchString.cs.size());
while (i < page.cs.size()) { int i (0);
int havematched (0); while (i < page.len()) {
for (;i<page.cs.size();i++) { int havematched = 0;
for (;i<page.len();i++) {
if (page.cs[i] == searchString[havematched]) if (page.cs[i] == searchString[havematched])
havematched++; havematched++;
else else
havematched = 0; havematched = 0;
if (havematched == searchString.cs.size()) if (havematched == tofind)
break; break;
} }
if (!havematched) if (!havematched)
break; break;
havematched--;
int si (i-3); int si (i-3);
int ei (0); int ei (0);
for (;i<page.cs.size();i++) { for (;i<page.len();i++) {
if (page.cs[i] == endString[havematched]) { if (page[i] == searchString[havematched])
havematched++; ei = i, havematched--;
ei = i; else
} else havematched = tofind-1;
havematched = 0; if (!havematched) {
if (havematched == endString.cs.size()) { ei -= tofind-1;
ei -= endString.cs.size();
break; break;
} }
} }
string32 testString; std::vector<string32> split = string32(page, si+4, ei+1).split(" ");
for (int j(si+4);j<=ei;j++)
testString += page[j];
page.cs.erase(page.cs.begin()+si, page.cs.begin()+ei+4); page.cs.erase(page.cs.begin()+si, page.cs.begin()+ei+4);
std::vector<string32> split = testString.split(" ");
if (split[0] == "include") { if (split[0] == "include") {
string32 toInclude = readfile("source/_includes/" + std::string(split[1].asChar())); string32 toInclude = readfile("source/_includes/" + std::string(split[1].asChar()));
page.cs.insert(page.cs.begin()+si, toInclude.cs.begin(), toInclude.cs.end()); page.cs.insert(page.cs.begin()+si, toInclude.cs.begin(), toInclude.cs.end());
} }
i = 0;
si = 0;
ei = 0;
} }
return page; return page;
} }