aboutsummaryrefslogtreecommitdiffstats
path: root/src/source-parser.c
diff options
context:
space:
mode:
authorRafael G. Martins <rafael@rafaelmartins.eng.br>2015-06-11 03:24:12 -0300
committerRafael G. Martins <rafael@rafaelmartins.eng.br>2015-06-11 03:24:12 -0300
commit1851274f9524c462806d6ab64e024effb0392231 (patch)
tree763af6cfaaaf978a8dde467e3bfd089ad224b592 /src/source-parser.c
parente4eac77887cd9c1dd010057d441691d030a851df (diff)
downloadblogc-1851274f9524c462806d6ab64e024effb0392231.tar.gz
blogc-1851274f9524c462806d6ab64e024effb0392231.tar.bz2
blogc-1851274f9524c462806d6ab64e024effb0392231.zip
added content excerpt support
Diffstat (limited to 'src/source-parser.c')
-rw-r--r--src/source-parser.c57
1 files changed, 55 insertions, 2 deletions
diff --git a/src/source-parser.c b/src/source-parser.c
index f0fca29..9e1f01d 100644
--- a/src/source-parser.c
+++ b/src/source-parser.c
@@ -27,6 +27,9 @@ typedef enum {
SOURCE_SEPARATOR,
SOURCE_CONTENT_START,
SOURCE_CONTENT,
+ SOURCE_EXCERPT_SEPARATOR,
+ SOURCE_CONTENT2_START,
+ SOURCE_CONTENT2,
} blogc_source_parser_state_t;
@@ -41,6 +44,7 @@ blogc_source_parse(const char *src, size_t src_len, blogc_error_t **err)
char *key = NULL;
char *tmp = NULL;
+ char *tmp2 = NULL;
b_trie_t *rv = b_trie_new(free);
blogc_source_parser_state_t state = SOURCE_START;
@@ -145,10 +149,53 @@ blogc_source_parse(const char *src, size_t src_len, blogc_error_t **err)
break;
case SOURCE_CONTENT:
+ if (c == '.') {
+ state = SOURCE_EXCERPT_SEPARATOR;
+ tmp = b_strndup(src + start, current - start);
+ b_trie_insert(rv, "EXCERPT", blogc_content_parse(tmp));
+ free(tmp);
+ tmp = NULL;
+ break;
+ }
if (current == (src_len - 1)) {
tmp = b_strndup(src + start, src_len - start);
- b_trie_insert(rv, "RAW_CONTENT", tmp);
- b_trie_insert(rv, "CONTENT", blogc_content_parse(tmp));
+ b_trie_insert(rv, "EXCERPT", blogc_content_parse(tmp));
+ free(tmp);
+ tmp = NULL;
+ }
+ break;
+
+ case SOURCE_EXCERPT_SEPARATOR:
+ if (c == '.')
+ break;
+ if (c == '\n' || c == '\r') {
+ state = SOURCE_CONTENT2_START;
+ break;
+ }
+ *err = blogc_error_parser(BLOGC_ERROR_SOURCE_PARSER, src, src_len,
+ current,
+ "Invalid excerpt separator. Must be more than one '.' characters.");
+ break;
+
+ case SOURCE_CONTENT2_START:
+ start = current;
+ state = SOURCE_CONTENT2;
+ break;
+
+ case SOURCE_CONTENT2:
+ if (current == (src_len - 1)) {
+ tmp = b_strndup(src + start, src_len - start);
+ tmp2 = b_strdup_printf("%s\n%s",
+ b_trie_lookup(rv, "EXCERPT"), tmp);
+ free(tmp);
+ tmp = NULL;
+ b_trie_insert(rv, "CONTENT", blogc_content_parse(tmp2));
+ free(tmp2);
+ tmp2 = NULL;
+ }
+ if (c == '.') {
+ state = SOURCE_EXCERPT_SEPARATOR;
+ break;
}
break;
}
@@ -159,6 +206,9 @@ blogc_source_parse(const char *src, size_t src_len, blogc_error_t **err)
current++;
}
+ if (b_trie_lookup(rv, "CONTENT") == NULL)
+ b_trie_insert(rv, "CONTENT", b_strdup(b_trie_lookup(rv, "EXCERPT")));
+
if (*err == NULL && b_trie_size(rv) == 0) {
// ok, nothing found in the config trie, but no error set either.
@@ -187,6 +237,9 @@ blogc_source_parse(const char *src, size_t src_len, blogc_error_t **err)
case SOURCE_SEPARATOR:
case SOURCE_CONTENT_START:
case SOURCE_CONTENT:
+ case SOURCE_EXCERPT_SEPARATOR:
+ case SOURCE_CONTENT2_START:
+ case SOURCE_CONTENT2:
break; // won't happen, and if even happen, shouldn't be fatal
}
}