Here is a corrected and (IMHO) polished version of SetAttr.
It solves the nesting bug.
It uses StartTag/EndTag.
It also adds support for strikeout.
By the way, was there a special reason for changing <em> to <i> and <strong> to <b>?
- Josef
Code: Select all
PROCEDURE SetAttr (e: Exporter; newAttr: TextModels.Attributes);
(* nesting: <p> <span> <b> <i> text </i> </b> </span> </p> *)
CONST bold = (Fonts.normal + Fonts.bold) DIV 2;
VAR s, tmp: ARRAY 256 OF CHAR;
BEGIN
ASSERT(e # NIL, 100);
IF e.inPara & (e.attr # newAttr) & ((e.attr = NIL) OR (newAttr = NIL) OR ~e.attr.Equals(newAttr)) THEN
IF e.attr # NIL THEN (* close all special attributes *)
IF Fonts.italic IN e.attr.font.style THEN e.wr.EndTag(*i*) END;
IF e.attr.font.weight >= bold THEN e.wr.EndTag(*b*) END;
END;
IF (newAttr = NIL) OR (e.attr = NIL)
OR (e.attr.font.typeface # newAttr.font.typeface)
OR (e.attr.font.size # newAttr.font.size)
OR (e.attr.color # newAttr.color)
OR (Fonts.underline IN newAttr.font.style / e.attr.font.style)
OR (Fonts.strikeout IN newAttr.font.style / e.attr.font.style) THEN (* close span *)
IF e.inSpan THEN e.wr.EndTag(*span*); e.inSpan := FALSE END
END;
IF (newAttr # NIL) & (~e.inSpan) THEN (* open span *)
s := "";
IF (newAttr.font.typeface # defaultTypeface) & (newAttr.font.typeface # Fonts.default) THEN
s := "font-family: " + newAttr.font.typeface$ + ";"
END;
IF newAttr.color # Ports.defaultColor THEN
IF s[0] # 0X THEN s := s + " " END;
ColorToString(newAttr.color, tmp);
s := s + "color: " + tmp + ";"
END;
IF newAttr.font.size # defaultSize THEN
IF s[0] # 0X THEN s := s + " " END;
Strings.IntToString(newAttr.font.size DIV Fonts.point, tmp);
s := s + "font-size: " + tmp + "pt;"
END;
IF Fonts.underline IN newAttr.font.style THEN
IF s[0] # 0X THEN s := s + " " END;
IF Fonts.strikeout IN newAttr.font.style THEN s := s + "text-decoration: underline line-through;"
ELSE s := s + "text-decoration: underline"
END
ELSIF Fonts.strikeout IN newAttr.font.style THEN
IF s[0] # 0X THEN s := s + " " END;
s := s + "text-decoration: line-through;"
END;
IF s[0] # 0X THEN
e.wr.StartTag("span", XhtmlWriters.preserve); e.wr.Attr("style", s);
e.inSpan := TRUE
END
END;
IF newAttr # NIL THEN (* open all special attributes *)
IF newAttr.font.weight >= bold THEN e.wr.StartTag("b", XhtmlWriters.preserve) END;
IF Fonts.italic IN newAttr.font.style THEN e.wr.StartTag("i", XhtmlWriters.preserve) END
END;
e.attr := newAttr
END
END SetAttr;
StdCoder.Decode ..,, ..fq....3Qw7uP5PRPPNR9Rbf9b8R79FTvMf1GomCrlAy2xhX,Cb2x
hXhC6FU1xhiZiVBhihgmRiioedhgrZcZRiXFfaqmSrtuGfa4700zdGrr8rmCLLCJuyKtYcZRiX
7.2.s,6AP.0k,5TWyql.bnayKmKKqGomC5XzET1.PuP.MHT9N9ntumaU2,CJuyKtQC98P9PP7O
NbXmb.2.ojAk2Evm.,6.cUGpmWLuOpoKqvCbHZiYpedhA704TeKKw.bHfEWUmL.6..D.,716.C
cIhgsNHT9N9ntQ8qorG4704D.CbB,708T1U.EJe.T.3d02.,.X4,cU.ktAcoZimBhWhiohgnZc
ZRCY.2.w22U.EBU.U,.J7.tfj1.0E65.Q6AU0KyB.,..e,2.AU.Ue.4.072Ux.d51c6ERk.K.2
5A.EX4.162,E.0kE6.1606.H0y.0kfG.1M66.B5zT0VeITuE98FfeI986bONdPEd9RZ96FNNp7
698SVvPZ9R9fQr76RPNjPEd9RZfC,7J99Sd1m4ko.HtCPM0Fd8,dP9vQdPORvNp76t7Qx76ttQ
VPMRfD,7D3fD,7DHfD,7R99Sd96tt9HfD,7DTdMx76tt9b9Q1fPEsuHEemIqk2akVyIbCJe0Gl
yKqGKEqHEWGXyKrGrtuGryKtqqkmKEiGEOoru48qrmKmaGEGoYOJE8nRqk2aEf4Id0mtmGEGrq
0LR0mU8Jd4og0GNKHP0mbOIECIY4Idin4aEVKoXaIbqk2akUCpdKIdGJIKKECGEuoYmIK0mM0H
MamRqk2akYOIEKKLaKr0pk8rk0GH0GIKKL4KuGbUQYUohZ,aGEOGE2ZZp366v76ROGNO8,tHZ8
6FdP9vR..cT9f919RoZ3BipBggRicohZxCM8H76d8G9eHPM0akYUVVUQ2RWUYe6h6,78J7659P
TvQ99619PN96b9Q9vMHPMN9619Rdno.,d8HN1AV7A7Ooru4aKu4Kqaql0mYuIEKKLUiogjFLCL
uaLqKKEGJYkmwimpZ3phYZeVxgcIZdJZd2Y3pd2RbBAV7AV7A7KaV,UrhgdxgcZiUobx2YWxhg
76d8GUr,.3f8H7690kWuIWi1A7WGr.0mSUd.FNN..PM0Hkb8JEW0EL.dPSVPNBPM5PN,t6,dP9
1.YC.HN1HM0..UnBhuhgUQYUMN.UnVdgV7..sMT9PTfQ,t6,dP91.AZBA,U4xBCbpphYhgmZhd
phZ3Y7pdUohZxCEnELCLuUj2YZpZV,.kIqk2.UntQdfQHvO9vPf9R,NGR86..R,22...H76d0W
0.b9Q1HEe0M0HWZNOCJsEeWoWMNS5.QikBgiJZdQbUggiABEEenS0GX4IaCpW0mWuYBAV7AV3,
MG23.,t6u20GH0WyhgiAhi,H76d8G68whkhgi3Yn3iV76J,AVn3YugbUIYWQbBAV7M0H0.u06R
.007PNBPMf9Pd9Jn9QsMaGEOGEoB...00BuPQC7PNBPMfXd2YI37q.aUn,OqruahogVhhdZhtJ
bUIYUQZUohZ,.R,sMGGEiGE8mR8m4ak2AV3,M0HWihAUXlr220pr8LuCLLUplVyKqEeW2k2A7C
rh0ni0mF0GMWJEGJY66b96pNDCLEiGE8GE8GEKIbGoRU7sET9PTHeyqdGLtaKrSKIuqm..N76d
PPamRq.aUn,UXxhgFR0GF0mJYih3iUQZUsCU7g6.HMGoB.B1Cro66YAUHBhuFeW2P.HkYsQ.V,
66.EEMF.aUHZimBBCLLaIrGLeyqdG523..U2B7OorsQ0rraKrGLK0Guqad.aUn,UaxBqmtaKxK
KR0GFQ3666QdvC3N1HU7g6.HMGo6QCf1UU..Ui6R66d0P.HkYsQ..00.22K2U7MGo6QCb1L1..
Ui...UohgsN97PN5vPZPMdPOTfPp76ffP7PN.NPORPNP7RFfQTPRD9Ord6P.HkWmodKYn3Yu.L
,....8m4ak2A,9eHq.akWmY7pcUo6QC....u0.g,A,HWn,.66.EE.U7sQ.6R..EqaKrg3..HMF
RmRU7A7..M1M0KKLSLtQeoBgmZiIBgbd6b9Q1HFmGEWJoGrqmqf8roGrm8rtuGs8rmCrm8LvKq
IiHEKarlUGLu2ZWQioBD8GK0mtamRq.aUZNOR10GR6JZOJ9O1HM0akWM1.r,a2R1665Fb66EEW
0UVZhg,.MO..HMG.c9Ur,..MNkd.El8GK00...2Y3p7U7A7O2CbdZC...umtUU...ko8GK0Gg.
...g,g6.9nkG5,dCvFrKqvUBA,9WBMFRGECpmG5QbBIklbeZ3D5uPR9RZvPN9P9fQbndGb1Zim
Zh2hgnRg.AS..oZ1xhiZCU2hgnRg.sEMM.Et...ktu0.Y62UmX.2.Y02.A,,U..U,Iklb8IepZ
hZJinpZHFdKLq6F6.XDJ.QiiIepZhZ7F6.Zz.E.ses,sc6.,k,,UnpZHldG5GomCb.AS.c9Ajg
,0EtT.2.U6UOV.2.86.c918RABEWQC,E0E...7F.2U,2.2.2YXK90U.YjyC.zwP0k.k.E.0.3g
wPE.0U...p.0.4.IZ..,U.2m,.,.E4WDN.Ntarm3Wj.Jklb6.Qcj,.E6E...F.,.aU.Euqpt2Y
bQI,AzJE.nT3YyU3B,h8l2N.....
--- end of encoding ---