Create a New Doxia Module

First, the easiest way is to create a POM with doxia-modules as parent:

<project>
  <parent>
    <groupId>org.apache.maven.doxia</groupId>
    <artifactId>doxia-modules</artifactId>
    <version>2.2.0</version> <!-- Latest release -->
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <artifactId>doxia-module-my</artifactId>
  <name>Doxia :: MY Module</name>

  ...
</project>

Secondly, you should implement some Doxia classes, depending on what features you want: parsing or generating markup. Parsers, parser modules and sink factories are JSR-330 components, named by @Named; the doxia-modules parent already writes the component index. For details, see Maven & JSR-330.

Parsing

  • MyParser class

    import javax.inject.Named;
    import javax.inject.Singleton;
    
    import org.apache.maven.doxia.parser.AbstractParser;
    
    @Singleton
    @Named("my")
    public class MyParser
        extends AbstractParser
    {
    ...
    }
    

    Depending on the type markup, extending AbstractTextParser, AbstractXmlParser or Xhtml5BaseParser may give you more features.

  • MyParseException class (optional)

    import org.apache.maven.doxia.parser.ParseException;
    
    public class MyParseException
        extends ParseException
    {
    ...
    }
    
  • MyParserModule class

    import javax.inject.Named;
    import javax.inject.Singleton;
    
    import org.apache.maven.doxia.parser.module.AbstractParserModule;
    
    @Singleton
    @Named("my")
    public class MyParserModule
        extends AbstractParserModule
    {
    ...
    }
    

Generating

  • MySink class

    import org.apache.maven.doxia.sink.impl.SinkAdapter;
    
    public class MySink
        extends SinkAdapter
    {
    ...
    }
    

    Depending on the type markup, extending AbstractTextSink, AbstractXmlSink or Xhtml5BaseSink may give you more features.

  • MySinkFactory class

    import javax.inject.Named;
    import javax.inject.Singleton;
    
    import org.apache.maven.doxia.sink.SinkFactory;
    
    @Singleton
    @Named("my")
    public class MySinkFactory
        implements SinkFactory
    {
    ...
    }
    

    Depending on the type markup, extending AbstractTextSinkFactory or AbstractXmlSinkFactory may give you more features.

References