Advertisement
Guest User

UWindow/UWindowHTMLTextArea.uc

a guest
Jan 12th, 2016
29
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. class UWindowHTMLTextArea expands UWindowDynamicTextArea;
  2.  
  3. /*
  4.  
  5. HTML Currently Supported
  6. ========================
  7.  
  8. Parsed on add
  9. -------------
  10. <body bgcolor=#ffffff link=red alink=#yellow>...</body>
  11. <font color=#ffffff bgcolor=#ffffff>...</font>
  12. <br>
  13. <center>....</center>
  14. <p>
  15. <h1>...</h1>
  16.  
  17. Parsed on add and display
  18. -------------------------
  19. <nobr>...</nobr>
  20. <a href="...">...</a>
  21. <b>...</b>
  22. <u>...</u>
  23. <blink>...</blink>
  24.  
  25. Parsed only on display
  26. ----------------------
  27. &gt;
  28. &lt;
  29. &amp;
  30. &nbsp;
  31.  
  32. Planned improvements
  33. --------------------
  34. <ul><li>item 1<li>item 2...</ul>
  35. <table>...</table>
  36.  
  37. Bugs
  38. ----
  39. The parsing is pretty slack!
  40.  
  41. */
  42.  
  43. // default styles
  44. var Color TextColor;
  45. var Color BGColor;
  46. var Color LinkColor;
  47. var Color ALinkColor;
  48. var float LastBlinkTime;
  49. var bool bShowBlink;
  50. var bool bReleased;
  51.  
  52. function SetHTML(string HTML)
  53. {
  54.     Clear();
  55.     ReplaceText(HTML, Chr(13)$Chr(10), " ");
  56.     ReplaceText(HTML, Chr(13), " ");
  57.     ReplaceText(HTML, Chr(10), " ");
  58.     AddText(HTML);
  59. }
  60.  
  61. function BeforePaint(Canvas C, float X, float Y)
  62. {
  63.     Super.BeforePaint(C, X, Y);
  64.     Cursor = Root.NormalCursor;
  65. }
  66.  
  67. function Paint(Canvas C, float X, float Y)
  68. {
  69.     C.DrawColor = BGColor;
  70.     DrawStretchedTexture(C, 0, 0, WinWidth, WinHeight, Texture'WhiteTexture');
  71.     Super.Paint(C, X, Y);
  72.     bReleased = False;
  73. }
  74.  
  75. function Click(float X, float Y)
  76. {
  77.     Super.Click(X, Y);
  78.     bReleased = True;
  79. }
  80.  
  81. function ProcessURL(string URL)
  82. {
  83.     Log("Clicked Link: >>"$URL$"<<");
  84.  
  85.     if ( Left(URL, 7) ~= "mailto:" )
  86.         GetPlayerOwner().ConsoleCommand("start "$URL);
  87.     if ( Left(URL, 7) ~= "http://" )
  88.         GetPlayerOwner().ConsoleCommand("start "$URL);
  89.     if ( Left(URL, 8) ~= "https://" )
  90.         GetPlayerOwner().ConsoleCommand("start "$URL);
  91.     if ( Left(URL, 6) ~= "ftp://" )
  92.         GetPlayerOwner().ConsoleCommand("start "$URL);
  93.     if ( Left(URL, 9) ~= "telnet://" )
  94.         GetPlayerOwner().ConsoleCommand("start "$URL);
  95.     if ( Left(URL, 9) ~= "gopher://" )
  96.         GetPlayerOwner().ConsoleCommand("start "$URL);
  97.     if ( Left(URL, 4) ~= "www." )
  98.         GetPlayerOwner().ConsoleCommand("start http://"$URL);
  99.     if ( Left(URL, 4) ~= "ftp." )
  100.         GetPlayerOwner().ConsoleCommand("start ftp://"$URL);
  101.     else if ( Left(URL, 9) ~= "unreal://" )
  102.         LaunchUnrealURL(URL);
  103. }
  104.  
  105. function OverURL(string URL)
  106. {
  107. }
  108.  
  109. function LaunchUnrealURL(string URL)
  110. {
  111.     GetPlayerOwner().ClientTravel(URL, TRAVEL_Absolute, false);
  112. }
  113.  
  114. function TextAreaTextSize(Canvas C, string Text, out float W, out float H)
  115. {
  116.     ReplaceText(Text, "&nbsp;", " ");
  117.     ReplaceText(Text, "&gt;", ">");
  118.     ReplaceText(Text, "&lt;", "<");
  119.     ReplaceText(Text, "&amp;", "&");
  120.  
  121.     TextSize(C, Text, W, H);
  122. }
  123.  
  124. function TextAreaClipText(Canvas C, float DrawX, float DrawY, coerce string Text, optional bool bCheckHotkey, optional color Col )
  125. {
  126.     ReplaceText(Text, "&nbsp;", " ");
  127.     ReplaceText(Text, "&gt;", ">");
  128.     ReplaceText(Text, "&lt;", "<");
  129.     ReplaceText(Text, "&amp;", "&");
  130.  
  131.     ClipText(C, DrawX, DrawY, Text, bCheckHotKey);
  132. }
  133.  
  134. ///////////////////////////////////////////////////////
  135. // Overloaded functions from UWindowDynamicTextArea
  136. ///////////////////////////////////////////////////////
  137.  
  138. function WrapRow(Canvas C, UWindowDynamicTextRow L)
  139. {
  140.     local HTMLStyle CurrentStyle;
  141.     local UWindowHTMLTextRow R;
  142.     local string Input, LeftText, HTML, RightText;
  143.  
  144.     Super.WrapRow(C, L);
  145.  
  146.     // Generate the DisplayString and StyleString lines for each row
  147.     R = UWindowHTMLTextRow(L);
  148.     while (R != None && (R == L || R.WrapParent == L))
  149.     {
  150.         R.DisplayString = "";
  151.         R.StyleString = "";
  152.  
  153.         CurrentStyle = R.StartStyle;
  154.  
  155.         Input = R.Text;
  156.         while (Input != "")
  157.         {
  158.             ParseHTML(Input, LeftText, HTML, RightText);
  159.  
  160.             if (LeftText != "" || R.DisplayString == "")
  161.             {
  162.                 R.DisplayString = R.DisplayString $ LeftText;
  163.                 R.StyleString = R.StyleString $ WriteStyleText(CurrentStyle, Len(LeftText));
  164.             }
  165.  
  166.             ProcessInlineHTML(HTML, CurrentStyle);
  167.             SetCanvasStyle(C, CurrentStyle);
  168.  
  169.             Input = RightText;
  170.         }
  171.  
  172.         R = UWindowHTMLTextRow(R.Next);
  173.     }
  174. }
  175.  
  176. function float DrawTextLine(Canvas C, UWindowDynamicTextRow L, float Y)
  177. {
  178.     local float X, W, H, MouseX, MouseY;
  179.     local HTMLStyle CurrentStyle;
  180.     local float RowHeight;
  181.     local Color OldColor;
  182.     local int StylePos, DisplayPos, i;
  183.     local string S;
  184.  
  185.     RowHeight = 0;
  186.  
  187.     CurrentStyle = UWindowHTMLTextRow(L).StartStyle;
  188.     if (CurrentStyle.bCenter)
  189.     {
  190.         W = CalcHTMLTextWidth(C, L.Text, CurrentStyle);
  191.         if (VertSB.bWindowVisible)
  192.             X = int(((WinWidth - VertSB.WinWidth) - W) / 2);
  193.         else
  194.             X = int((WinWidth - W) / 2);
  195.     }
  196.     else
  197.         X = 2;
  198.  
  199.     if (GetEntryLevel().TimeSeconds > LastBlinkTime + 0.5)
  200.     {
  201.         bShowBlink = !bShowBlink;
  202.         LastBlinkTime = GetEntryLevel().TimeSeconds;
  203.     }
  204.  
  205.     if (UWindowHTMLTextRow(L).DisplayString == "")
  206.         SetCanvasStyle(C, CurrentStyle);
  207.     else
  208.     {
  209.         while (DisplayPos < Len(UWindowHTMLTextRow(L).DisplayString))
  210.         {
  211.             i = ReadStyleText(UWindowHTMLTextRow(L).StyleString, StylePos, CurrentStyle);
  212.             S = Mid(UWindowHTMLTextRow(L).DisplayString, DisplayPos, i);
  213.             DisplayPos += i;
  214.             SetCanvasStyle(C, CurrentStyle);
  215.  
  216.             TextAreaTextSize(C, S, W, H);
  217.             if (H > RowHeight)
  218.                 RowHeight = H;
  219.  
  220.             if (CurrentStyle.bLink)
  221.             {
  222.                 GetMouseXY(MouseX, MouseY);
  223.                 if (X < MouseX && X + W > MouseX && Y < MouseY && Y + H > MouseY)
  224.                 {
  225.                     Cursor = Root.HandCursor;
  226.                     OverURL(CurrentStyle.LinkDestination);
  227.  
  228.                     if (bMouseDown || bReleased)
  229.                     {
  230.                         if (bReleased)
  231.                         {
  232.                             ProcessURL(CurrentStyle.LinkDestination);
  233.                             bReleased = False;
  234.                         }
  235.                         else
  236.                             C.DrawColor = ALinkColor;
  237.                     }
  238.                 }
  239.             }
  240.  
  241.             if (CurrentStyle.BGColor != BGColor)
  242.             {
  243.                 OldColor = C.DrawColor;
  244.                 C.DrawColor = CurrentStyle.BGColor;
  245.                 DrawStretchedTexture(C, X, Y, W, H, Texture'WhiteTexture');
  246.                 C.DrawColor = OldColor;
  247.             }
  248.             if (!CurrentStyle.bBlink || bShowBlink)
  249.                 TextAreaClipText(C, X, Y, S);
  250.             if (CurrentStyle.bLink || CurrentStyle.bUnderline)
  251.                 DrawStretchedTexture(C, X, Y+H-1, W, 1, Texture'WhiteTexture');
  252.  
  253.             X += W;
  254.         }
  255.     }
  256.     if (RowHeight == 0)
  257.         TextAreaTextSize(C, "A", W, RowHeight);
  258.  
  259.     return RowHeight;
  260. }
  261.  
  262. function UWindowDynamicTextRow SplitRowAt(UWindowDynamicTextRow L, int SplitPos)
  263. {
  264.     local UWindowDynamicTextRow N;
  265.     local HTMLStyle CurrentStyle;
  266.  
  267.     N = Super.SplitRowAt(L, SplitPos);
  268.  
  269.     // update the style by processing from the start of L to the split position.
  270.     UWindowHTMLTextRow(N).EndStyle = UWindowHTMLTextRow(L).EndStyle;
  271.     CurrentStyle = UWindowHTMLTextRow(L).StartStyle;
  272.     HTMLUpdateStyle(L.Text, CurrentStyle);
  273.     UWindowHTMLTextRow(L).EndStyle = CurrentStyle;
  274.     UWindowHTMLTextRow(N).StartStyle = CurrentStyle;
  275.  
  276.     return N;
  277. }
  278.  
  279. function RemoveWrap(UWindowDynamicTextRow L)
  280. {
  281.     local UWindowDynamicTextRow N;
  282.  
  283.     // copy final endstyle to current row
  284.     N = UWindowDynamicTextRow(L.Next);
  285.     while (N != None && N.WrapParent == L)
  286.     {
  287.         UWindowHTMLTextRow(L).EndStyle = UWindowHTMLTextRow(N).EndStyle;
  288.         N = UWindowDynamicTextRow(N.Next);
  289.     }
  290.  
  291.     Super.RemoveWrap(L);
  292. }
  293.  
  294. function int GetWrapPos(Canvas C, UWindowDynamicTextRow L, float MaxWidth)
  295. {
  296.     local float LineWidth, NextWordWidth;
  297.     local string Input, NextWord;
  298.     local int WordsThisRow, WrapPos;
  299.     local HTMLStyle CurrentStyle;
  300.  
  301.     CurrentStyle = UWindowHTMLTextRow(L).StartStyle;
  302.  
  303.     // quick check
  304.     if (CalcHTMLTextWidth(C, L.Text, CurrentStyle) <= MaxWidth)
  305.         return -1;
  306.  
  307.     Input = L.Text;
  308.     WordsThisRow = 0;
  309.     LineWidth = 0;
  310.     WrapPos = 0;
  311.     NextWord = "";
  312.     CurrentStyle = UWindowHTMLTextRow(L).StartStyle;
  313.  
  314.     while (Input != "" || NextWord != "")
  315.     {
  316.         if (NextWord == "")
  317.         {
  318.             RemoveNextWord(Input, NextWord);
  319.             NextWordWidth = CalcHTMLTextWidth(C, NextWord, CurrentStyle);
  320.         }
  321.         if (WordsThisRow > 0 && LineWidth + NextWordWidth > MaxWidth)
  322.         {
  323.             return WrapPos;
  324.         }
  325.         else
  326.         {
  327.             WrapPos += Len(NextWord);
  328.             LineWidth += NextWordWidth;
  329.             NextWord = "";
  330.             WordsThisRow++;
  331.         }
  332.     }
  333.     return -1;
  334. }
  335.  
  336. // Find the next word - but don't split up HTML tags.
  337. function RemoveNextWord(out string Text, out string NextWord)
  338. {
  339.     local int i;
  340.     local bool bInsideTag;
  341.     local string Ch;
  342.  
  343.     bInsideTag = False;
  344.  
  345.     for (i=0; i<Len(Text); i++)
  346.     {
  347.         Ch = Mid(Text, i, 1);
  348.         if (Ch == ">")
  349.             bInsideTag = False;
  350.         if (Ch == "<")
  351.             bInsideTag = True;
  352.         if (Ch == " " && !bInsideTag)
  353.             break;
  354.     }
  355.     while (Mid(Text, i, 1) == " ")
  356.         i++;
  357.     NextWord = Left(Text, i);
  358.     Text = Mid(Text, i);
  359. }
  360.  
  361. function UWindowDynamicTextRow AddText(string NewLine, optional color TxtCol )
  362. {
  363.     local string Input, Output, LeftText, RightText, HTML, Temp;
  364.     local int i;
  365.     local UWindowDynamicTextRow L;
  366.     local HTMLStyle CurrentStyle, StartStyle;
  367.  
  368.     if (List.Last == List)
  369.     {
  370.         CurrentStyle.BulletLevel = 0;
  371.         CurrentStyle.LinkDestination = "";
  372.         CurrentStyle.TextColor = TextColor;
  373.         CurrentStyle.BGColor = BGColor;
  374.         CurrentStyle.bCenter = bHCenter;
  375.         CurrentStyle.bLink = False;
  376.         CurrentStyle.bUnderline = False;
  377.         CurrentStyle.bNoBR = False;
  378.         CurrentStyle.bHeading = False;
  379.         CurrentStyle.bBold = False;
  380.         CurrentStyle.bBlink = False;
  381.     }
  382.     else
  383.         CurrentStyle = UWindowHTMLTextRow(List.Last).EndStyle;
  384.     StartStyle = CurrentStyle;
  385.  
  386.     // convert \\n's -> <br>'s
  387.     i = InStr(NewLine, "\\n");
  388.     while (i != -1)
  389.     {
  390.         NewLine = Left(NewLine, i) $ "<br>" $ Mid(NewLine, i + 2);
  391.         i = InStr(NewLine, "\\n");
  392.     }
  393.  
  394.     Input = NewLine;
  395.     Output = "";
  396.     while (Input != "")
  397.     {
  398.         ParseHTML(Input, LeftText, HTML, RightText);
  399.  
  400.         switch (GetTag(HTML))
  401.         {
  402.             // multiline HTML tags
  403.         case "P":
  404.             if ((Output $ LeftText) != "")
  405.             {
  406.                 L = Super.AddText(Output $ LeftText);
  407.                 Output = "";
  408.                 UWindowHTMLTextRow(L).StartStyle = StartStyle;
  409.                 UWindowHTMLTextRow(L).EndStyle = CurrentStyle;
  410.             }
  411.             StartStyle = CurrentStyle;
  412.             L = Super.AddText("");
  413.             UWindowHTMLTextRow(L).StartStyle = StartStyle;
  414.             UWindowHTMLTextRow(L).EndStyle = CurrentStyle;
  415.             break;
  416.         case "BR":
  417.             L = Super.AddText(Output $ LeftText);
  418.             Output = "";
  419.             UWindowHTMLTextRow(L).StartStyle = StartStyle;
  420.             UWindowHTMLTextRow(L).EndStyle = CurrentStyle;
  421.             StartStyle = CurrentStyle;
  422.             break;
  423.         case "BODY":
  424.             Temp = GetOption(HTML, "BGCOLOR=");
  425.             if (Temp != "")
  426.             {
  427.                 BGColor = ParseColor(Temp);
  428.                 CurrentStyle.BGColor = BGColor;
  429.                 StartStyle.BGColor = BGColor;
  430.             }
  431.  
  432.             Temp = GetOption(HTML, "LINK=");
  433.             if (Temp != "")
  434.                 LinkColor = ParseColor(Temp);
  435.  
  436.             Temp = GetOption(HTML, "ALINK=");
  437.             if (Temp != "")
  438.                 ALinkColor = ParseColor(Temp);
  439.  
  440.             Temp = GetOption(HTML, "TEXT=");
  441.             if (Temp != "")
  442.             {
  443.                 TextColor = ParseColor(Temp);
  444.                 CurrentStyle.TextColor = TextColor;
  445.             }
  446.             Output = Output $ LeftText;
  447.             break;
  448.         case "CENTER":
  449.             if ((Output $ LeftText) != "")
  450.             {
  451.                 L = Super.AddText(Output $ LeftText);
  452.                 Output = "";
  453.                 UWindowHTMLTextRow(L).StartStyle = StartStyle;
  454.                 UWindowHTMLTextRow(L).EndStyle = CurrentStyle;
  455.             }
  456.             CurrentStyle.bCenter = True;
  457.             StartStyle = CurrentStyle;
  458.             break;
  459.         case "/CENTER":
  460.             L = Super.AddText(Output $ LeftText);
  461.             Output = "";
  462.             UWindowHTMLTextRow(L).StartStyle = StartStyle;
  463.             UWindowHTMLTextRow(L).EndStyle = CurrentStyle;
  464.             CurrentStyle.bCenter = False;
  465.             StartStyle = CurrentStyle;
  466.             break;
  467.             // Inline HTML tags
  468.         case "H1":
  469.             if ((Output $ LeftText) != "")
  470.             {
  471.                 L = Super.AddText(Output $ LeftText);
  472.                 Output = "";
  473.                 UWindowHTMLTextRow(L).StartStyle = StartStyle;
  474.                 UWindowHTMLTextRow(L).EndStyle = CurrentStyle;
  475.             }
  476.             CurrentStyle.bHeading = True;
  477.             StartStyle = CurrentStyle;
  478.             break;
  479.         case "/H1":
  480.             L = Super.AddText(Output $ LeftText);
  481.             Output = "";
  482.             UWindowHTMLTextRow(L).StartStyle = StartStyle;
  483.             UWindowHTMLTextRow(L).EndStyle = CurrentStyle;
  484.             CurrentStyle.bHeading = False;
  485.             StartStyle = CurrentStyle;
  486.             break;
  487.         case "FONT":
  488.             Output = Output $ LeftText $ HTML;
  489.             Temp = GetOption(HTML, "COLOR=");
  490.             if (Temp != "")
  491.                 CurrentStyle.TextColor = ParseColor(Temp);
  492.             Temp = GetOption(HTML, "BGCOLOR=");
  493.             if (Temp != "")
  494.                 CurrentStyle.BGColor = ParseColor(Temp);
  495.             break;
  496.         case "/FONT":
  497.             Output = Output $ LeftText $ HTML;
  498.             CurrentStyle.TextColor = TextColor;
  499.             CurrentStyle.BGColor = BGColor;
  500.             break;
  501.         case "B":
  502.             Output = Output $ LeftText $ HTML;
  503.             CurrentStyle.bBold = True;
  504.             break;
  505.         case "/B":
  506.             Output = Output $ LeftText $ HTML;
  507.             CurrentStyle.bBold = False;
  508.             break;
  509.         case "U":
  510.             Output = Output $ LeftText $ HTML;
  511.             CurrentStyle.bUnderline = True;
  512.             break;
  513.         case "/U":
  514.             Output = Output $ LeftText $ HTML;
  515.             CurrentStyle.bUnderline = False;
  516.             break;
  517.         case "A":
  518.             Output = Output $ LeftText $ HTML;
  519.             CurrentStyle.bLink = True;
  520.             CurrentStyle.LinkDestination = GetOption(HTML, "HREF=");
  521.             break;
  522.         case "/A":
  523.             Output = Output $ LeftText $ HTML;
  524.             CurrentStyle.bLink = False;
  525.             CurrentStyle.LinkDestination = "";
  526.             break;
  527.         case "NOBR":
  528.             Output = Output $ LeftText $ HTML;
  529.             CurrentStyle.bNoBR = True;
  530.             break;
  531.         case "/NOBR":
  532.             Output = Output $ LeftText $ HTML;
  533.             CurrentStyle.bNoBR = False;
  534.             break;
  535.         case "BLINK":
  536.             Output = Output $ LeftText $ HTML;
  537.             CurrentStyle.bBlink = True;
  538.             break;
  539.         case "/BLINK":
  540.             Output = Output $ LeftText $ HTML;
  541.             CurrentStyle.bBlink = False;
  542.             break;
  543.         default:
  544.             Output = Output $ LeftText;
  545.             break;
  546.         }
  547.         Input = RightText;
  548.     }
  549.  
  550.     L = Super.AddText(Output);
  551.     UWindowHTMLTextRow(L).StartStyle = StartStyle;
  552.     UWindowHTMLTextRow(L).EndStyle = CurrentStyle;
  553.  
  554.     return L;
  555. }
  556.  
  557. ///////////////////////////////////////////////////
  558. // HTML Text Processing
  559. ///////////////////////////////////////////////////
  560.  
  561. // Get the next HTML tag, the text before it and everthing after it.
  562. function ParseHTML(string Input, out string LeftText, out string HTML, out string RightText)
  563. {
  564.     local int i;
  565.  
  566.     i = InStr(Input, "<");
  567.     if (i == -1)
  568.     {
  569.         LeftText = Input;
  570.         HTML = "";
  571.         RightText = "";
  572.         return;
  573.     }
  574.  
  575.     LeftText = Left(Input, i);
  576.     HTML = Mid(Input, i);
  577.  
  578.     i = InStr(HTML, ">");
  579.     if (i == -1)
  580.     {
  581.         RightText = "";
  582.         return;
  583.     }
  584.  
  585.     RightText = Mid(HTML, i+1);
  586.     HTML = Left(HTML, i+1);
  587. }
  588.  
  589. function float CalcHTMLTextWidth(Canvas C, string Text, out HTMLStyle CurrentStyle)
  590. {
  591.     local string Input, LeftText, HTML, RightText;
  592.     local float W, H, Width;
  593.  
  594.     Width = 0;
  595.     Input = Text;
  596.     while (Input != "")
  597.     {
  598.         ParseHTML(Input, LeftText, HTML, RightText);
  599.  
  600.         SetCanvasStyle(C, CurrentStyle);
  601.         TextAreaTextSize(C, LeftText, W, H);
  602.         Width += W;
  603.  
  604.         ProcessInlineHTML(HTML, CurrentStyle);
  605.  
  606.         Input = RightText;
  607.     }
  608.  
  609.     return Width;
  610. }
  611.  
  612. // Update CurrentStyle based on the contents of the HTML tag provided
  613. function ProcessInlineHTML(string HTML, out HTMLStyle CurrentStyle)
  614. {
  615.     local string Temp;
  616.  
  617.     if (HTML == "")
  618.         return;
  619.  
  620.     switch (GetTag(HTML))
  621.     {
  622.     case "H1":
  623.         CurrentStyle.bHeading = True;
  624.         break;
  625.     case "/H1":
  626.         CurrentStyle.bHeading = False;
  627.         break;
  628.     case "FONT":
  629.         Temp = GetOption(HTML, "COLOR=");
  630.         if (Temp != "")
  631.             CurrentStyle.TextColor = ParseColor(Temp);
  632.         Temp = GetOption(HTML, "BGCOLOR=");
  633.         if (Temp != "")
  634.             CurrentStyle.BGColor = ParseColor(Temp);
  635.         break;
  636.     case "/FONT":
  637.         CurrentStyle.TextColor = TextColor;
  638.         CurrentStyle.BGColor = BGColor;
  639.         break;
  640.     case "B":
  641.         CurrentStyle.bBold = True;
  642.         break;
  643.     case "/B":
  644.         CurrentStyle.bBold = False;
  645.         break;
  646.     case "U":
  647.         CurrentStyle.bUnderline = True;
  648.         break;
  649.     case "/U":
  650.         CurrentStyle.bUnderline = False;
  651.         break;
  652.     case "A":
  653.         CurrentStyle.bLink = True;
  654.         CurrentStyle.LinkDestination = GetOption(HTML, "HREF=");
  655.         break;
  656.     case "/A":
  657.         CurrentStyle.bLink = False;
  658.         CurrentStyle.LinkDestination = "";
  659.         break;
  660.     case "NOBR":
  661.         CurrentStyle.bNoBR = True;
  662.         break;
  663.     case "/NOBR":
  664.         CurrentStyle.bNoBR = False;
  665.         break;
  666.     case "BLINK":
  667.         CurrentStyle.bBlink = True;
  668.         break;
  669.     case "/BLINK":
  670.         CurrentStyle.bBlink = False;
  671.         break;
  672.     }
  673. }
  674.  
  675. // update the current style based on some text input
  676. function HTMLUpdateStyle(string Input, out HTMLStyle CurrentStyle)
  677. {
  678.     local string LeftText, HTML, RightText;
  679.  
  680.     while (Input != "")
  681.     {
  682.         ParseHTML(Input, LeftText, HTML, RightText);
  683.         ProcessInlineHTML(HTML, CurrentStyle);
  684.         Input = RightText;
  685.     }
  686. }
  687.  
  688. final function string GetOption(string HTML, string Option)
  689. {
  690.     local int i, j;
  691.     local string s;
  692.  
  693.     i = InStr(Caps(HTML), Caps(Option));
  694.  
  695.     if (i == 1 || Mid(HTML, i-1, 1) == " ")
  696.     {
  697.         s = Mid(HTML, i+Len(Option));
  698.         j = FirstMatching(InStr(s, ">"), InStr(s, " "));
  699.         s = Left(s, j);
  700.  
  701.         if (Left(s, 1) == "\"")
  702.             s = Mid(s, 1);
  703.  
  704.         if (Right(s, 1) == "\"")
  705.             s = Left(s, Len(s) - 1);
  706.  
  707.         return s;
  708.     }
  709.     return "";
  710. }
  711.  
  712. final function string GetTag(string HTML)
  713. {
  714.     local int i;
  715.  
  716.     if (HTML == "")
  717.         return "";
  718.  
  719.     HTML = Mid(HTML, 1); // lose <
  720.  
  721.     i = FirstMatching(InStr(HTML, ">"), InStr(HTML, " "));
  722.     if (i == -1)
  723.         return Caps(HTML);
  724.     else
  725.         return Caps(Left(HTML, i));
  726. }
  727.  
  728. function Color ParseColor(string S)
  729. {
  730.     local Color C;
  731.  
  732.     if (Left(S, 1) == "#")
  733.         S = Mid(S, 1);
  734.  
  735.     if ( S~="red" )
  736.     {
  737.         C.R = 255;
  738.         C.G = 0;
  739.         C.B = 0;
  740.     }
  741.     else if ( S~="blue" )
  742.     {
  743.         C.R = 0;
  744.         C.G = 0;
  745.         C.B = 255;
  746.     }
  747.     else if ( S~="green" )
  748.     {
  749.         C.R = 0;
  750.         C.G = 255;
  751.         C.B = 0;
  752.     }
  753.     else if ( S~="yellow" )
  754.     {
  755.         C.R = 255;
  756.         C.G = 255;
  757.         C.B = 0;
  758.     }
  759.     else if ( S~="white" )
  760.     {
  761.         C.R = 255;
  762.         C.G = 255;
  763.         C.B = 255;
  764.     }
  765.     else if ( S~="black" )
  766.     {
  767.         C.R = 0;
  768.         C.G = 0;
  769.         C.B = 0;
  770.     }
  771.     else
  772.     {
  773.         C.R = 16 * GetHexDigit(Mid(S, 0, 1)) + GetHexDigit(Mid(S, 1, 1));
  774.         C.G = 16 * GetHexDigit(Mid(S, 2, 1)) + GetHexDigit(Mid(S, 3, 1));
  775.         C.B = 16 * GetHexDigit(Mid(S, 4, 1)) + GetHexDigit(Mid(S, 5, 1));
  776.     }
  777.  
  778.     return C;
  779. }
  780.  
  781. final function int GetHexDigit(string D)
  782. {
  783.     switch (caps(D))
  784.     {
  785.     case "0":
  786.         return 0;
  787.     case "1":
  788.         return 1;
  789.     case "2":
  790.         return 2;
  791.     case "3":
  792.         return 3;
  793.     case "4":
  794.         return 4;
  795.     case "5":
  796.         return 5;
  797.     case "6":
  798.         return 6;
  799.     case "7":
  800.         return 7;
  801.     case "8":
  802.         return 8;
  803.     case "9":
  804.         return 9;
  805.     case "A":
  806.         return 10;
  807.     case "B":
  808.         return 11;
  809.     case "C":
  810.         return 12;
  811.     case "D":
  812.         return 13;
  813.     case "E":
  814.         return 14;
  815.     case "F":
  816.         return 15;
  817.     }
  818.  
  819.     return 0;
  820. }
  821.  
  822. function int FirstMatching(int i, int j)
  823. {
  824.     if (i == -1)
  825.         return j;
  826.  
  827.     if (j == -1)
  828.         return i;
  829.     else
  830.         return Min(i, j);
  831. }
  832.  
  833. function SetCanvasStyle(Canvas C, HTMLStyle CurrentStyle)
  834. {
  835.     if (CurrentStyle.bLink)
  836.         C.DrawColor = LinkColor;
  837.     else
  838.         C.DrawColor = CurrentStyle.TextColor;
  839.  
  840.     if (CurrentStyle.bHeading)
  841.         C.Font = Root.Fonts[F_LargeBold];
  842.     else if (CurrentStyle.bBold)
  843.         C.Font = Root.Fonts[F_Bold];
  844.     else
  845.         C.Font = Root.Fonts[F_Normal];
  846. }
  847.  
  848. function string WriteStyleText(HTMLStyle CurrentStyle, int CharCount)
  849. {
  850.     local string Pad;
  851.     local string Temp;
  852.     local string Output;
  853.  
  854.     Pad = "0000";
  855.  
  856.     Temp = string(CharCount);
  857.     Output = Left(Pad, 4 - Len(Temp)) $ Temp;
  858.  
  859.     Temp = string(Len(CurrentStyle.LinkDestination));
  860.     Output = Output $ Left(Pad, 4 - Len(Temp)) $ Temp $ CurrentStyle.LinkDestination;
  861.  
  862.     Temp = string(CurrentStyle.TextColor.R);
  863.     Output = Output $ Left(Pad, 3 - Len(Temp)) $ Temp;
  864.     Temp = string(CurrentStyle.TextColor.G);
  865.     Output = Output $ Left(Pad, 3 - Len(Temp)) $ Temp;
  866.     Temp = string(CurrentStyle.TextColor.B);
  867.     Output = Output $ Left(Pad, 3 - Len(Temp)) $ Temp;
  868.  
  869.     Temp = string(CurrentStyle.BGColor.R);
  870.     Output = Output $ Left(Pad, 3 - Len(Temp)) $ Temp;
  871.     Temp = string(CurrentStyle.BGColor.G);
  872.     Output = Output $ Left(Pad, 3 - Len(Temp)) $ Temp;
  873.     Temp = string(CurrentStyle.BGColor.B);
  874.     Output = Output $ Left(Pad, 3 - Len(Temp)) $ Temp;
  875.  
  876.     if (CurrentStyle.bCenter)
  877.         Output = Output $ "T";
  878.     else
  879.         Output = Output $ "F";
  880.  
  881.     if (CurrentStyle.bLink)
  882.         Output = Output $ "T";
  883.     else
  884.         Output = Output $ "F";
  885.  
  886.     if (CurrentStyle.bUnderline)
  887.         Output = Output $ "T";
  888.     else
  889.         Output = Output $ "F";
  890.  
  891.     if (CurrentStyle.bNoBR)
  892.         Output = Output $ "T";
  893.     else
  894.         Output = Output $ "F";
  895.  
  896.     if (CurrentStyle.bHeading)
  897.         Output = Output $ "T";
  898.     else
  899.         Output = Output $ "F";
  900.  
  901.     if (CurrentStyle.bBold)
  902.         Output = Output $ "T";
  903.     else
  904.         Output = Output $ "F";
  905.  
  906.     if (CurrentStyle.bBlink)
  907.         Output = Output $ "T";
  908.     else
  909.         Output = Output $ "F";
  910.  
  911.     return Output;
  912. }
  913.  
  914. function int ReadStyleText(string StyleString, out int StylePos, out HTMLStyle CurrentStyle)
  915. {
  916.     local int CharCount;
  917.     local int i;
  918.  
  919.     CharCount = Int(Mid(StyleString, StylePos, 4));
  920.     StylePos += 4;
  921.  
  922.     i = Int(Mid(StyleString, StylePos, 4));
  923.     StylePos += 4;
  924.  
  925.     CurrentStyle.LinkDestination = Mid(StyleString, StylePos, i);
  926.     StylePos += i;
  927.  
  928.     CurrentStyle.TextColor.R = Int(Mid(StyleString, StylePos, 3));
  929.     StylePos += 3;
  930.     CurrentStyle.TextColor.G = Int(Mid(StyleString, StylePos, 3));
  931.     StylePos += 3;
  932.     CurrentStyle.TextColor.B = Int(Mid(StyleString, StylePos, 3));
  933.     StylePos += 3;
  934.  
  935.     CurrentStyle.BGColor.R = Int(Mid(StyleString, StylePos, 3));
  936.     StylePos += 3;
  937.     CurrentStyle.BGColor.G = Int(Mid(StyleString, StylePos, 3));
  938.     StylePos += 3;
  939.     CurrentStyle.BGColor.B = Int(Mid(StyleString, StylePos, 3));
  940.     StylePos += 3;
  941.  
  942.     CurrentStyle.bCenter = Mid(StyleString, StylePos++, 1) == "T";
  943.     CurrentStyle.bLink = Mid(StyleString, StylePos++, 1) == "T";
  944.     CurrentStyle.bUnderline = Mid(StyleString, StylePos++, 1) == "T";
  945.     CurrentStyle.bNoBR = Mid(StyleString, StylePos++, 1) == "T";
  946.     CurrentStyle.bHeading = Mid(StyleString, StylePos++, 1) == "T";
  947.     CurrentStyle.bBold = Mid(StyleString, StylePos++, 1) == "T";
  948.     CurrentStyle.bBlink = Mid(StyleString, StylePos++, 1) == "T";
  949.  
  950.     return CharCount;
  951. }
  952.  
  953. defaultproperties
  954. {
  955.                 TextColor=(R=255,G=255,B=255)
  956.                 LinkColor=(B=255)
  957.                 ALinkColor=(R=255)
  958.                 bTopCentric=True
  959.                 bAutoScrollbar=True
  960.                 bVariableRowHeight=True
  961.                 RowClass=Class'UWindow.UWindowHTMLTextRow'
  962.                 bIgnoreLDoubleClick=True
  963. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement