]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/html2ms.c
cc: use 7 octal digits for 21 bit runes
[plan9front.git] / sys / src / cmd / html2ms.c
index 6ecbeef372f681d82f9556a713b168423acc9244..7f6e0825bc9781236c6d310d63e7bed59062f0ec 100644 (file)
@@ -33,7 +33,6 @@ struct Text {
        int     pos;
        int     space;
        int     output;
-       int     aftertag;
 
        char    *bp;
        char    *wp;
@@ -217,6 +216,71 @@ onb(Text *text, Tag *tag)
        fontstyle(text, "B");
 }
 
+void onsmall(Text *text, Tag *tag);
+void onsup(Text *text, Tag *tag);
+
+void
+onsub(Text *text, Tag *tag)
+{
+       emit(text, "\\v\'0.5\'");
+       if(cistrcmp(tag->tag, "sub") == 0){
+               emit(text, "\\x\'0.5\'");
+               onsmall(text, tag);
+       } else
+               restorefontsize(text, tag);
+       tag->close = onsup;
+}
+
+void
+onsup(Text *text, Tag *tag)
+{
+       emit(text, "\\v\'-0.5\'");
+       if(cistrcmp(tag->tag, "sup") == 0){
+               emit(text, "\\x\'-0.5\'");
+               onsmall(text, tag);
+       }else
+               restorefontsize(text, tag);
+       tag->close = onsub;
+}
+
+/*
+ * this is poor mans CSS handler.
+ */
+void
+onspan(Text *text, Tag *tag)
+{
+       Attr *a;
+
+       if(!tag->opening)
+               return;
+
+       for(a=tag->attr; a < tag->attr+tag->nattr; a++){
+               if(cistrcmp(a->attr, "class") != 0)
+                       continue;
+
+               if(cistrcmp(a->val, "bold") == 0){
+                       onb(text, tag);
+                       return;
+               }
+               if(cistrcmp(a->val, "italic") == 0){
+                       oni(text, tag);
+                       return;
+               }
+               if(cistrcmp(a->val, "subscript") == 0){
+                       strcpy(tag->tag, "sub");
+                       onsub(text, tag);
+                       strcpy(tag->tag, "span");
+                       return;
+               }
+               if(cistrcmp(a->val, "superscript") == 0){
+                       strcpy(tag->tag, "sup");
+                       onsup(text, tag);
+                       strcpy(tag->tag, "span");
+                       return;
+               }
+       }
+}
+
 void
 ontt(Text *text, Tag *tag)
 {
@@ -262,8 +326,6 @@ onquote(Text *text, Tag *tag)
 typedef struct Table Table;
 struct Table
 {
-       char    *fmt;
-
        char    *bp;
        int     nb;
 
@@ -272,6 +334,8 @@ struct Table
        int     enclose;
        int     brk;
 
+       char    fmt[4];
+
        Text    save;
 };
 
@@ -349,7 +413,7 @@ endtable(Text *text, Tag *tag)
                if(t->brk){
                        while(i < cols){
                                s = mallocz(sizeof(Table), 1);
-                               s->fmt = "L";
+                               strcpy(s->fmt, "L");
                                s->brk = t->brk;
                                t->brk = 0;
                                s->next = t->next;
@@ -432,9 +496,11 @@ endcell(Text *text, Tag *tag)
                        t->enclose = 1;
                }
                if(gotstyle(tag, "text-align", "center") || gotstyle(tt, "text-align", "center"))
-                       t->fmt = "c";
+                       strcpy(t->fmt, "C");
                else
-                       t->fmt = "L";
+                       strcpy(t->fmt, "L");
+               if(strcmp(tag->tag, "th") == 0)
+                       strcpy(t->fmt+1, "B");
                t->prev = tt->aux;
                tt->aux = t;
                *text = t->save;
@@ -510,6 +576,9 @@ struct {
        "td",           oncell,
        "th",           oncell,
        "tr",           oncell,
+       "sub",          onsub,
+       "sup",          onsup,
+       "span",         onspan,
        "tt",           ontt,
        "var",          oni,
 };
@@ -816,7 +885,6 @@ parsetext(Text *text, Tag *tag)
                        if(c == '<'){
                                memset(&t, 0, sizeof(t));
                                if(parsetag(&t)){
-                                       text->aftertag = 1;
                                        if(t.opening){
                                                t.up = tag;
                                                parsetext(text, &t);
@@ -844,8 +912,6 @@ parsetext(Text *text, Tag *tag)
                        switch(r){
                        case '\n':
                        case '\r':
-                               if(text->pre == 0 && text->aftertag)
-                                       break;
                        case ' ':
                        case '\t':
                                if(text->pre == 0){
@@ -866,7 +932,6 @@ parsetext(Text *text, Tag *tag)
                                if(r == 0xA0)
                                        r = ' ';
                                emitrune(text, r);
-                               text->aftertag = 0;
                                text->space = 0;
                        }
                }