I would like to program a WYSIWYG editor for HTML. I’m looking for a high level approach, which I will eventually be implementing in C++.
My initial approach is to create a hierarchy of classes which extend a common base class (node). So object “body” would contain object “p” which would contain object “b” which would contain some text.
class node {
node *parent;
vector<node> children;
string name;
map<string,string> attributes;
string text;
virtual void render(const rect &rect, const point &offset) = 0;
virtual void onEvent(const event &e);
}
The main engine would call something like body.render(screen, point(0, 0)), which would recursively render its children.
The cursor would be represented by a pointer into the object hierarchy, and each node would have its own internal cursor state, and would respond to keyboard events when it is the selected node.
For example, if the user hits the left-arrow, and the “p” node is selected, the “p” node’s reaction to the keypress might be to change the current node to the parent of “p”.
Abstractly, it seems like this could work, the closest thing I can find to what I’m looking for is Sigil, which at first glance seems pretty intimidating to study (main.cpp is 70k).
Before I go down this road, I was wondering if anyone had a simpler approach, or can see any pitfalls with this method.
A simpler approach, if you can do this, is to embed a web browser in your application and set
contentEditable="true"on<body>. If you’re on Windows, you can use the built-in one, or you can embed an engine like Gecko or WebKit.