char const* MTD_FLASHMEM ParameterReplacer::replaceTag(char const* curc) { char const* tagEnd; char const* tagStart = extractTagStr(curc, &tagEnd); if (getChar(tagStart) == '#') { // replace multiple parameters ('0param', '1param', ...) ++tagStart; uint32_t tagLen = tagEnd - tagStart; char tag[tagLen]; f_memcpy(tag, tagStart, tagLen); tag[tagLen] = 0; for (uint32_t index = 0; ; ++index) { char const* fulltagname = f_printf(FSTR("%d%s"), index, tag); Params::Item* item = m_params->getItem(fulltagname); if (item) m_result.addChunks(&item->value); // push parameter content else break; } } else { // replace one parameter Params::Item* item = m_params->getItem(tagStart, tagEnd); if (item) m_result.addChunks(&item->value); // push parameter content } return tagEnd + 2; // bypass "}}" }
void MTD_FLASHMEM ParameterReplacer::processInput() { char const* curc = m_strStart; char const* start = curc; char const* curBlockKey = NULL; char const* curBlockKeyEnd = NULL; while (curc != m_strEnd) { char c0 = getChar(curc); if (c0 == '{') { char c1 = getChar(curc + 1); if (c1 == '{') { // found "{{" // push previous content m_result.addChunk(start, curc - start, false); // process parameter tag start = curc = replaceTag(curc); continue; } else if (c1 == '%') { // found "{%" // push previous content if (curBlockKey && curBlockKeyEnd) { m_result.addChunk(start, curc - start, false); m_blocks.add(curBlockKey, curBlockKeyEnd, m_result); m_result.clear(); } // process block tag curBlockKey = extractTagStr(curc, &curBlockKeyEnd); start = curc = curBlockKeyEnd + 2; // bypass "%}" // if this is the first block tag then this is the template file name if (m_template.get() == NULL) { m_template.reset(f_strdup(curBlockKey, curBlockKeyEnd)); curBlockKey = NULL; curBlockKeyEnd = NULL; } continue; } } ++curc; } m_result.addChunk(start, m_strEnd - start, false); if (curBlockKey && curBlockKeyEnd) { m_blocks.add(curBlockKey, curBlockKeyEnd, m_result); m_result.clear(); } }