Expanded nsIEditPropery to include all (I hope) HTML tags

This commit is contained in:
cmanske%netscape.com 1999-06-25 03:18:42 +00:00
parent 42235c8acd
commit ea7bde4716
8 changed files with 752 additions and 266 deletions

View File

@ -29,86 +29,256 @@ NS_IMPL_RELEASE(nsEditProperty)
// XXX: remove when html atoms are exported from layout
// inline tags
nsIAtom * nsIEditProperty::a;
nsIAtom * nsIEditProperty::b;
nsIAtom * nsIEditProperty::big;
nsIAtom * nsIEditProperty::font;
nsIAtom * nsIEditProperty::i;
nsIAtom * nsIEditProperty::img;
nsIAtom * nsIEditProperty::span;
nsIAtom * nsIEditProperty::small;
nsIAtom * nsIEditProperty::strike;
nsIAtom * nsIEditProperty::sub;
nsIAtom * nsIEditProperty::sup;
nsIAtom * nsIEditProperty::tt;
nsIAtom * nsIEditProperty::u;
// block tags
nsIAtom * nsIEditProperty::blockquote;
nsIAtom * nsIEditProperty::br;
nsIAtom * nsIEditProperty::h1;
nsIAtom * nsIEditProperty::h2;
// properties
nsIAtom * nsIEditProperty::color;
nsIAtom * nsIEditProperty::face;
nsIAtom * nsIEditProperty::size;
nsIAtom * nsIEditProperty::b;
nsIAtom * nsIEditProperty::big;
nsIAtom * nsIEditProperty::i;
nsIAtom * nsIEditProperty::small;
nsIAtom * nsIEditProperty::strike;
nsIAtom * nsIEditProperty::sub;
nsIAtom * nsIEditProperty::sup;
nsIAtom * nsIEditProperty::tt;
nsIAtom * nsIEditProperty::u;
nsIAtom * nsIEditProperty::em;
nsIAtom * nsIEditProperty::strong;
nsIAtom * nsIEditProperty::dfn;
nsIAtom * nsIEditProperty::code;
nsIAtom * nsIEditProperty::samp;
nsIAtom * nsIEditProperty::kbd;
nsIAtom * nsIEditProperty::var;
nsIAtom * nsIEditProperty::cite;
nsIAtom * nsIEditProperty::abbr;
nsIAtom * nsIEditProperty::acronym;
nsIAtom * nsIEditProperty::font;
nsIAtom * nsIEditProperty::a;
nsIAtom * nsIEditProperty::img;
nsIAtom * nsIEditProperty::object;
nsIAtom * nsIEditProperty::br;
nsIAtom * nsIEditProperty::script;
nsIAtom * nsIEditProperty::map;
nsIAtom * nsIEditProperty::q;
nsIAtom * nsIEditProperty::span;
nsIAtom * nsIEditProperty::bdo;
nsIAtom * nsIEditProperty::input;
nsIAtom * nsIEditProperty::select;
nsIAtom * nsIEditProperty::textarea;
nsIAtom * nsIEditProperty::label;
nsIAtom * nsIEditProperty::button;
nsIAtom * nsIEditProperty::p;
nsIAtom * nsIEditProperty::div;
nsIAtom * nsIEditProperty::blockquote;
nsIAtom * nsIEditProperty::h1;
nsIAtom * nsIEditProperty::h2;
nsIAtom * nsIEditProperty::h3;
nsIAtom * nsIEditProperty::h4;
nsIAtom * nsIEditProperty::h5;
nsIAtom * nsIEditProperty::h6;
nsIAtom * nsIEditProperty::ul;
nsIAtom * nsIEditProperty::ol;
nsIAtom * nsIEditProperty::dl;
nsIAtom * nsIEditProperty::pre;
nsIAtom * nsIEditProperty::noscript;
nsIAtom * nsIEditProperty::form;
nsIAtom * nsIEditProperty::hr;
nsIAtom * nsIEditProperty::table;
nsIAtom * nsIEditProperty::fieldset;
nsIAtom * nsIEditProperty::address;
nsIAtom * nsIEditProperty::body;
nsIAtom * nsIEditProperty::tr;
nsIAtom * nsIEditProperty::td;
nsIAtom * nsIEditProperty::th;
nsIAtom * nsIEditProperty::caption;
nsIAtom * nsIEditProperty::col;
nsIAtom * nsIEditProperty::colgroup;
nsIAtom * nsIEditProperty::thead;
nsIAtom * nsIEditProperty::tfoot;
nsIAtom * nsIEditProperty::li;
nsIAtom * nsIEditProperty::dt;
nsIAtom * nsIEditProperty::dd;
nsIAtom * nsIEditProperty::legend;
nsIAtom * nsIEditProperty::color;
nsIAtom * nsIEditProperty::face;
nsIAtom * nsIEditProperty::size;
// special
nsString * nsIEditProperty::allProperties;
/* From the HTML 4.0 DTD,
INLINE:
<!-- %inline; covers inline or "text-level" elements -->
<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">
<!ENTITY % fontstyle "TT | I | B | BIG | SMALL">
<!ENTITY % phrase "EM | STRONG | DFN | CODE |
SAMP | KBD | VAR | CITE | ABBR | ACRONYM" >
<!ENTITY % special
"A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO">
<!ENTITY % formctrl "INPUT | SELECT | TEXTAREA | LABEL | BUTTON">
BLOCK:
<!ENTITY % block
"P | %heading (h1-h6); | %list (UL | OL); | %preformatted (PRE); | DL | DIV | NOSCRIPT |
BLOCKQUOTE | FORM | HR | TABLE | FIELDSET | ADDRESS">
But what about BODY, TR, TD, TH, CAPTION, COL, COLGROUP, THEAD, TFOOT, LI, DT, DD, LEGEND, etc.?
*/
nsEditProperty::nsEditProperty()
{
NS_INIT_REFCNT();
// tags
nsIEditProperty::a = NS_NewAtom("a");
nsIEditProperty::b = NS_NewAtom("b");
nsIEditProperty::big = NS_NewAtom("big");
nsIEditProperty::font = NS_NewAtom("font");
nsIEditProperty::i = NS_NewAtom("i");
nsIEditProperty::i = NS_NewAtom("img");
nsIEditProperty::span = NS_NewAtom("span");
nsIEditProperty::small =NS_NewAtom("small");
nsIEditProperty::strike=NS_NewAtom("strike");
nsIEditProperty::sub = NS_NewAtom("sub");
nsIEditProperty::sup = NS_NewAtom("sup");
nsIEditProperty::tt = NS_NewAtom("tt");
nsIEditProperty::u = NS_NewAtom("u");
// tags
// inline tags
nsIEditProperty::b = NS_NewAtom("b");
nsIEditProperty::big = NS_NewAtom("big");
nsIEditProperty::i = NS_NewAtom("i");
nsIEditProperty::small = NS_NewAtom("small");
nsIEditProperty::strike = NS_NewAtom("strike");
nsIEditProperty::sub = NS_NewAtom("sub");
nsIEditProperty::sup = NS_NewAtom("sup");
nsIEditProperty::tt = NS_NewAtom("tt");
nsIEditProperty::u = NS_NewAtom("u");
nsIEditProperty::em = NS_NewAtom("em");
nsIEditProperty::strong = NS_NewAtom("strong");
nsIEditProperty::dfn = NS_NewAtom("dfn");
nsIEditProperty::code = NS_NewAtom("code");
nsIEditProperty::samp = NS_NewAtom("samp");
nsIEditProperty::kbd = NS_NewAtom("kbd");
nsIEditProperty::var = NS_NewAtom("var");
nsIEditProperty::cite = NS_NewAtom("cite");
nsIEditProperty::abbr = NS_NewAtom("abbr");
nsIEditProperty::acronym = NS_NewAtom("acronym");
nsIEditProperty::font = NS_NewAtom("font");
nsIEditProperty::a = NS_NewAtom("a");
nsIEditProperty::img = NS_NewAtom("img");
nsIEditProperty::object = NS_NewAtom("object");
nsIEditProperty::br = NS_NewAtom("br");
nsIEditProperty::script = NS_NewAtom("script");
nsIEditProperty::map = NS_NewAtom("map");
nsIEditProperty::q = NS_NewAtom("q");
nsIEditProperty::span = NS_NewAtom("span");
nsIEditProperty::bdo = NS_NewAtom("bdo");
nsIEditProperty::input = NS_NewAtom("input");
nsIEditProperty::select = NS_NewAtom("select");
nsIEditProperty::textarea = NS_NewAtom("textarea");
nsIEditProperty::label = NS_NewAtom("label");
nsIEditProperty::button = NS_NewAtom("button");
// block tags
nsIEditProperty::p = NS_NewAtom("p");
nsIEditProperty::div = NS_NewAtom("div");
nsIEditProperty::blockquote = NS_NewAtom("blockquote");
nsIEditProperty::br = NS_NewAtom("br");
nsIEditProperty::h1 = NS_NewAtom("h1");
nsIEditProperty::h2 = NS_NewAtom("h2");
nsIEditProperty::h1 = NS_NewAtom("h1");
nsIEditProperty::h2 = NS_NewAtom("h2");
nsIEditProperty::h3 = NS_NewAtom("h3");
nsIEditProperty::h4 = NS_NewAtom("h4");
nsIEditProperty::h5 = NS_NewAtom("h5");
nsIEditProperty::h6 = NS_NewAtom("h6");
nsIEditProperty::ul = NS_NewAtom("ul");
nsIEditProperty::ol = NS_NewAtom("ol");
nsIEditProperty::dl = NS_NewAtom("dl");
nsIEditProperty::pre = NS_NewAtom("pre");
nsIEditProperty::noscript = NS_NewAtom("noscript");
nsIEditProperty::form = NS_NewAtom("form");
nsIEditProperty::hr = NS_NewAtom("hr");
nsIEditProperty::table = NS_NewAtom("table");
nsIEditProperty::fieldset = NS_NewAtom("fieldset");
nsIEditProperty::address = NS_NewAtom("address");
// Unclear from
// DTD, block?
nsIEditProperty::body = NS_NewAtom("body");
nsIEditProperty::tr = NS_NewAtom("tr");
nsIEditProperty::td = NS_NewAtom("td");
nsIEditProperty::th = NS_NewAtom("th");
nsIEditProperty::caption = NS_NewAtom("caption");
nsIEditProperty::col = NS_NewAtom("col");
nsIEditProperty::colgroup = NS_NewAtom("colgroup");
nsIEditProperty::thead = NS_NewAtom("thead");
nsIEditProperty::tfoot = NS_NewAtom("tfoot");
nsIEditProperty::li = NS_NewAtom("li");
nsIEditProperty::dt = NS_NewAtom("dt");
nsIEditProperty::dd = NS_NewAtom("dd");
nsIEditProperty::legend = NS_NewAtom("legend");
// inline
// properties
nsIEditProperty::color= NS_NewAtom("color");
nsIEditProperty::face = NS_NewAtom("face");
nsIEditProperty::size = NS_NewAtom("size");
nsIEditProperty::color = NS_NewAtom("color");
nsIEditProperty::face = NS_NewAtom("face");
nsIEditProperty::size = NS_NewAtom("size");
// special
nsIEditProperty::allProperties = new nsString("moz_allproperties");
}
nsEditProperty::~nsEditProperty()
{
// tags
NS_IF_RELEASE(nsIEditProperty::a);
NS_IF_RELEASE(nsIEditProperty::b);
NS_IF_RELEASE(nsIEditProperty::big);
NS_IF_RELEASE(nsIEditProperty::font);
NS_IF_RELEASE(nsIEditProperty::i);
NS_IF_RELEASE(nsIEditProperty::img);
NS_IF_RELEASE(nsIEditProperty::span);
NS_IF_RELEASE(nsIEditProperty::small);
NS_IF_RELEASE(nsIEditProperty::strike);
NS_IF_RELEASE(nsIEditProperty::sub);
NS_IF_RELEASE(nsIEditProperty::sup);
NS_IF_RELEASE(nsIEditProperty::tt);
NS_IF_RELEASE(nsIEditProperty::u);
// tags
NS_IF_RELEASE(nsIEditProperty::blockquote);
NS_IF_RELEASE(nsIEditProperty::br);
NS_IF_RELEASE(nsIEditProperty::h1);
NS_IF_RELEASE(nsIEditProperty::h2);
// properties
NS_IF_RELEASE(nsIEditProperty::color);
NS_IF_RELEASE(nsIEditProperty::face);
NS_IF_RELEASE(nsIEditProperty::size);
NS_IF_RELEASE(nsIEditProperty::b);
NS_IF_RELEASE(nsIEditProperty::big);
NS_IF_RELEASE(nsIEditProperty::i);
NS_IF_RELEASE(nsIEditProperty::small);
NS_IF_RELEASE(nsIEditProperty::strike);
NS_IF_RELEASE(nsIEditProperty::sub);
NS_IF_RELEASE(nsIEditProperty::sup);
NS_IF_RELEASE(nsIEditProperty::tt);
NS_IF_RELEASE(nsIEditProperty::u);
NS_IF_RELEASE(nsIEditProperty::em);
NS_IF_RELEASE(nsIEditProperty::strong);
NS_IF_RELEASE(nsIEditProperty::dfn);
NS_IF_RELEASE(nsIEditProperty::code);
NS_IF_RELEASE(nsIEditProperty::samp);
NS_IF_RELEASE(nsIEditProperty::kbd);
NS_IF_RELEASE(nsIEditProperty::var);
NS_IF_RELEASE(nsIEditProperty::cite);
NS_IF_RELEASE(nsIEditProperty::abbr);
NS_IF_RELEASE(nsIEditProperty::acronym);
NS_IF_RELEASE(nsIEditProperty::font);
NS_IF_RELEASE(nsIEditProperty::a);
NS_IF_RELEASE(nsIEditProperty::img);
NS_IF_RELEASE(nsIEditProperty::object);
NS_IF_RELEASE(nsIEditProperty::br);
NS_IF_RELEASE(nsIEditProperty::script);
NS_IF_RELEASE(nsIEditProperty::map);
NS_IF_RELEASE(nsIEditProperty::q);
NS_IF_RELEASE(nsIEditProperty::span);
NS_IF_RELEASE(nsIEditProperty::bdo);
NS_IF_RELEASE(nsIEditProperty::input);
NS_IF_RELEASE(nsIEditProperty::select);
NS_IF_RELEASE(nsIEditProperty::textarea);
NS_IF_RELEASE(nsIEditProperty::label);
NS_IF_RELEASE(nsIEditProperty::button);
NS_IF_RELEASE(nsIEditProperty::p);
NS_IF_RELEASE(nsIEditProperty::div);
NS_IF_RELEASE(nsIEditProperty::blockquote);
NS_IF_RELEASE(nsIEditProperty::h1);
NS_IF_RELEASE(nsIEditProperty::h2);
NS_IF_RELEASE(nsIEditProperty::h3);
NS_IF_RELEASE(nsIEditProperty::h4);
NS_IF_RELEASE(nsIEditProperty::h5);
NS_IF_RELEASE(nsIEditProperty::h6);
NS_IF_RELEASE(nsIEditProperty::ul);
NS_IF_RELEASE(nsIEditProperty::ol);
NS_IF_RELEASE(nsIEditProperty::dl);
NS_IF_RELEASE(nsIEditProperty::pre);
NS_IF_RELEASE(nsIEditProperty::noscript);
NS_IF_RELEASE(nsIEditProperty::form);
NS_IF_RELEASE(nsIEditProperty::hr);
NS_IF_RELEASE(nsIEditProperty::table);
NS_IF_RELEASE(nsIEditProperty::fieldset);
NS_IF_RELEASE(nsIEditProperty::address);
NS_IF_RELEASE(nsIEditProperty::body);
NS_IF_RELEASE(nsIEditProperty::tr);
NS_IF_RELEASE(nsIEditProperty::td);
NS_IF_RELEASE(nsIEditProperty::th);
NS_IF_RELEASE(nsIEditProperty::caption);
NS_IF_RELEASE(nsIEditProperty::col);
NS_IF_RELEASE(nsIEditProperty::colgroup);
NS_IF_RELEASE(nsIEditProperty::thead);
NS_IF_RELEASE(nsIEditProperty::tfoot);
NS_IF_RELEASE(nsIEditProperty::li);
NS_IF_RELEASE(nsIEditProperty::dt);
NS_IF_RELEASE(nsIEditProperty::dd);
NS_IF_RELEASE(nsIEditProperty::legend);
NS_IF_RELEASE(nsIEditProperty::color);
NS_IF_RELEASE(nsIEditProperty::face);
NS_IF_RELEASE(nsIEditProperty::size);
// special
if (nsIEditProperty::allProperties) {
delete (nsIEditProperty::allProperties);

View File

@ -2521,7 +2521,69 @@ nsEditor::GetLengthOfDOMNode(nsIDOMNode *aNode, PRUint32 &aCount)
return result;
}
// content-based inline vs. block query
// The list of block nodes is shorter, so do the real work here...
nsresult
nsEditor::IsNodeBlock(nsIDOMNode *aNode, PRBool &aIsBlock)
{
// this is a content-based implementation
if (!aNode) { return NS_ERROR_NULL_POINTER; }
nsresult result = NS_ERROR_FAILURE;
aIsBlock = PR_FALSE;
nsCOMPtr<nsIDOMElement>element;
element = do_QueryInterface(aNode);
if (element)
{
nsAutoString tagName;
result = element->GetTagName(tagName);
if (NS_SUCCEEDED(result))
{
tagName.ToLowerCase();
nsIAtom *tagAtom = NS_NewAtom(tagName);
if (!tagAtom) { return NS_ERROR_NULL_POINTER; }
if (tagAtom==nsIEditProperty::p ||
tagAtom==nsIEditProperty::div ||
tagAtom==nsIEditProperty::blockquote ||
tagAtom==nsIEditProperty::h1 ||
tagAtom==nsIEditProperty::h2 ||
tagAtom==nsIEditProperty::h3 ||
tagAtom==nsIEditProperty::h4 ||
tagAtom==nsIEditProperty::h5 ||
tagAtom==nsIEditProperty::h6 ||
tagAtom==nsIEditProperty::ul ||
tagAtom==nsIEditProperty::ol ||
tagAtom==nsIEditProperty::dl ||
tagAtom==nsIEditProperty::pre ||
tagAtom==nsIEditProperty::noscript ||
tagAtom==nsIEditProperty::form ||
tagAtom==nsIEditProperty::hr ||
tagAtom==nsIEditProperty::table ||
tagAtom==nsIEditProperty::fieldset ||
tagAtom==nsIEditProperty::address ||
tagAtom==nsIEditProperty::body ||
tagAtom==nsIEditProperty::tr ||
tagAtom==nsIEditProperty::td ||
tagAtom==nsIEditProperty::th ||
tagAtom==nsIEditProperty::caption ||
tagAtom==nsIEditProperty::col ||
tagAtom==nsIEditProperty::colgroup ||
tagAtom==nsIEditProperty::thead ||
tagAtom==nsIEditProperty::tfoot ||
tagAtom==nsIEditProperty::li ||
tagAtom==nsIEditProperty::dt ||
tagAtom==nsIEditProperty::dd ||
tagAtom==nsIEditProperty::legend )
{
aIsBlock = PR_TRUE;
}
result = NS_OK;
}
}
return result;
}
// ...and simply assume non-block element is inline
nsresult
nsEditor::IsNodeInline(nsIDOMNode *aNode, PRBool &aIsInline)
{
@ -2530,36 +2592,10 @@ nsEditor::IsNodeInline(nsIDOMNode *aNode, PRBool &aIsInline)
nsresult result;
aIsInline = PR_FALSE;
nsCOMPtr<nsIDOMElement>element;
element = do_QueryInterface(aNode);
if (element)
{
nsAutoString tag;
result = element->GetTagName(tag);
if (NS_SUCCEEDED(result))
{
tag.ToLowerCase();
nsIAtom *tagAtom = NS_NewAtom(tag);
if (!tagAtom) { return NS_ERROR_NULL_POINTER; }
if (tagAtom==nsIEditProperty::a ||
tagAtom==nsIEditProperty::b ||
tagAtom==nsIEditProperty::big ||
tagAtom==nsIEditProperty::font ||
tagAtom==nsIEditProperty::i ||
tagAtom==nsIEditProperty::img ||
tagAtom==nsIEditProperty::span ||
tagAtom==nsIEditProperty::small ||
tagAtom==nsIEditProperty::strike ||
tagAtom==nsIEditProperty::sub ||
tagAtom==nsIEditProperty::sup ||
tagAtom==nsIEditProperty::tt ||
tagAtom==nsIEditProperty::u )
{
aIsInline = PR_TRUE;
}
}
}
return NS_OK;
PRBool IsBlock = PR_FALSE;
result = IsNodeBlock(aNode, IsBlock);
aIsInline = !IsBlock;
return result;
}
nsresult

View File

@ -391,6 +391,9 @@ public:
/** set aIsInline to PR_TRUE if aNode is inline as defined by HTML DTD */
static nsresult IsNodeInline(nsIDOMNode *aNode, PRBool &aIsInline);
/** set aIsBlock to PR_TRUE if aNode is inline as defined by HTML DTD */
static nsresult IsNodeBlock(nsIDOMNode *aNode, PRBool &aIsBlock);
/** returns the closest block parent of aNode, not including aNode itself.
* can return null, for example if aNode is in a document fragment.
* @param aNode The node whose parent we seek.

View File

@ -43,43 +43,77 @@ public:
/* we're still trying to decide how edit atoms will work. Until then, use these */
// XXX: fix ASAP!
// inline tags
static nsIAtom *a;
static nsIAtom *b;
static nsIAtom *big;
static nsIAtom *font;
static nsIAtom *i;
static nsIAtom *img;
static nsIAtom *span;
static nsIAtom *small;
static nsIAtom *strike;
static nsIAtom *sub;
static nsIAtom *sup;
static nsIAtom *tt;
static nsIAtom *u;
/* from HTML 3.2 spec
TT teletype or monospaced text
I italic text style
B bold text style
U underlined text style
STRIKE strike-through text style
BIG places text in a large font
SMALL places text in a small font
SUB places text in subscript style
SUP places text in superscript style
*/
// block tags
static nsIAtom *b;
static nsIAtom *big;
static nsIAtom *i;
static nsIAtom *small;
static nsIAtom *strike;
static nsIAtom *sub;
static nsIAtom *sup;
static nsIAtom *tt;
static nsIAtom *u;
static nsIAtom *em;
static nsIAtom *strong;
static nsIAtom *dfn;
static nsIAtom *code;
static nsIAtom *samp;
static nsIAtom *kbd;
static nsIAtom *var;
static nsIAtom *cite;
static nsIAtom *abbr;
static nsIAtom *acronym;
static nsIAtom *font;
static nsIAtom *a;
static nsIAtom *img;
static nsIAtom *object;
static nsIAtom *br;
static nsIAtom *script;
static nsIAtom *map;
static nsIAtom *q;
static nsIAtom *span;
static nsIAtom *bdo;
static nsIAtom *input;
static nsIAtom *select;
static nsIAtom *textarea;
static nsIAtom *label;
static nsIAtom *button;
// Block tags
static nsIAtom *p;
static nsIAtom *div;
static nsIAtom *blockquote;
static nsIAtom *br;
static nsIAtom *h1;
static nsIAtom *h2;
/** properties */
static nsIAtom *color;
static nsIAtom *face;
static nsIAtom *size;
static nsIAtom *h1;
static nsIAtom *h2;
static nsIAtom *h3;
static nsIAtom *h4;
static nsIAtom *h5;
static nsIAtom *h6;
static nsIAtom *ul;
static nsIAtom *ol;
static nsIAtom *dl;
static nsIAtom *pre;
static nsIAtom *noscript;
static nsIAtom *form;
static nsIAtom *hr;
static nsIAtom *table;
static nsIAtom *fieldset;
static nsIAtom *address;
// Assumed to be block:
static nsIAtom *body;
static nsIAtom *tr;
static nsIAtom *td;
static nsIAtom *th;
static nsIAtom *caption;
static nsIAtom *col;
static nsIAtom *colgroup;
static nsIAtom *thead;
static nsIAtom *tfoot;
static nsIAtom *li;
static nsIAtom *dt;
static nsIAtom *dd;
static nsIAtom *legend;
static nsIAtom *color;
static nsIAtom *face;
static nsIAtom *size;
/** special strings */
static nsString *allProperties; // this magic string represents the union of all inline style tags

View File

@ -2521,7 +2521,69 @@ nsEditor::GetLengthOfDOMNode(nsIDOMNode *aNode, PRUint32 &aCount)
return result;
}
// content-based inline vs. block query
// The list of block nodes is shorter, so do the real work here...
nsresult
nsEditor::IsNodeBlock(nsIDOMNode *aNode, PRBool &aIsBlock)
{
// this is a content-based implementation
if (!aNode) { return NS_ERROR_NULL_POINTER; }
nsresult result = NS_ERROR_FAILURE;
aIsBlock = PR_FALSE;
nsCOMPtr<nsIDOMElement>element;
element = do_QueryInterface(aNode);
if (element)
{
nsAutoString tagName;
result = element->GetTagName(tagName);
if (NS_SUCCEEDED(result))
{
tagName.ToLowerCase();
nsIAtom *tagAtom = NS_NewAtom(tagName);
if (!tagAtom) { return NS_ERROR_NULL_POINTER; }
if (tagAtom==nsIEditProperty::p ||
tagAtom==nsIEditProperty::div ||
tagAtom==nsIEditProperty::blockquote ||
tagAtom==nsIEditProperty::h1 ||
tagAtom==nsIEditProperty::h2 ||
tagAtom==nsIEditProperty::h3 ||
tagAtom==nsIEditProperty::h4 ||
tagAtom==nsIEditProperty::h5 ||
tagAtom==nsIEditProperty::h6 ||
tagAtom==nsIEditProperty::ul ||
tagAtom==nsIEditProperty::ol ||
tagAtom==nsIEditProperty::dl ||
tagAtom==nsIEditProperty::pre ||
tagAtom==nsIEditProperty::noscript ||
tagAtom==nsIEditProperty::form ||
tagAtom==nsIEditProperty::hr ||
tagAtom==nsIEditProperty::table ||
tagAtom==nsIEditProperty::fieldset ||
tagAtom==nsIEditProperty::address ||
tagAtom==nsIEditProperty::body ||
tagAtom==nsIEditProperty::tr ||
tagAtom==nsIEditProperty::td ||
tagAtom==nsIEditProperty::th ||
tagAtom==nsIEditProperty::caption ||
tagAtom==nsIEditProperty::col ||
tagAtom==nsIEditProperty::colgroup ||
tagAtom==nsIEditProperty::thead ||
tagAtom==nsIEditProperty::tfoot ||
tagAtom==nsIEditProperty::li ||
tagAtom==nsIEditProperty::dt ||
tagAtom==nsIEditProperty::dd ||
tagAtom==nsIEditProperty::legend )
{
aIsBlock = PR_TRUE;
}
result = NS_OK;
}
}
return result;
}
// ...and simply assume non-block element is inline
nsresult
nsEditor::IsNodeInline(nsIDOMNode *aNode, PRBool &aIsInline)
{
@ -2530,36 +2592,10 @@ nsEditor::IsNodeInline(nsIDOMNode *aNode, PRBool &aIsInline)
nsresult result;
aIsInline = PR_FALSE;
nsCOMPtr<nsIDOMElement>element;
element = do_QueryInterface(aNode);
if (element)
{
nsAutoString tag;
result = element->GetTagName(tag);
if (NS_SUCCEEDED(result))
{
tag.ToLowerCase();
nsIAtom *tagAtom = NS_NewAtom(tag);
if (!tagAtom) { return NS_ERROR_NULL_POINTER; }
if (tagAtom==nsIEditProperty::a ||
tagAtom==nsIEditProperty::b ||
tagAtom==nsIEditProperty::big ||
tagAtom==nsIEditProperty::font ||
tagAtom==nsIEditProperty::i ||
tagAtom==nsIEditProperty::img ||
tagAtom==nsIEditProperty::span ||
tagAtom==nsIEditProperty::small ||
tagAtom==nsIEditProperty::strike ||
tagAtom==nsIEditProperty::sub ||
tagAtom==nsIEditProperty::sup ||
tagAtom==nsIEditProperty::tt ||
tagAtom==nsIEditProperty::u )
{
aIsInline = PR_TRUE;
}
}
}
return NS_OK;
PRBool IsBlock = PR_FALSE;
result = IsNodeBlock(aNode, IsBlock);
aIsInline = !IsBlock;
return result;
}
nsresult

View File

@ -391,6 +391,9 @@ public:
/** set aIsInline to PR_TRUE if aNode is inline as defined by HTML DTD */
static nsresult IsNodeInline(nsIDOMNode *aNode, PRBool &aIsInline);
/** set aIsBlock to PR_TRUE if aNode is inline as defined by HTML DTD */
static nsresult IsNodeBlock(nsIDOMNode *aNode, PRBool &aIsBlock);
/** returns the closest block parent of aNode, not including aNode itself.
* can return null, for example if aNode is in a document fragment.
* @param aNode The node whose parent we seek.

View File

@ -43,43 +43,77 @@ public:
/* we're still trying to decide how edit atoms will work. Until then, use these */
// XXX: fix ASAP!
// inline tags
static nsIAtom *a;
static nsIAtom *b;
static nsIAtom *big;
static nsIAtom *font;
static nsIAtom *i;
static nsIAtom *img;
static nsIAtom *span;
static nsIAtom *small;
static nsIAtom *strike;
static nsIAtom *sub;
static nsIAtom *sup;
static nsIAtom *tt;
static nsIAtom *u;
/* from HTML 3.2 spec
TT teletype or monospaced text
I italic text style
B bold text style
U underlined text style
STRIKE strike-through text style
BIG places text in a large font
SMALL places text in a small font
SUB places text in subscript style
SUP places text in superscript style
*/
// block tags
static nsIAtom *b;
static nsIAtom *big;
static nsIAtom *i;
static nsIAtom *small;
static nsIAtom *strike;
static nsIAtom *sub;
static nsIAtom *sup;
static nsIAtom *tt;
static nsIAtom *u;
static nsIAtom *em;
static nsIAtom *strong;
static nsIAtom *dfn;
static nsIAtom *code;
static nsIAtom *samp;
static nsIAtom *kbd;
static nsIAtom *var;
static nsIAtom *cite;
static nsIAtom *abbr;
static nsIAtom *acronym;
static nsIAtom *font;
static nsIAtom *a;
static nsIAtom *img;
static nsIAtom *object;
static nsIAtom *br;
static nsIAtom *script;
static nsIAtom *map;
static nsIAtom *q;
static nsIAtom *span;
static nsIAtom *bdo;
static nsIAtom *input;
static nsIAtom *select;
static nsIAtom *textarea;
static nsIAtom *label;
static nsIAtom *button;
// Block tags
static nsIAtom *p;
static nsIAtom *div;
static nsIAtom *blockquote;
static nsIAtom *br;
static nsIAtom *h1;
static nsIAtom *h2;
/** properties */
static nsIAtom *color;
static nsIAtom *face;
static nsIAtom *size;
static nsIAtom *h1;
static nsIAtom *h2;
static nsIAtom *h3;
static nsIAtom *h4;
static nsIAtom *h5;
static nsIAtom *h6;
static nsIAtom *ul;
static nsIAtom *ol;
static nsIAtom *dl;
static nsIAtom *pre;
static nsIAtom *noscript;
static nsIAtom *form;
static nsIAtom *hr;
static nsIAtom *table;
static nsIAtom *fieldset;
static nsIAtom *address;
// Assumed to be block:
static nsIAtom *body;
static nsIAtom *tr;
static nsIAtom *td;
static nsIAtom *th;
static nsIAtom *caption;
static nsIAtom *col;
static nsIAtom *colgroup;
static nsIAtom *thead;
static nsIAtom *tfoot;
static nsIAtom *li;
static nsIAtom *dt;
static nsIAtom *dd;
static nsIAtom *legend;
static nsIAtom *color;
static nsIAtom *face;
static nsIAtom *size;
/** special strings */
static nsString *allProperties; // this magic string represents the union of all inline style tags

View File

@ -29,86 +29,256 @@ NS_IMPL_RELEASE(nsEditProperty)
// XXX: remove when html atoms are exported from layout
// inline tags
nsIAtom * nsIEditProperty::a;
nsIAtom * nsIEditProperty::b;
nsIAtom * nsIEditProperty::big;
nsIAtom * nsIEditProperty::font;
nsIAtom * nsIEditProperty::i;
nsIAtom * nsIEditProperty::img;
nsIAtom * nsIEditProperty::span;
nsIAtom * nsIEditProperty::small;
nsIAtom * nsIEditProperty::strike;
nsIAtom * nsIEditProperty::sub;
nsIAtom * nsIEditProperty::sup;
nsIAtom * nsIEditProperty::tt;
nsIAtom * nsIEditProperty::u;
// block tags
nsIAtom * nsIEditProperty::blockquote;
nsIAtom * nsIEditProperty::br;
nsIAtom * nsIEditProperty::h1;
nsIAtom * nsIEditProperty::h2;
// properties
nsIAtom * nsIEditProperty::color;
nsIAtom * nsIEditProperty::face;
nsIAtom * nsIEditProperty::size;
nsIAtom * nsIEditProperty::b;
nsIAtom * nsIEditProperty::big;
nsIAtom * nsIEditProperty::i;
nsIAtom * nsIEditProperty::small;
nsIAtom * nsIEditProperty::strike;
nsIAtom * nsIEditProperty::sub;
nsIAtom * nsIEditProperty::sup;
nsIAtom * nsIEditProperty::tt;
nsIAtom * nsIEditProperty::u;
nsIAtom * nsIEditProperty::em;
nsIAtom * nsIEditProperty::strong;
nsIAtom * nsIEditProperty::dfn;
nsIAtom * nsIEditProperty::code;
nsIAtom * nsIEditProperty::samp;
nsIAtom * nsIEditProperty::kbd;
nsIAtom * nsIEditProperty::var;
nsIAtom * nsIEditProperty::cite;
nsIAtom * nsIEditProperty::abbr;
nsIAtom * nsIEditProperty::acronym;
nsIAtom * nsIEditProperty::font;
nsIAtom * nsIEditProperty::a;
nsIAtom * nsIEditProperty::img;
nsIAtom * nsIEditProperty::object;
nsIAtom * nsIEditProperty::br;
nsIAtom * nsIEditProperty::script;
nsIAtom * nsIEditProperty::map;
nsIAtom * nsIEditProperty::q;
nsIAtom * nsIEditProperty::span;
nsIAtom * nsIEditProperty::bdo;
nsIAtom * nsIEditProperty::input;
nsIAtom * nsIEditProperty::select;
nsIAtom * nsIEditProperty::textarea;
nsIAtom * nsIEditProperty::label;
nsIAtom * nsIEditProperty::button;
nsIAtom * nsIEditProperty::p;
nsIAtom * nsIEditProperty::div;
nsIAtom * nsIEditProperty::blockquote;
nsIAtom * nsIEditProperty::h1;
nsIAtom * nsIEditProperty::h2;
nsIAtom * nsIEditProperty::h3;
nsIAtom * nsIEditProperty::h4;
nsIAtom * nsIEditProperty::h5;
nsIAtom * nsIEditProperty::h6;
nsIAtom * nsIEditProperty::ul;
nsIAtom * nsIEditProperty::ol;
nsIAtom * nsIEditProperty::dl;
nsIAtom * nsIEditProperty::pre;
nsIAtom * nsIEditProperty::noscript;
nsIAtom * nsIEditProperty::form;
nsIAtom * nsIEditProperty::hr;
nsIAtom * nsIEditProperty::table;
nsIAtom * nsIEditProperty::fieldset;
nsIAtom * nsIEditProperty::address;
nsIAtom * nsIEditProperty::body;
nsIAtom * nsIEditProperty::tr;
nsIAtom * nsIEditProperty::td;
nsIAtom * nsIEditProperty::th;
nsIAtom * nsIEditProperty::caption;
nsIAtom * nsIEditProperty::col;
nsIAtom * nsIEditProperty::colgroup;
nsIAtom * nsIEditProperty::thead;
nsIAtom * nsIEditProperty::tfoot;
nsIAtom * nsIEditProperty::li;
nsIAtom * nsIEditProperty::dt;
nsIAtom * nsIEditProperty::dd;
nsIAtom * nsIEditProperty::legend;
nsIAtom * nsIEditProperty::color;
nsIAtom * nsIEditProperty::face;
nsIAtom * nsIEditProperty::size;
// special
nsString * nsIEditProperty::allProperties;
/* From the HTML 4.0 DTD,
INLINE:
<!-- %inline; covers inline or "text-level" elements -->
<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">
<!ENTITY % fontstyle "TT | I | B | BIG | SMALL">
<!ENTITY % phrase "EM | STRONG | DFN | CODE |
SAMP | KBD | VAR | CITE | ABBR | ACRONYM" >
<!ENTITY % special
"A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO">
<!ENTITY % formctrl "INPUT | SELECT | TEXTAREA | LABEL | BUTTON">
BLOCK:
<!ENTITY % block
"P | %heading (h1-h6); | %list (UL | OL); | %preformatted (PRE); | DL | DIV | NOSCRIPT |
BLOCKQUOTE | FORM | HR | TABLE | FIELDSET | ADDRESS">
But what about BODY, TR, TD, TH, CAPTION, COL, COLGROUP, THEAD, TFOOT, LI, DT, DD, LEGEND, etc.?
*/
nsEditProperty::nsEditProperty()
{
NS_INIT_REFCNT();
// tags
nsIEditProperty::a = NS_NewAtom("a");
nsIEditProperty::b = NS_NewAtom("b");
nsIEditProperty::big = NS_NewAtom("big");
nsIEditProperty::font = NS_NewAtom("font");
nsIEditProperty::i = NS_NewAtom("i");
nsIEditProperty::i = NS_NewAtom("img");
nsIEditProperty::span = NS_NewAtom("span");
nsIEditProperty::small =NS_NewAtom("small");
nsIEditProperty::strike=NS_NewAtom("strike");
nsIEditProperty::sub = NS_NewAtom("sub");
nsIEditProperty::sup = NS_NewAtom("sup");
nsIEditProperty::tt = NS_NewAtom("tt");
nsIEditProperty::u = NS_NewAtom("u");
// tags
// inline tags
nsIEditProperty::b = NS_NewAtom("b");
nsIEditProperty::big = NS_NewAtom("big");
nsIEditProperty::i = NS_NewAtom("i");
nsIEditProperty::small = NS_NewAtom("small");
nsIEditProperty::strike = NS_NewAtom("strike");
nsIEditProperty::sub = NS_NewAtom("sub");
nsIEditProperty::sup = NS_NewAtom("sup");
nsIEditProperty::tt = NS_NewAtom("tt");
nsIEditProperty::u = NS_NewAtom("u");
nsIEditProperty::em = NS_NewAtom("em");
nsIEditProperty::strong = NS_NewAtom("strong");
nsIEditProperty::dfn = NS_NewAtom("dfn");
nsIEditProperty::code = NS_NewAtom("code");
nsIEditProperty::samp = NS_NewAtom("samp");
nsIEditProperty::kbd = NS_NewAtom("kbd");
nsIEditProperty::var = NS_NewAtom("var");
nsIEditProperty::cite = NS_NewAtom("cite");
nsIEditProperty::abbr = NS_NewAtom("abbr");
nsIEditProperty::acronym = NS_NewAtom("acronym");
nsIEditProperty::font = NS_NewAtom("font");
nsIEditProperty::a = NS_NewAtom("a");
nsIEditProperty::img = NS_NewAtom("img");
nsIEditProperty::object = NS_NewAtom("object");
nsIEditProperty::br = NS_NewAtom("br");
nsIEditProperty::script = NS_NewAtom("script");
nsIEditProperty::map = NS_NewAtom("map");
nsIEditProperty::q = NS_NewAtom("q");
nsIEditProperty::span = NS_NewAtom("span");
nsIEditProperty::bdo = NS_NewAtom("bdo");
nsIEditProperty::input = NS_NewAtom("input");
nsIEditProperty::select = NS_NewAtom("select");
nsIEditProperty::textarea = NS_NewAtom("textarea");
nsIEditProperty::label = NS_NewAtom("label");
nsIEditProperty::button = NS_NewAtom("button");
// block tags
nsIEditProperty::p = NS_NewAtom("p");
nsIEditProperty::div = NS_NewAtom("div");
nsIEditProperty::blockquote = NS_NewAtom("blockquote");
nsIEditProperty::br = NS_NewAtom("br");
nsIEditProperty::h1 = NS_NewAtom("h1");
nsIEditProperty::h2 = NS_NewAtom("h2");
nsIEditProperty::h1 = NS_NewAtom("h1");
nsIEditProperty::h2 = NS_NewAtom("h2");
nsIEditProperty::h3 = NS_NewAtom("h3");
nsIEditProperty::h4 = NS_NewAtom("h4");
nsIEditProperty::h5 = NS_NewAtom("h5");
nsIEditProperty::h6 = NS_NewAtom("h6");
nsIEditProperty::ul = NS_NewAtom("ul");
nsIEditProperty::ol = NS_NewAtom("ol");
nsIEditProperty::dl = NS_NewAtom("dl");
nsIEditProperty::pre = NS_NewAtom("pre");
nsIEditProperty::noscript = NS_NewAtom("noscript");
nsIEditProperty::form = NS_NewAtom("form");
nsIEditProperty::hr = NS_NewAtom("hr");
nsIEditProperty::table = NS_NewAtom("table");
nsIEditProperty::fieldset = NS_NewAtom("fieldset");
nsIEditProperty::address = NS_NewAtom("address");
// Unclear from
// DTD, block?
nsIEditProperty::body = NS_NewAtom("body");
nsIEditProperty::tr = NS_NewAtom("tr");
nsIEditProperty::td = NS_NewAtom("td");
nsIEditProperty::th = NS_NewAtom("th");
nsIEditProperty::caption = NS_NewAtom("caption");
nsIEditProperty::col = NS_NewAtom("col");
nsIEditProperty::colgroup = NS_NewAtom("colgroup");
nsIEditProperty::thead = NS_NewAtom("thead");
nsIEditProperty::tfoot = NS_NewAtom("tfoot");
nsIEditProperty::li = NS_NewAtom("li");
nsIEditProperty::dt = NS_NewAtom("dt");
nsIEditProperty::dd = NS_NewAtom("dd");
nsIEditProperty::legend = NS_NewAtom("legend");
// inline
// properties
nsIEditProperty::color= NS_NewAtom("color");
nsIEditProperty::face = NS_NewAtom("face");
nsIEditProperty::size = NS_NewAtom("size");
nsIEditProperty::color = NS_NewAtom("color");
nsIEditProperty::face = NS_NewAtom("face");
nsIEditProperty::size = NS_NewAtom("size");
// special
nsIEditProperty::allProperties = new nsString("moz_allproperties");
}
nsEditProperty::~nsEditProperty()
{
// tags
NS_IF_RELEASE(nsIEditProperty::a);
NS_IF_RELEASE(nsIEditProperty::b);
NS_IF_RELEASE(nsIEditProperty::big);
NS_IF_RELEASE(nsIEditProperty::font);
NS_IF_RELEASE(nsIEditProperty::i);
NS_IF_RELEASE(nsIEditProperty::img);
NS_IF_RELEASE(nsIEditProperty::span);
NS_IF_RELEASE(nsIEditProperty::small);
NS_IF_RELEASE(nsIEditProperty::strike);
NS_IF_RELEASE(nsIEditProperty::sub);
NS_IF_RELEASE(nsIEditProperty::sup);
NS_IF_RELEASE(nsIEditProperty::tt);
NS_IF_RELEASE(nsIEditProperty::u);
// tags
NS_IF_RELEASE(nsIEditProperty::blockquote);
NS_IF_RELEASE(nsIEditProperty::br);
NS_IF_RELEASE(nsIEditProperty::h1);
NS_IF_RELEASE(nsIEditProperty::h2);
// properties
NS_IF_RELEASE(nsIEditProperty::color);
NS_IF_RELEASE(nsIEditProperty::face);
NS_IF_RELEASE(nsIEditProperty::size);
NS_IF_RELEASE(nsIEditProperty::b);
NS_IF_RELEASE(nsIEditProperty::big);
NS_IF_RELEASE(nsIEditProperty::i);
NS_IF_RELEASE(nsIEditProperty::small);
NS_IF_RELEASE(nsIEditProperty::strike);
NS_IF_RELEASE(nsIEditProperty::sub);
NS_IF_RELEASE(nsIEditProperty::sup);
NS_IF_RELEASE(nsIEditProperty::tt);
NS_IF_RELEASE(nsIEditProperty::u);
NS_IF_RELEASE(nsIEditProperty::em);
NS_IF_RELEASE(nsIEditProperty::strong);
NS_IF_RELEASE(nsIEditProperty::dfn);
NS_IF_RELEASE(nsIEditProperty::code);
NS_IF_RELEASE(nsIEditProperty::samp);
NS_IF_RELEASE(nsIEditProperty::kbd);
NS_IF_RELEASE(nsIEditProperty::var);
NS_IF_RELEASE(nsIEditProperty::cite);
NS_IF_RELEASE(nsIEditProperty::abbr);
NS_IF_RELEASE(nsIEditProperty::acronym);
NS_IF_RELEASE(nsIEditProperty::font);
NS_IF_RELEASE(nsIEditProperty::a);
NS_IF_RELEASE(nsIEditProperty::img);
NS_IF_RELEASE(nsIEditProperty::object);
NS_IF_RELEASE(nsIEditProperty::br);
NS_IF_RELEASE(nsIEditProperty::script);
NS_IF_RELEASE(nsIEditProperty::map);
NS_IF_RELEASE(nsIEditProperty::q);
NS_IF_RELEASE(nsIEditProperty::span);
NS_IF_RELEASE(nsIEditProperty::bdo);
NS_IF_RELEASE(nsIEditProperty::input);
NS_IF_RELEASE(nsIEditProperty::select);
NS_IF_RELEASE(nsIEditProperty::textarea);
NS_IF_RELEASE(nsIEditProperty::label);
NS_IF_RELEASE(nsIEditProperty::button);
NS_IF_RELEASE(nsIEditProperty::p);
NS_IF_RELEASE(nsIEditProperty::div);
NS_IF_RELEASE(nsIEditProperty::blockquote);
NS_IF_RELEASE(nsIEditProperty::h1);
NS_IF_RELEASE(nsIEditProperty::h2);
NS_IF_RELEASE(nsIEditProperty::h3);
NS_IF_RELEASE(nsIEditProperty::h4);
NS_IF_RELEASE(nsIEditProperty::h5);
NS_IF_RELEASE(nsIEditProperty::h6);
NS_IF_RELEASE(nsIEditProperty::ul);
NS_IF_RELEASE(nsIEditProperty::ol);
NS_IF_RELEASE(nsIEditProperty::dl);
NS_IF_RELEASE(nsIEditProperty::pre);
NS_IF_RELEASE(nsIEditProperty::noscript);
NS_IF_RELEASE(nsIEditProperty::form);
NS_IF_RELEASE(nsIEditProperty::hr);
NS_IF_RELEASE(nsIEditProperty::table);
NS_IF_RELEASE(nsIEditProperty::fieldset);
NS_IF_RELEASE(nsIEditProperty::address);
NS_IF_RELEASE(nsIEditProperty::body);
NS_IF_RELEASE(nsIEditProperty::tr);
NS_IF_RELEASE(nsIEditProperty::td);
NS_IF_RELEASE(nsIEditProperty::th);
NS_IF_RELEASE(nsIEditProperty::caption);
NS_IF_RELEASE(nsIEditProperty::col);
NS_IF_RELEASE(nsIEditProperty::colgroup);
NS_IF_RELEASE(nsIEditProperty::thead);
NS_IF_RELEASE(nsIEditProperty::tfoot);
NS_IF_RELEASE(nsIEditProperty::li);
NS_IF_RELEASE(nsIEditProperty::dt);
NS_IF_RELEASE(nsIEditProperty::dd);
NS_IF_RELEASE(nsIEditProperty::legend);
NS_IF_RELEASE(nsIEditProperty::color);
NS_IF_RELEASE(nsIEditProperty::face);
NS_IF_RELEASE(nsIEditProperty::size);
// special
if (nsIEditProperty::allProperties) {
delete (nsIEditProperty::allProperties);