docs: public void extractValidationComponents(CharSequence content, File inputFile,
  			Procedure1<Map<Tag, List<MutableTriple<File, Integer, String>>>> observer) {
  		//
  		// STEP 1: Extract the raw text
  		//
  		final Map<Tag, List<MutableTriple<File, Integer, String>>> components = new TreeMap<>();
  		final ContentParserInterceptor interceptor = new ContentParserInterceptor(new ParserInterceptor() {
  			@Override
  			public void tag(ParsingContext context, Tag tag, String dynamicName, String parameter,
  					String blockValue) {
  				if (tag.isOpeningTag() || tag.hasParameter()) {
  					List<MutableTriple<File, Integer, String>> values = components.get(tag);
  					if (values == null) {
  						values = new ArrayList<>();
  						components.put(tag, values);
  					}
  					if (tag.isOpeningTag()) {
  						values.add(new MutableTriple<>(context.getCurrentFile(),
  								context.getLineNo(), Strings.nullToEmpty(blockValue).trim()));
  					} else {
  						values.add(new MutableTriple<>(context.getCurrentFile(),
  								context.getLineNo(), Strings.nullToEmpty(parameter).trim()));
  					}
  				}
  			}
  		});
  		final ParsingContext rootContextForReplacements = new ParsingContext(true, true);
  		initializeContext(rootContextForReplacements);
  		parse(content, inputFile, 0, Stage.FIRST, rootContextForReplacements, interceptor);
  		//
  		// STEP 2: Do macro replacement in the captured elements.
  		//
  		final Collection<List<MutableTriple<File, Integer, String>>> allTexts = new ArrayList<>(components.values());
  		for (final List<MutableTriple<File, Integer, String>> values : allTexts) {
  			for (final MutableTriple<File, Integer, String> pair : values) {
  				final ContentParserInterceptor localInterceptor = new ContentParserInterceptor(interceptor);
  				parse(pair.getRight(), inputFile, 0, Stage.SECOND, rootContextForReplacements, localInterceptor);
  				final String newCapturedText = localInterceptor.getResult();
  				pair.setRight(newCapturedText);
  			}
  		}
  
  		observer.apply(components);
  	}