char *CSSSheetCopyText(CSSSheet *sheet) { DFBuffer *result = DFBufferNew(); const char **allSelectors = CSSSheetCopySelectors(sheet); DFSortStringsCaseInsensitive(allSelectors); for (int selIndex = 0; allSelectors[selIndex]; selIndex++) { CSSStyle *style = CSSSheetLookupSelector(sheet,allSelectors[selIndex],0,0); DFBufferFormat(result,"%s\n",style->selector); const char **sortedSuffixes = CSSStyleCopySuffixes(style); DFSortStringsCaseInsensitive(sortedSuffixes); for (int suffixIndex = 0; sortedSuffixes[suffixIndex]; suffixIndex++) { const char *suffix = sortedSuffixes[suffixIndex]; char *quotedSuffix = DFQuote(suffix); DFBufferFormat(result," %s\n",quotedSuffix); free(quotedSuffix); CSSProperties *properties = CSSStyleRuleForSuffix(style,suffix); const char **sortedNames = CSSPropertiesCopyNames(properties); DFSortStringsCaseInsensitive(sortedNames); for (int nameIndex = 0; sortedNames[nameIndex]; nameIndex++) { const char *name = sortedNames[nameIndex]; const char *value = CSSGet(properties,name); DFBufferFormat(result," %s = %s\n",name,value); } free(sortedNames); } free(sortedSuffixes); } free(allSelectors); char *str = xstrdup(result->data); DFBufferRelease(result); return str; }
void parseContent(const char *content) { DFArray *parts = CSSParseContent(content); printf("parts.count = %zu\n",DFArrayCount(parts)); for (size_t i = 0; i < DFArrayCount(parts); i++) { ContentPart *part = DFArrayItemAt(parts,i); char *quotedValue = DFQuote(part->value); printf("%s %s\n",ContentPartTypeString(part->type),quotedValue); free(quotedValue); } DFArrayRelease(parts); }
static void extractPrefixRecursive(DFNode *node, const char *counterName, DFBuffer *result, int *foundSeq, int *foundContent) { if (isSeqField(node)) { if (result->len > 0) DFBufferFormat(result," "); DFBufferFormat(result,"counter(%s)",counterName); *foundSeq = 1; DFRemoveNode(node); return; } if (node->tag == DOM_TEXT) { size_t valueLen = strlen(node->value); size_t pos = 0; if (*foundSeq) { size_t offset = 0; uint32_t ch; do { pos = offset; ch = DFNextChar(node->value,&offset); } while ((ch != 0) && (DFCharIsWhitespaceOrNewline(ch) || DFCharIsPunctuation(ch))); } else { pos = valueLen; } if (pos == valueLen) { if (result->len > 0) DFBufferFormat(result," "); char *quotedValue = DFQuote(node->value); DFBufferFormat(result,"%s",quotedValue); free(quotedValue); DFRemoveNode(node); if (*foundSeq) *foundContent = 1; return; } else if (pos > 0) { char *first = DFSubstring(node->value,0,pos); char *rest = DFSubstring(node->value,pos,valueLen); if (result->len > 0) DFBufferFormat(result," "); char *quotedFirst = DFQuote(first); DFBufferFormat(result,"%s",quotedFirst); free(quotedFirst); DFSetNodeValue(node,rest); if (*foundSeq) *foundContent = 1; free(first); free(rest); return; } } int wasEmpty = (node->first == NULL); DFNode *next; for (DFNode *child = node->first; child != NULL; child = next) { next = child->next; if (*foundContent) break; extractPrefixRecursive(child,counterName,result,foundSeq,foundContent); } int isEmpty = (node->first == NULL); if ((node->tag == HTML_SPAN) && isEmpty && !wasEmpty) DFRemoveNode(node); }