106 lines
2.9 KiB
C
106 lines
2.9 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
//#include "libhmpl.h"
|
|
#include "libhectic.h"
|
|
|
|
#define KB128 131072
|
|
|
|
// CREATE OR REPLACE FUNCTION common.render_template_placeholders(result TEXT, context JSONB, prefix CHAR(1) DEFAULT '')
|
|
// RETURNS text LANGUAGE plpgsql AS $$
|
|
// DECLARE
|
|
// simple_start INT;
|
|
// simple_end INT;
|
|
// simple_key TEXT;
|
|
// replacement TEXT;
|
|
// first_char CHAR(1);
|
|
// _offset INT := 0;
|
|
//
|
|
// start_pattern CHAR(3);
|
|
// start_pattern_length INT;
|
|
// BEGIN
|
|
// start_pattern = '{{' || prefix;
|
|
// start_pattern_length = char_length(start_pattern);
|
|
//
|
|
// LOOP
|
|
// -- Locate the start of the simple key marker.
|
|
// simple_start := strpos(substring(result from _offset), start_pattern);
|
|
// EXIT WHEN simple_start = 0; -- Exit if no simple marker is found.
|
|
//
|
|
// IF _offset != 0 THEN
|
|
// simple_start := _offset + simple_start - 1;
|
|
// END IF;
|
|
//
|
|
// -- Locate the end of the simple key marker.
|
|
// simple_end := strpos(result, '}}', simple_start);
|
|
// IF simple_end = 0 THEN
|
|
// RAISE EXCEPTION 'Malformed template: missing closing braces for loop start';
|
|
// END IF;
|
|
//
|
|
// simple_key := substring(result from simple_start + start_pattern_length for simple_end - simple_start - start_pattern_length);
|
|
//
|
|
//
|
|
// replacement := eval_value(context, simple_key);
|
|
// RAISE LOG '% := eval_value(%, %)', replacement, context, simple_key;
|
|
// IF replacement IS NULL THEN
|
|
// _offset := simple_start + start_pattern_length;
|
|
// RAISE LOG '% := % + %', _offset, simple_start, start_pattern_length;
|
|
// IF _offset = 0 THEN
|
|
// RAISE EXCEPTION 'Malformed template: offcet cannot be 0';
|
|
// END IF;
|
|
// CONTINUE;
|
|
// END IF;
|
|
// result := replace(
|
|
// result,
|
|
// substring(result from simple_start for simple_end - simple_start + 2),
|
|
// replacement);
|
|
// END LOOP;
|
|
//
|
|
// RETURN result;
|
|
// END $$;
|
|
|
|
void render_template_placeholders(char *text, char *context, char prefix[1]) {
|
|
// start
|
|
char start_pattern[4];
|
|
sprintf(&start_pattern[0], "{{%s", prefix);
|
|
|
|
int start_pattern_length = strlen(start_pattern);
|
|
int offset = 0;
|
|
|
|
while (1) {
|
|
// find tag start
|
|
char *placeholder_start = strstr(text + offset, start_pattern);
|
|
if (!placeholder_start) {
|
|
break;
|
|
}
|
|
};
|
|
}
|
|
|
|
void render_template(char *text, char *context) {
|
|
render_template_placeholders(text, context, "");
|
|
}
|
|
|
|
int main(int argc, char *argv[]) {
|
|
char *text = NULL;
|
|
char *context = strdup(argc > 1 ? argv[1] : "{}");
|
|
|
|
if (argc > 2) {
|
|
text = strdup(argv[2]);
|
|
} else if (!isatty(fileno(stdin))) {
|
|
size_t size = 0;
|
|
ssize_t len = getdelim(&text, &size, '\0', stdin);
|
|
if (len < 0) {
|
|
perror("read stdin");
|
|
free(context);
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
render_template(text, context);
|
|
|
|
free(text);
|
|
free(context);
|
|
return 0;
|
|
}
|