checkpoint
This commit is contained in:
parent
ee351722dc
commit
46d499a646
79
dexter.c
79
dexter.c
|
@ -68,6 +68,13 @@ xmlDocPtr dex_parse_doc(dexPtr dex, xmlDocPtr doc) {
|
|||
return xsltApplyStylesheet(dex->stylesheet, doc, NULL);
|
||||
}
|
||||
|
||||
static contextPtr clone_context(contextPtr context) {
|
||||
contextPtr other;
|
||||
other = __dex_alloc(sizeof(dex_context));
|
||||
other->name = astrdup(context->name);
|
||||
return other;
|
||||
}
|
||||
|
||||
dexPtr dex_compile(char* dex_str, char* incl) {
|
||||
dexPtr dex = (dexPtr) calloc(sizeof(compiled_dex), 1);
|
||||
|
||||
|
@ -110,7 +117,9 @@ dexPtr dex_compile(char* dex_str, char* incl) {
|
|||
sprintbuf(buf, "<xsl:template match=\"/\">\n");
|
||||
sprintbuf(buf, "<dexter:root>\n");
|
||||
|
||||
char *context = "root";
|
||||
contextPtr context = __dex_alloc(sizeof(dex_context));
|
||||
context->name = "root";
|
||||
|
||||
__dex_recurse(json, buf, context);
|
||||
json_object_put(json); // frees json
|
||||
dex->error = last_dex_error;
|
||||
|
@ -141,13 +150,19 @@ void * __dex_alloc(int size) {
|
|||
return obstack_alloc(&dex_obstack, size);
|
||||
}
|
||||
|
||||
void __dex_recurse_object(struct json_object * json, struct printbuf* buf, char *context) {
|
||||
void __dex_recurse_object(struct json_object * json, struct printbuf* buf, contextPtr context) {
|
||||
json_object_object_foreach(json, key, val) {
|
||||
__dex_recurse_foreach(json, key, val, buf, context);
|
||||
}
|
||||
}
|
||||
|
||||
void __dex_recurse_foreach(struct json_object * json, char* key, struct json_object * val, struct printbuf* buf, char *context) {
|
||||
static contextPtr deeper_context(contextPtr context, char* tag) {
|
||||
contextPtr deeper = clone_context(context);
|
||||
deeper->name = astrcat3(context->name, ".", tag);
|
||||
return deeper;
|
||||
}
|
||||
|
||||
void __dex_recurse_foreach(struct json_object * json, char* key, struct json_object * val, struct printbuf* buf, contextPtr context) {
|
||||
char *tag = astrdup(key);;
|
||||
char *ptr = tag;
|
||||
char *expr = astrdup(key);;
|
||||
|
@ -176,13 +191,13 @@ void __dex_recurse_foreach(struct json_object * json, char* key, struct json_obj
|
|||
printf("parsing: %s\n", expr);
|
||||
sprintbuf(buf, "<dexter:groups><xsl:for-each select=\"%s\"><dexter:group>\n", myparse(expr));
|
||||
printf("error: %s\n", last_dex_error);
|
||||
__dex_recurse(inner, buf, astrcat3(context, ".", tag));
|
||||
__dex_recurse(inner, buf, deeper_context(context, tag));
|
||||
} else {
|
||||
printf("parsing: %s\n", json_object_get_string(inner));
|
||||
sprintbuf(buf, "<dexter:groups><xsl:for-each select=\"%s\"><dexter:group>\n", myparse(json_object_get_string(inner)));
|
||||
printf("error: %s\n", last_dex_error);
|
||||
struct json_object * dot = json_object_new_string(".");
|
||||
__dex_recurse(dot, buf, astrcat3(context, ".", tag));
|
||||
__dex_recurse(dot, buf, deeper_context(context, tag));
|
||||
}
|
||||
sprintbuf(buf, "</dexter:group></xsl:for-each></dexter:groups>\n");
|
||||
break;
|
||||
|
@ -191,49 +206,77 @@ void __dex_recurse_foreach(struct json_object * json, char* key, struct json_obj
|
|||
printf("parsing: %s\n", expr);
|
||||
sprintbuf(buf, "<dexter:groups><xsl:for-each select=\"%s\"><dexter:group>\n", myparse(expr));
|
||||
printf("error: %s\n", last_dex_error);
|
||||
__dex_recurse(inner, buf, astrcat3(context, ".", tag));
|
||||
__dex_recurse(inner, buf, deeper_context(context, tag));
|
||||
sprintbuf(buf, "</dexter:group></xsl:for-each></dexter:groups>\n");
|
||||
} else {
|
||||
// MAGIC FORTHCOMING!
|
||||
char* inner_expr = inner_key_of(inner);
|
||||
if(inner_expr == NULL) { // boring, no singleton keys, just maintain structure
|
||||
printf("woot\n");
|
||||
sprintbuf(buf, "<dexter:groups><dexter:group>\n");
|
||||
__dex_recurse(inner, buf, deeper_context(context, tag));
|
||||
sprintbuf(buf, "</dexter:group></dexter:groups>\n");
|
||||
} else {
|
||||
printf("UNwoot\n");
|
||||
// MAGIC FORTHCOMING!
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case json_type_string:
|
||||
case json_type_object:
|
||||
__dex_recurse(val, buf, astrcat3(context, ".", tag));
|
||||
__dex_recurse(val, buf, deeper_context(context, tag));
|
||||
};
|
||||
sprintbuf(buf, "</%s>\n", tag);
|
||||
}
|
||||
|
||||
void __dex_recurse_array(struct json_object * json, struct printbuf* buf, char *context) {
|
||||
char* inner_key_of(struct json_object * json) {
|
||||
switch(json_object_get_type(json)) {
|
||||
case json_type_string:
|
||||
return json_object_get_string(json);
|
||||
case json_type_array:
|
||||
return NULL;
|
||||
case json_type_object:
|
||||
return inner_key_each(json);
|
||||
}
|
||||
}
|
||||
|
||||
char* inner_key_each(struct json_object * json) {
|
||||
json_object_object_foreach(json, key, val) {
|
||||
char* inner = inner_key_of(val);
|
||||
if(inner != NULL) return inner;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void __dex_recurse_array(struct json_object * json, struct printbuf* buf, contextPtr context) {
|
||||
printf("WTF!!!!!!!\n");
|
||||
}
|
||||
|
||||
void __dex_recurse_string(struct json_object * json, struct printbuf* buf, char *context) {
|
||||
void __dex_recurse_string(struct json_object * json, struct printbuf* buf, contextPtr context) {
|
||||
char* a = astrdup(json_object_get_string(json));
|
||||
char* ptr = context;
|
||||
char* last = context;
|
||||
char* ptr = context->name;
|
||||
char* last_name = context->name;
|
||||
char* expr;
|
||||
while(*ptr++){
|
||||
if(*ptr == '.') last = ptr + 1;
|
||||
if(*ptr == '.') last_name = ptr + 1;
|
||||
}
|
||||
dex_parsing_context = context;
|
||||
expr = myparse(a);
|
||||
sprintbuf(buf, "<xsl:variable name=\"%s\" select=\"%s\" />\n", context, expr);
|
||||
sprintbuf(buf, "<xsl:variable name=\"%s\" select=\"$%s\" />\n", last, context);
|
||||
sprintbuf(buf, "<xsl:value-of select=\"$%s\" />\n", context);
|
||||
sprintbuf(buf, "<xsl:variable name=\"%s\" select=\"%s\" />\n", context->name, expr);
|
||||
sprintbuf(buf, "<xsl:variable name=\"%s\" select=\"$%s\" />\n", last_name, context->name);
|
||||
sprintbuf(buf, "<xsl:value-of select=\"$%s\" />\n", context->name);
|
||||
}
|
||||
|
||||
void yyerror(const char * s) {
|
||||
struct printbuf *buf = printbuf_new();
|
||||
if(last_dex_error !=NULL) sprintbuf(buf, "%s\n", last_dex_error);
|
||||
sprintbuf(buf, "%s in key: %s", s, dex_parsing_context);
|
||||
sprintbuf(buf, "%s in key: %s", s, dex_parsing_context->name);
|
||||
last_dex_error = strdup(buf->buf);
|
||||
printbuf_free(buf);
|
||||
}
|
||||
|
||||
void __dex_recurse(struct json_object * json, struct printbuf* buf, char *context) {
|
||||
void __dex_recurse(struct json_object * json, struct printbuf* buf, contextPtr context) {
|
||||
switch(json_object_get_type(json)){
|
||||
case json_type_object:
|
||||
__dex_recurse_object(json, buf, context);
|
||||
|
|
24
dexter.h
24
dexter.h
|
@ -13,7 +13,6 @@
|
|||
#define obstack_chunk_free free
|
||||
|
||||
static struct obstack dex_obstack;
|
||||
static char* dex_parsing_context;
|
||||
static int dex_debug_mode = 0;
|
||||
static bool dex_exslt_registered = false;
|
||||
static char* last_dex_error;
|
||||
|
@ -25,7 +24,16 @@ typedef struct __compiled_dex {
|
|||
char* error;
|
||||
} compiled_dex;
|
||||
|
||||
typedef struct __dex_context {
|
||||
char* name;
|
||||
} dex_context;
|
||||
|
||||
|
||||
|
||||
typedef compiled_dex * dexPtr;
|
||||
typedef dex_context * contextPtr;
|
||||
|
||||
static contextPtr dex_parsing_context;
|
||||
|
||||
void dex_free(dexPtr);
|
||||
dexPtr dex_compile(char* dex, char* incl);
|
||||
|
@ -35,10 +43,14 @@ xmlDocPtr dex_parse_string(dexPtr, char*, size_t, boolean);
|
|||
static xmlDocPtr dex_parse_doc(dexPtr, xmlDocPtr);
|
||||
|
||||
void* __dex_alloc(int);
|
||||
static void __dex_recurse(struct json_object *, struct printbuf*, char*);
|
||||
static void __dex_recurse_object(struct json_object *, struct printbuf*, char*);
|
||||
static void __dex_recurse_array(struct json_object *, struct printbuf*, char*);
|
||||
static void __dex_recurse_string(struct json_object *, struct printbuf*, char*);
|
||||
static void __dex_recurse_foreach(struct json_object *, char *, struct json_object *, struct printbuf *, char *);
|
||||
static char* inner_key_of(struct json_object *);
|
||||
static char* inner_key_each(struct json_object *);
|
||||
static contextPtr clone_context(contextPtr);
|
||||
static contextPtr deeper_context(contextPtr, char*);
|
||||
static void __dex_recurse(struct json_object *, struct printbuf*, contextPtr);
|
||||
static void __dex_recurse_object(struct json_object *, struct printbuf*, contextPtr);
|
||||
static void __dex_recurse_array(struct json_object *, struct printbuf*, contextPtr);
|
||||
static void __dex_recurse_string(struct json_object *, struct printbuf*, contextPtr);
|
||||
static void __dex_recurse_foreach(struct json_object *, char *, struct json_object *, struct printbuf *, contextPtr);
|
||||
|
||||
#endif
|
|
@ -12,8 +12,3 @@
|
|||
}]
|
||||
}]
|
||||
}
|
||||
|
||||
___ can you even build a key on this? (exslt node-set?!!?!?)
|
||||
| | | | | | | | | | | |
|
||||
|
||||
for-each group-after(h1)[1] / (#posts li)[1] / group-after(#comments h3)[1] / #comments p
|
||||
|
|
|
@ -18,6 +18,35 @@
|
|||
}]
|
||||
}]
|
||||
}
|
||||
|
||||
key looks like: use="count(set:intersection(following::*, <KEY>))
|
||||
|
||||
visitation:
|
||||
page
|
||||
- type: magic, key: //h1
|
||||
page>title
|
||||
- type: simple
|
||||
- append-key: page-title-key
|
||||
- value-of:select key
|
||||
page>nav
|
||||
- type:simple-array
|
||||
- append-key: page-nav-key
|
||||
- for-each select(key) > value-of .
|
||||
|
||||
|
||||
|
||||
<xsl:key name="comment-title-key" match="//*[@id='comments']//h3" use="count(set:intersection(following::*, //*[@id='comments']//h3))" />
|
||||
|
||||
|
||||
|
||||
["page", :magic, "h1"] => {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
]
|
||||
-->
|
||||
|
||||
<xsl:template match="/">
|
||||
|
@ -32,7 +61,7 @@
|
|||
<xsl:attribute name="title"><xsl:value-of select=".//h2" /></xsl:attribute>
|
||||
<xsl:for-each select=".//*[@id='comments']//h3">
|
||||
<comment>
|
||||
<xsl:variable name="comment_index" select="count(set:intersection(following::*, //*[@id='comments']//h3))"/>
|
||||
<xsl:variable name="comment_index" select="count(set:intersection(following::*, //*[@id='posts']//li//*[@id='comments']//h3))"/>
|
||||
<xsl:attribute name="index"><xsl:value-of select="$comment_index" /></xsl:attribute>
|
||||
<xsl:attribute name="ele"><xsl:value-of select="count(key('comment-title-key', $comment_index))" /></xsl:attribute>
|
||||
<xsl:attribute name="title"><xsl:value-of select="key('`', $comment_index)" /></xsl:attribute>
|
||||
|
|
Loading…
Reference in New Issue