#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "gemlog.h"
/* TODO: allow user to specify custom header/footer */
#define HTML_HEADER_BEGIN ""
#define HTML_HEADER_END ""
#define HTML_FOOTER ""
static int
gemlog_write_html_text(struct gemtext *text, int fd)
{
if (write(fd, "", strlen("
")) == -1)
return -1;
if (write(fd, ((struct gemtext_text *)text)->text, strlen(((struct gemtext_text *)text)->text)) == -1)
return -1;
if (write(fd, "
\n", strlen("
\n")) == -1)
return -1;
return 0;
}
static int
gemlog_write_html_link(struct gemtext *text, int fd)
{
if (write(fd, "link, strlen(((struct gemtext_link *)text)->link)) == -1)
return -1;
if (write(fd, "\">", strlen("\">")) == -1)
return -1;
if (((struct gemtext_link *)text)->name) {
if (write(fd, ((struct gemtext_link *)text)->name, strlen(((struct gemtext_link *)text)->name)) == -1)
return -1;
}
if (write(fd, "
\n", strlen("\n")) == -1)
return -1;
return 0;
}
static int
gemlog_write_html_pre(struct gemtext *text, int fd)
{
if (write(fd, "", strlen("")) == -1)
return -1;
if (write(fd, ((struct gemtext_pre *)text)->text, strlen(((struct gemtext_pre *)text)->text)) == -1)
return -1;
if (write(fd, "
\n", strlen("
\n")) == -1)
return -1;
return 0;
}
static int
gemlog_write_html_h1(struct gemtext *text, int fd)
{
if (write(fd, "", strlen("")) == -1)
return -1;
if (write(fd, ((struct gemtext_h1 *)text)->text, strlen(((struct gemtext_h1 *)text)->text)) == -1)
return -1;
if (write(fd, "
\n", strlen("
\n")) == -1)
return -1;
return 0;
}
static int
gemlog_write_html_h2(struct gemtext *text, int fd)
{
if (write(fd, "", strlen("")) == -1)
return -1;
if (write(fd, ((struct gemtext_h2 *)text)->text, strlen(((struct gemtext_h2 *)text)->text)) == -1)
return -1;
if (write(fd, "
\n", strlen("
\n")) == -1)
return -1;
return 0;
}
static int
gemlog_write_html_h3(struct gemtext *text, int fd)
{
if (write(fd, "", strlen("")) == -1)
return -1;
if (write(fd, ((struct gemtext_h3 *)text)->text, strlen(((struct gemtext_h3 *)text)->text)) == -1)
return -1;
if (write(fd, "
\n", strlen("
\n")) == -1)
return -1;
return 0;
}
static int
gemlog_write_html_ul(struct gemtext *text, int fd)
{
if (write(fd, "", strlen("")) == -1)
return -1;
if (write(fd, ((struct gemtext_ul *)text)->text, strlen(((struct gemtext_ul *)text)->text)) == -1)
return -1;
if (write(fd, "\n", strlen("\n")) == -1)
return -1;
return 0;
}
static int
gemlog_write_html_qt(struct gemtext *text, int fd)
{
if (write(fd, "", strlen("")) == -1)
return -1;
if (write(fd, ((struct gemtext_qt *)text)->text, strlen(((struct gemtext_qt *)text)->text)) == -1)
return -1;
if (write(fd, "
\n", strlen("
\n")) == -1)
return -1;
return 0;
}
int
gemlog_write_html(struct gemlog_entry **feed, const char *path)
{
int i;
int x;
int ulindicator;
int fd;
char pathbuf[PATH_MAX+1];
char fmtbuf[PATH_MAX+1];
if (mkdir(path, 0755) == -1) {
if (errno != EEXIST)
return -1;
}
for (i = 0; feed[i] != NULL; i++) {
strlcpy(pathbuf, path, sizeof(pathbuf));
strlcat(pathbuf, "/", sizeof(pathbuf));
snprintf(fmtbuf, sizeof(fmtbuf), "%d", feed[i]->date.tm_year+1900);
strlcat(pathbuf, fmtbuf, sizeof(pathbuf));
if (mkdir(pathbuf, 0755) == -1) {
if (errno != EEXIST)
return -1;
}
strlcat(pathbuf, "/", sizeof(pathbuf));
snprintf(fmtbuf, sizeof(fmtbuf), "%d", feed[i]->date.tm_mon+1);
strlcat(pathbuf, fmtbuf, sizeof(pathbuf));
if (mkdir(pathbuf, 0755) == -1) {
if (errno != EEXIST)
return -1;
}
strlcat(pathbuf, "/", sizeof(pathbuf));
snprintf(fmtbuf, sizeof(fmtbuf), "%d", feed[i]->date.tm_mday);
strlcat(pathbuf, fmtbuf, sizeof(pathbuf));
if (mkdir(pathbuf, 0755) == -1) {
if (errno != EEXIST)
return -1;
}
strlcat(pathbuf, "/", sizeof(pathbuf));
snprintf(fmtbuf, sizeof(fmtbuf), "%d", feed[i]->date.tm_hour);
strlcat(pathbuf, fmtbuf, sizeof(pathbuf));
if (mkdir(pathbuf, 0755) == -1) {
if (errno != EEXIST)
return -1;
}
strlcat(pathbuf, "/", sizeof(pathbuf));
strlcat(pathbuf, GEMLOG_CONTENT_HTML_FILENAME, sizeof(pathbuf));
fd = open(pathbuf, O_WRONLY|O_CREAT|O_TRUNC);
if (fd == -1)
return -1;
if (chmod(pathbuf, 0644) == -1) {
close(fd);
return -1;
}
/* write header */
if (write(fd, HTML_HEADER_BEGIN, strlen(HTML_HEADER_BEGIN)) == -1) {
close(fd);
return -1;
}
if (write(fd, "", strlen("")) == -1) {
close(fd);
return -1;
}
if (write(fd, feed[i]->title, strlen(feed[i]->title)) == -1) {
close(fd);
return -1;
}
if (write(fd, "", strlen("")) == -1) {
close(fd);
return -1;
}
if (write(fd, HTML_HEADER_END, strlen(HTML_HEADER_END)) == -1) {
close(fd);
return -1;
}
ulindicator = 0;
for (x = 0; feed[i]->content[x] != NULL; x++) {
if (ulindicator) {
if (gemtext_type(feed[i]->content[x]) != GEMTEXT_UL) {
if (write(fd, "\n", strlen("\n")) == -1) {
close(fd);
return -1;
}
ulindicator = 0;
}
}
switch (gemtext_type(feed[i]->content[x])) {
case GEMTEXT_TEXT:
gemlog_write_html_text(feed[i]->content[x], fd);
break;
case GEMTEXT_LINK:
gemlog_write_html_link(feed[i]->content[x], fd);
break;
case GEMTEXT_PRE:
gemlog_write_html_pre(feed[i]->content[x], fd);
break;
case GEMTEXT_H1:
gemlog_write_html_h1(feed[i]->content[x], fd);
break;
case GEMTEXT_H2:
gemlog_write_html_h2(feed[i]->content[x], fd);
break;
case GEMTEXT_H3:
gemlog_write_html_h3(feed[i]->content[x], fd);
break;
case GEMTEXT_UL:
if (!ulindicator) {
if (write(fd, "\n", strlen("\n")) == -1) {
close(fd);
return -1;
}
ulindicator = 1;
}
gemlog_write_html_ul(feed[i]->content[x], fd);
break;
case GEMTEXT_QT:
gemlog_write_html_qt(feed[i]->content[x], fd);
break;
default:
close(fd);
return -1;
}
}
close(fd);
}
return 0;
}