Introduction
Introduction Statistics Contact Development Disclaimer Help
sfeed_html.c - sfeed - RSS and Atom parser
git clone git://git.codemadness.org/sfeed
Log
Files
Refs
README
LICENSE
---
sfeed_html.c (3765B)
---
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <time.h>
5
6 #include "util.h"
7
8 static struct feed *feeds;
9 static int showsidebar;
10 static char *line;
11 static size_t linesize;
12 static unsigned long totalnew, total;
13 static time_t comparetime;
14
15 static void
16 printfeed(FILE *fp, struct feed *f)
17 {
18 char *fields[FieldLast];
19 struct tm rtm, *tm;
20 time_t parsedtime;
21 unsigned int isnew;
22 ssize_t linelen;
23
24 if (f->name[0]) {
25 fputs("<h2 id=\"", stdout);
26 xmlencode(f->name, stdout);
27 fputs("\"><a href=\"#", stdout);
28 xmlencode(f->name, stdout);
29 fputs("\">", stdout);
30 xmlencode(f->name, stdout);
31 fputs("</a></h2>\n", stdout);
32 }
33 fputs("<pre>\n", stdout);
34
35 while ((linelen = getline(&line, &linesize, fp)) > 0 &&
36 !ferror(stdout)) {
37 if (line[linelen - 1] == '\n')
38 line[--linelen] = '\0';
39 parseline(line, fields);
40
41 parsedtime = 0;
42 if (!strtotime(fields[FieldUnixTimestamp], &parsedtime) …
43 (tm = localtime_r(&parsedtime, &rtm))) {
44 isnew = (parsedtime >= comparetime) ? 1 : 0;
45 totalnew += isnew;
46 f->totalnew += isnew;
47
48 fprintf(stdout, "%04d-%02d-%02d&nbsp;%02d:%02d ",
49 tm->tm_year + 1900, tm->tm_mon + 1, tm->…
50 tm->tm_hour, tm->tm_min);
51 } else {
52 isnew = 0;
53 fputs(" ", stdout);
54 }
55 f->total++;
56 total++;
57
58 if (fields[FieldLink][0]) {
59 fputs("<a href=\"", stdout);
60 xmlencode(fields[FieldLink], stdout);
61 fputs("\">", stdout);
62 }
63 if (isnew)
64 fputs("<b><u>", stdout);
65 xmlencode(fields[FieldTitle], stdout);
66 if (isnew)
67 fputs("</u></b>", stdout);
68 if (fields[FieldLink][0])
69 fputs("</a>", stdout);
70 fputs("\n", stdout);
71 }
72 fputs("</pre>\n", stdout);
73 }
74
75 int
76 main(int argc, char *argv[])
77 {
78 struct feed *f;
79 char *name;
80 FILE *fp;
81 int i;
82
83 if (pledge(argc == 1 ? "stdio" : "stdio rpath", NULL) == -1)
84 err(1, "pledge");
85
86 if (!(feeds = calloc(argc, sizeof(struct feed))))
87 err(1, "calloc");
88 if ((comparetime = getcomparetime()) == (time_t)-1)
89 errx(1, "getcomparetime");
90
91 fputs("<!DOCTYPE HTML>\n"
92 "<html>\n"
93 "\t<head>\n"
94 "\t<meta name=\"referrer\" content=\"no-referrer\" />\n"
95 "\t\t<meta http-equiv=\"Content-Type\" content=\"text/html…
96 "\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"sty…
97 "\t</head>\n"
98 "\t<body class=\"noframe\">\n", stdout);
99
100 showsidebar = (argc > 1);
101 if (showsidebar)
102 fputs("\t\t<div id=\"items\">\n", stdout);
103 else
104 fputs("\t\t<div id=\"items\" class=\"nosidebar\">\n", st…
105
106 if (argc == 1) {
107 feeds[0].name = "";
108 printfeed(stdin, &feeds[0]);
109 checkfileerror(stdin, "<stdin>", 'r');
110 } else {
111 for (i = 1; i < argc; i++) {
112 name = ((name = strrchr(argv[i], '/'))) ? name +…
113 feeds[i - 1].name = name;
114 if (!(fp = fopen(argv[i], "r")))
115 err(1, "fopen: %s", argv[i]);
116 printfeed(fp, &feeds[i - 1]);
117 checkfileerror(fp, argv[i], 'r');
118 checkfileerror(stdout, "<stdout>", 'w');
119 fclose(fp);
120 }
121 }
122 fputs("</div>\n", stdout); /* div items */
123
124 if (showsidebar) {
125 fputs("\t<div id=\"sidebar\">\n\t\t<ul>\n", stdout);
126
127 for (i = 1; i < argc; i++) {
128 f = &feeds[i - 1];
129 if (f->totalnew > 0)
130 fputs("<li class=\"n\"><a href=\"#", std…
131 else
132 fputs("<li><a href=\"#", stdout);
133 xmlencode(f->name, stdout);
134 fputs("\">", stdout);
135 if (f->totalnew > 0)
136 fputs("<b><u>", stdout);
137 xmlencode(f->name, stdout);
138 fprintf(stdout, " (%lu)", f->totalnew);
139 if (f->totalnew > 0)
140 fputs("</u></b>", stdout);
141 fputs("</a></li>\n", stdout);
142 }
143 fputs("\t\t</ul>\n\t</div>\n", stdout);
144 }
145
146 fprintf(stdout, "\t</body>\n\t<title>(%lu/%lu) - Newsfeed</title…
147 totalnew, total);
148
149 checkfileerror(stdout, "<stdout>", 'w');
150
151 return 0;
152 }
You are viewing proxied material from codemadness.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.