Manifests

A library that wants to expose new tags to MXHX may create an XML manifest that maps tag names to fully-qualified class names.

The following example manifest creates two new tags.

<componentPackage>
  <component id="MyComponent" class="com.example.MyComponent"/>
  <component id="AnotherComponent" class="com.example.AnotherComponent"/>
</componentPackage>

A manifest may be registered with mxhx.macros.MXHXComponent in a Haxe initialization macro.

The following example creates a class with a static initialize() method that may be used as an initialization macro. If this class is located at ./src/com/example/macros/MXHXMacro.hx, it assumes that the manifest may be found at ./mxhx-manifest.xml (in the parent directory of src).

package com.example.macros;

#if macro
import haxe.io.Path;
import haxe.macro.Context;
import haxe.macro.Expr;

class MXHXMacro {
	private static final NS_URI = "https://ns.example.com/mxhx";
	private static final MANIFEST_FILE_NAME = "mxhx-manifest.xml";

	public static function initialize():Void {
		var libraryPath = getLibraryPath();
		if (libraryPath == null) {
			return;
		}
		var manifestPath = Path.join([libraryPath, MANIFEST_FILE_NAME]);
		mxhx.macros.MXHXComponent.registerManifest(NS_URI, manifestPath);
  }

	private static function getLibraryPath():String {
		var t = Context.getModule("com.example.macros.MXHXMacro");
		var filePath:String = null;
		switch (t[0]) {
			case TInst(t, params):
				filePath = Context.getPosInfos(t.get().pos).file;
			default:
				return null;
		}
		return Path.join([Path.directory(filePath), "..", "..", ".."]);
	}
}

To use this initialization macro, specify the --macro compiler option.

--macro com.example.macros.MXHXMacro.initialize()