Add support for named wikilinks
This commit is contained in:
parent
1bd489cdc5
commit
f4e04b0dfd
|
@ -11,9 +11,9 @@ zero-terminated strings. There will likely be memoryleaks and comments that
|
||||||
over explain every line of code.
|
over explain every line of code.
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
- [x] Rendering wikilinks
|
- Rendering wikilinks
|
||||||
- [x] Ability to keep track of incoming links
|
- Ability to keep track of incoming links
|
||||||
- [ ] Named wikilinks (i.e. `[[link title|actual page]]`)
|
- Named wikilinks (i.e. `[[link title|actual page]]`)
|
||||||
|
|
||||||
## installation
|
## installation
|
||||||
This tool requires [cmark](https://github.com/commonmark/cmark) to be
|
This tool requires [cmark](https://github.com/commonmark/cmark) to be
|
||||||
|
|
29
calathea.c
29
calathea.c
|
@ -350,13 +350,24 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
int linkLength = nextLinkEnd - nextLinkStart;
|
int linkLength = nextLinkEnd - nextLinkStart;
|
||||||
|
|
||||||
// Determine the exact title of the link
|
char *nextVerticalBar = strchr(nextLinkStart, '|');
|
||||||
char title[linkLength - 3];
|
|
||||||
|
|
||||||
strncpy(title, nextLinkStart + 2, (linkLength - 2)*sizeof(char));
|
char *linkTitle = calloc(linkLength - 3, sizeof(char));
|
||||||
title[linkLength - 2] = 0;
|
char *linkPageTitle = NULL;
|
||||||
|
|
||||||
struct Page *linkedPage = map_get(pageMap, mapSize, title);
|
if (nextVerticalBar != NULL && nextVerticalBar < nextLinkEnd) {
|
||||||
|
// The link is in the from [[link title|page title]]
|
||||||
|
strncpy(linkTitle, nextLinkStart + 2, (nextVerticalBar - 1) - (nextLinkStart + 1));
|
||||||
|
linkPageTitle = calloc((nextLinkEnd - 2) - nextVerticalBar, sizeof(char));
|
||||||
|
strncpy(linkPageTitle, nextVerticalBar + 1, (nextLinkEnd - 1) - nextVerticalBar);
|
||||||
|
puts(linkPageTitle);
|
||||||
|
} else {
|
||||||
|
// The link is of the form [[page title]]
|
||||||
|
linkPageTitle = linkTitle;
|
||||||
|
strncpy(linkTitle, nextLinkStart + 2, (linkLength - 2)*sizeof(char));
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Page *linkedPage = map_get(pageMap, mapSize, linkPageTitle);
|
||||||
|
|
||||||
char *compiledLink = NULL;
|
char *compiledLink = NULL;
|
||||||
|
|
||||||
|
@ -364,12 +375,12 @@ int main(int argc, char *argv[]) {
|
||||||
// i.e. the page does not exist
|
// i.e. the page does not exist
|
||||||
compiledLink = concat_strings(3,
|
compiledLink = concat_strings(3,
|
||||||
"<a class=\"calathea-404\" href=\"#\">",
|
"<a class=\"calathea-404\" href=\"#\">",
|
||||||
title,
|
linkTitle,
|
||||||
"</a>"
|
"</a>"
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
page_list_insert(linkedPage->incoming, currentPage);
|
page_list_insert(linkedPage->incoming, currentPage);
|
||||||
compiledLink = concat_strings(5, "[", title, "](", linkedPage->permalink, ")");
|
compiledLink = concat_strings(5, "[", linkTitle, "](", linkedPage->permalink, ")");
|
||||||
}
|
}
|
||||||
|
|
||||||
char *newContent = substitute_string(
|
char *newContent = substitute_string(
|
||||||
|
@ -378,6 +389,10 @@ int main(int argc, char *argv[]) {
|
||||||
currentPage->content = newContent;
|
currentPage->content = newContent;
|
||||||
|
|
||||||
free(compiledLink);
|
free(compiledLink);
|
||||||
|
if (linkTitle != linkPageTitle) {
|
||||||
|
free(linkPageTitle);
|
||||||
|
}
|
||||||
|
free(linkTitle);
|
||||||
|
|
||||||
// Move to the next chunk of the file
|
// Move to the next chunk of the file
|
||||||
// NOTE: This is suboptimal, because we search for "[[" from the
|
// NOTE: This is suboptimal, because we search for "[[" from the
|
||||||
|
|
Loading…
Reference in New Issue