tokenize - How to make string formatting mechanism in Java? -
i'm trying make string formatting mechanism, pretty looks winamp advanced title formatting.
i have 'variables' (or metadata fields) bound object properties, in form %varname%. so, example, %title% metadata field bound song title, 'conquest of paradise', %artist% metadata field bound song artist, 'vangelis', , %feat% metadata field bound featuring artists, 'english chamber choir'.
now want display song depending on given formatting, example:
%title%[ (by %artist%[ featuring %feat%])]
square brackets mean don't display unless (all) metadata inside brackets set. nesting of square brackets should possible.
abovementioned formatting string says: display metadata field %title% and, if %artist% set (not empty string), display (by %artist%)
, if %feat% metadata field non-empty, display field also. in abovementioned example, become:
conquest of paradise (by vangelis featuring english chamber choir)
now how make such mechanism? start?
i guess have tokenize string , per 'section' search metadata tags?
i build tree structure represents pattern. example, like:
root + variable (title) + group + text (" (by ") + variable (artist) + group + text (" featuring ") + variable (feat) + text (")")
then when evaluate meta data against tree, store @ group level whether variables , sub-groups in group evaluated, , if use text.
your tree classes like:
interface node { string evaluate(map<string, string> metadata); } class group implements node { private final list<node> _children; group(final list<node> children) { _children = children; } @override public string evaluate(final map<string, string> metadata) { final stringbuilder sb = new stringbuilder(); (final node node : _children) { final string subtext = node.evaluate(metadata); if (subtext == null) return null; sb.append(subtext); } return sb.tostring(); } } class text implements node { private final string _text; text(final string text) { _text = text; } @override public string evaluate(final map<string, string> metadata) { return _text; } } class variable implements node { private final string _variable; variable(final string variable) { _variable = variable; } @override public string evaluate(final map<string, string> metadata) { return metadata.get(_variable); } }
all that's left work out how parse string create tree structure.
Comments
Post a Comment