93943b9bd3f5d6d9ef5a51e636636449b0c607b1 kent Mon Dec 9 11:10:26 2013 -0800 Separating out generic portable JSON parser from Genome Browser specific stuff in jsHelper module, creating jsonParse module. diff --git src/hg/inc/jsHelper.h src/hg/inc/jsHelper.h index 2ffc453..03e2919 100644 --- src/hg/inc/jsHelper.h +++ src/hg/inc/jsHelper.h @@ -1,22 +1,23 @@ // jsHelper.c - helper routines for interface between CGIs and client-side javascript #ifndef JSHELPER_H #define JSHELPER_H #include "cart.h" #include +#include "jsonParse.h" #define JS_CLEAR_ALL_BUTTON_LABEL "Clear all" #define JS_SET_ALL_BUTTON_LABEL "Set all" #define JS_DEFAULTS_BUTTON_LABEL "Set defaults" // Make toggle and [+][-] buttons without image gifs. // Not ready for this release. //#define BUTTONS_BY_CSS void jsCreateHiddenForm(struct cart *cart, char *scriptName, char **vars, int varCount); /* Create a hidden form with the given variables. Must be * called. */ void jsInit(); @@ -130,155 +131,33 @@ /* Make the hidden input, collapse/expand button and needed for utils.js's * setTableRowVisibility(). Caller needs to have already created a and . */ void jsBeginCollapsibleSectionFontSize(struct cart *cart, char *track, char *section, char *sectionTitle, boolean isOpenDefault, char *fontSize); /* Make the hidden input, collapse/expand button and needed for utils.js's * setTableRowVisibility(). Caller needs to have already created a
and . */ void jsEndCollapsibleSection(); /* End the collapsible . */ void jsReloadOnBackButton(struct cart *cart); /* Add some javascript to detect that the back button (or reload) has been pressed, * and to resubmit in that case to redraw the page with the latest cart contents. */ -/* JSON Element code let's you build up a DOM like data structure in memory and then serialize it into - html for communication with client side code. - */ - -// supported types - -typedef enum _jsonElementType -{ - jsonList = 0, - jsonObject = 1, - jsonNumber = 2, - jsonDouble = 3, - jsonBoolean = 4, - jsonString = 5 -} jsonElementType; - -union jsonElementVal -{ - struct slRef *jeList; - struct hash *jeHash; - long jeNumber; - double jeDouble; - boolean jeBoolean; - char *jeString; -}; - -struct jsonElement -{ - jsonElementType type; - union jsonElementVal val; -}; - -// constructors for each jsonElementType - -struct jsonElement *newJsonString(char *str); -struct jsonElement *newJsonBoolean(boolean val); -struct jsonElement *newJsonNumber(long val); -struct jsonElement *newJsonDouble(double val); -struct jsonElement *newJsonObject(struct hash *h); -struct jsonElement *newJsonList(struct slRef *list); - -void jsonObjectAdd(struct jsonElement *h, char *name, struct jsonElement *ele); -// Add a new element to a jsonObject; existing values are replaced. -// NOTE: Adding to a NULL hash will add to the global "common" hash printed with jsonPrintGlobals(); - -void jsonListAdd(struct jsonElement *list, struct jsonElement *ele); -// Add a new element to a jsonList +// --- Genome browser specific json stuff - see also inc/json.h for more generic stuff void jsonPrint(struct jsonElement *json, char *name, int indentLevel); // print out a jsonElement and children using hPrintf, and for indentLevel >=0 // bracketing with comments. See also jsonPrintToFile. extern struct jsonElement *jsonGlobalsHash; // The "all" globals json hash void jsonPrintGlobals(boolean wrapWithScriptTags); // prints out the "common" globals json hash // This hash is the one utils.js and therefore all CGIs know about void jsonErrPrintf(struct dyString *ds, char *format, ...); // Printf a json error to a dyString for communicating with ajax code; format is: // {"error": error message here} -struct jsonElement *jsonParse(char *str); -// parse string into an in-memory json representation - -char *jsonStringEscape(char *inString); -/* backslash escape a string for use in a double quoted json string. - * More conservative than javaScriptLiteralEncode because - * some json parsers complain if you escape & or ' */ - -void jsonFindNameRecurse(struct jsonElement *ele, char *jName, struct slName **pList); -// Search the JSON tree recursively to find all the values associated to -// the name, and add them to head of the list. - -struct slName *jsonFindName(struct jsonElement *json, char *jName); -// Search the JSON tree to find all the values associated to the name -// and add them to head of the list. - -struct slName *jsonFindNameUniq(struct jsonElement *json, char *jName); -// Search the JSON tree to find all the values associated to the name -// and add them to head of the list. - -void jsonElementRecurse(struct jsonElement *ele, char *name, boolean isLast, - void (*startCallback)(struct jsonElement *ele, char *name, boolean isLast, void *context), - // Called at element start - void (*endCallback)(struct jsonElement *ele, char *name, boolean isLast, void *context), - // Called at element end - void *context); -/* Recurse through JSON tree calling callback functions with element and context. - * Either startCallback or endCallback may be NULL, as can be name. */ - -void jsonPrintOneStart(struct jsonElement *ele, char *name, boolean isLast, int indent, FILE *f); -/* Print the start of one json element - just name and maybe an opening brace or bracket. - * Recursion is handled elsewhere. */ - -void jsonPrintOneEnd(struct jsonElement *ele, char *name, boolean isLast, boolean indent, FILE *f); -/* Print object end */ - -void jsonPrintToFile(struct jsonElement *root, char *name, FILE *f, int indentPer); -/* Print out JSON object and all children nicely indented to f as JSON objects. - * Name may be NULL. Implemented via jsonPrintOneStart/jsonPrintOneEnd. */ - -/** Routines that check json type and return corresponding value. **/ - -struct slRef *jsonListVal(struct jsonElement *ele, char *name); -/* Enforce element is type jsonList. Return list value */ - -struct hash *jsonObjectVal(struct jsonElement *ele, char *name); -/* Enforce object is type jsonObject. Return object hash */ - -long jsonNumberVal(struct jsonElement *ele, char *name); -/* Enforce element is type jsonNumber and return value. */ - -long jsonDoubleVal(struct jsonElement *ele, char *name); -/* Enforce element is type jsonDouble and return value. */ - -long jsonBooleanVal(struct jsonElement *ele, char *name); -/* Enforce element is type jsonBoolean and return value. */ - -char *jsonStringVal(struct jsonElement *ele, char *eleName); -/* Enforce element is type jsonString and return value. */ - -/** Routines that help work with json objects (bracket enclosed key/val pairs **/ - -struct jsonElement *jsonFindNamedField(struct jsonElement *object, - char *objectName, char *field); -/* Find named field of object or return NULL if not found. Abort if object - * is not actually an object. */ - -struct jsonElement *jsonMustFindNamedField(struct jsonElement *object, - char *objectName, char *field); -/* Find named field of object or die trying. */ - -char *jsonOptionalStringField(struct jsonElement *object, char *field, char *defaultVal); -/* Return string valued field of object, or defaultVal if it doesn't exist. */ - -char *jsonStringField(struct jsonElement *object, char *field); -/* Return string valued field of object or abort if field doesn't exist. */ #endif /* JSHELPER_H */