/// <summary> /// Breaks a word at its max value. /// </summary> private void LayoutElements_BreakWordAtLineEnd(List <AElement> elements, int start, int lineWidth, List <AElement> word, int wordWidth, int styleWidth) { CharacterElement lineend = new Elements.CharacterElement(word[0].Style, '\n'); int width = lineend.Width + styleWidth + 2; for (int i = 0; i < word.Count; i++) { width += word[i].Width; if (width >= lineWidth) { elements.Insert(start + i, lineend); // start + i + 1 return; } } }
/// <summary> /// Breaks a word at its max value. /// </summary> private void LayoutElements_BreakWordAtLineEnd(List<AElement> elements, int start, int lineWidth, List<AElement> word, int wordWidth, int styleWidth) { CharacterElement lineend = new Elements.CharacterElement(word[0].Style, '\n'); int width = lineend.Width + styleWidth + 2; for (int i = 0; i < word.Count; i++) { width += word[i].Width; if (width >= lineWidth) { elements.Insert(start + i + 1, lineend); return; } } }
private BlockElement ParseHtmlToBlocks(string html) { IResourceProvider provider = ServiceRegistry.GetService<IResourceProvider>(); StyleParser styles = new StyleParser(provider); BlockElement root, currentBlock; root = currentBlock = new BlockElement("root", styles.Style); // this is the root! // if this is not HTML, do not parse tags. Otherwise search out and interpret tags. bool parseHTML = true; if (!parseHTML) { for (int i = 0; i < html.Length; i++) currentBlock.AddAtom(new CharacterElement(styles.Style, html[i])); } else { if (m_Parser == null) m_Parser = new HTMLparser(); m_Parser.Init(html); HTMLchunk chunk; while ((chunk = ParseNext(m_Parser)) != null) { if (!(chunk.oHTML == string.Empty)) { // This is a span of text. string text = chunk.oHTML; // make sure to replace escape characters! text = EscapeCharacters.ReplaceEscapeCharacters(text); //Add the characters to the current box for (int i = 0; i < text.Length; i++) currentBlock.AddAtom(new CharacterElement(styles.Style, text[i])); } else { // This is a tag. interpret the tag and edit the openTags list. // It may also be an atom, in which case we should add it to the list of atoms! AElement atom = null; if (chunk.bClosure && !chunk.bEndClosure) { styles.CloseOneTag(chunk); if (currentBlock.Tag == chunk.sTag) { currentBlock = currentBlock.Parent; } } else { bool isBlockTag = false; switch (chunk.sTag) { // ====================================================================== // Anchor elements are added to the open tag collection as HREFs. // ====================================================================== case "a": styles.InterpretHREF(chunk, null); break; // ====================================================================== // These html elements are ignored. // ====================================================================== case "body": break; // ====================================================================== // These html elements are blocks but can also have styles // ====================================================================== case "center": case "left": case "right": case "div": atom = new BlockElement(chunk.sTag, styles.Style); styles.ParseTag(chunk, atom); isBlockTag = true; break; // ====================================================================== // These html elements are styles, and are added to the StyleParser. // ====================================================================== case "span": case "font": case "b": case "i": case "u": case "outline": case "big": case "basefont": case "medium": case "small": styles.ParseTag(chunk, null); break; // ====================================================================== // These html elements are added as atoms only. They cannot impart style // onto other atoms. // ====================================================================== case "br": atom = new CharacterElement(styles.Style, '\n'); break; case "gumpimg": // draw a gump image atom = new ImageElement(styles.Style, ImageElement.ImageTypes.UI); styles.ParseTag(chunk, atom); break; case "itemimg": // draw a static image atom = new ImageElement(styles.Style, ImageElement.ImageTypes.Item); styles.ParseTag(chunk, atom); break; // ====================================================================== // Every other element is not interpreted, but rendered as text. Easy! // ====================================================================== default: { string text = html.Substring(chunk.iChunkOffset, chunk.iChunkLength); // make sure to replace escape characters! text = EscapeCharacters.ReplaceEscapeCharacters(text); //Add the characters to the current box for (int i = 0; i < text.Length; i++) currentBlock.AddAtom(new CharacterElement(styles.Style, text[i])); } break; } if (atom != null) { currentBlock.AddAtom(atom); if (isBlockTag && !chunk.bEndClosure) currentBlock = (BlockElement)atom; } styles.CloseAnySoloTags(); } } } } return root; }