aboutsummaryrefslogtreecommitdiff
path: root/src/minimacro.h
blob: e13601543a0e0391cc6d8927c15be8f27e026138 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/*
 * Copyright (C) 2007 Xagasoft, All rights reserved.
 *
 * This file is part of the libbu++ library and is released under the
 * terms of the license contained in the file LICENSE.
 */

#ifndef BU_MINI_MACRO_H
#define BU_MINI_MACRO_H

namespace Bu
{
	/**
	 * A processor for Libbu++ brand Mini Macros.  These are really simple, but
	 * still fairly flexible.  It's mainly text replacement, but with a few
	 * extras like filter functions and conditional text segments.  So far we
	 * don't support loops or anything, I'm not sure we ever will.
	 *
	 * Anatomy of a mini macro:
	 * - Every macro begins with a two character code, the first character is
	 *   always '{', the second character determines the operation to perform.
	 * - If the '{' is followed by a character that is not valid it is not
	 *   considered for expansion and the characters are copied to the output.
	 * - Every macro ends with a closing '}'
	 * - Macro types:
	 *   - '=': variable replacement.  The '=' is immediatley followed by the
	 *     name of the variable to replace, then any number of optional filter
	 *     segments.
	 *   - '?': conditional text.  The '?' is immediately followed by the
	 *     variable to test.  This works two ways, the variable can be alone, in
	 *     which case it's existance is tested, or it can be followed by a "="
	 *     and a string to compare to.  This is then followed by a text segment
	 *     that will be used if the test is true, and an optional text segment
	 *     to be used if the test is false.
	 * - Segments:
	 *   - Each segment is seperated by a colon.
	 *   - Filter segments give the name of the filter, followed by
	 *     parenthesies.  Parameters may be provided within the parenthesies.
	 *   - Text segments should always be quoted, but may contain any characters
	 *     within the quotes, backslash is used as per C/ANSI/ISO standard.
	 *     You can also quote any text using [" "] instead of quotes, which
	 *     allows for nested strings.  The [" token is only recognised within
	 *     a macro.
	 *
	 *@verbatim
	 {=name:tolower()}
	 {=name:ccsplit("_"):toupper()}
	 {?name:"name exists and is {=name}"}
	 {?name:"{=name}":"no name!"}
	 {?name="bob":"You're named bob!":"Who are you?  I only know bob..."}
	 @endverbatim
	 */
	class MiniMacro
	{
	public:
		MiniMacro();
		virtual ~MiniMacro();

	private:
	};
};

#endif