checkpoint

This commit is contained in:
Kyle Maxwell 2008-12-23 14:04:37 -08:00
parent ee351722dc
commit 46d499a646
4 changed files with 109 additions and 30 deletions

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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>