private AttributesBuilder getAttributes(ConfigSection cfg, String revision) {
   AttributesBuilder ab =
       AttributesBuilder.attributes()
           .tableOfContents(cfg.getBoolean(KEY_INCLUDE_TOC, true))
           .sourceHighlighter("prettify");
   for (String name : attributes.stringPropertyNames()) {
     ab.attribute(name, attributes.getProperty(name));
   }
   ab.attribute("last-update-label!");
   ab.attribute("revnumber", revision);
   return ab;
 }
 private AttributesBuilder buildAttributes() {
   AttributesBuilder attributesBuilder = AttributesBuilder.attributes();
   attributesBuilder.imagesDir(imagesDir);
   if (sourceHighlighter != null) {
     attributesBuilder.sourceHighlighter(sourceHighlighter);
   }
   if (embedAssets) {
     attributesBuilder.linkCss(false);
     attributesBuilder.dataUri(true);
   }
   attributesBuilder.copyCss(false);
   // TODO Figure out how to reliably set other values (like boolean values, dates, times, etc)
   for (Attribute attribute : attributes) {
     if ("true".equals(attribute.getValue()) || "false".equals(attribute.getValue())) {
       attributesBuilder.attribute(
           attribute.getKey(),
           Attributes.toAsciidoctorFlag(Boolean.valueOf(attribute.getValue())));
       continue;
     }
     // Can't do anything about dates and times because all that logic is private in Attributes
     attributesBuilder.attribute(attribute.getKey(), attribute.getValue());
   }
   return attributesBuilder;
 }
 private Options getAsciiDocOptionsAndAttributes(ParserContext context) {
   Configuration config = context.getConfig();
   final AttributesBuilder attributes =
       attributes(config.getStringArray(Keys.ASCIIDOCTOR_ATTRIBUTES));
   if (config.getBoolean(Keys.ASCIIDOCTOR_ATTRIBUTES_EXPORT, false)) {
     final String prefix = config.getString(Keys.ASCIIDOCTOR_ATTRIBUTES_EXPORT_PREFIX, "");
     for (final Iterator<String> it = config.getKeys(); it.hasNext(); ) {
       final String key = it.next();
       if (!key.startsWith("asciidoctor")) {
         attributes.attribute(prefix + key.replace(".", "_"), config.getProperty(key));
       }
     }
   }
   final Configuration optionsSubset = config.subset(Keys.ASCIIDOCTOR_OPTION);
   final Options options = options().attributes(attributes.get()).get();
   for (final Iterator<String> iterator = optionsSubset.getKeys(); iterator.hasNext(); ) {
     final String name = iterator.next();
     options.setOption(name, guessTypeByContent(optionsSubset.getString(name)));
   }
   options.setBaseDir(context.getFile().getParentFile().getAbsolutePath());
   options.setSafe(UNSAFE);
   return options;
 }