e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
177 lines
6.4 KiB
C#
177 lines
6.4 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="CompileLiteralTextParser.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
//------------------------------------------------------------------------------
|
|
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Specialized;
|
|
using System.Diagnostics;
|
|
using System.Web.UI;
|
|
|
|
namespace System.Web.UI.MobileControls
|
|
{
|
|
/*
|
|
* CompileLiteralTextParser class.
|
|
*
|
|
* This is a specialized version of the LiteralTextParser class.
|
|
* It creates a set of control builders from the parsed literal text.
|
|
*
|
|
* Copyright (c) 2000 Microsoft Corporation
|
|
*/
|
|
|
|
[Obsolete("The System.Web.Mobile.dll assembly has been deprecated and should no longer be used. For information about how to develop ASP.NET mobile applications, see http://go.microsoft.com/fwlink/?LinkId=157231.")]
|
|
internal class CompileLiteralTextParser : LiteralTextParser
|
|
{
|
|
TemplateParser _parser;
|
|
ControlBuilder _parentBuilder;
|
|
String _fileName;
|
|
int _lineNumber;
|
|
IList _tagInnerTextElements = null;
|
|
|
|
internal CompileLiteralTextParser(TemplateParser parser,
|
|
ControlBuilder parentBuilder,
|
|
String fileName,
|
|
int lineNumber)
|
|
{
|
|
_parser = parser;
|
|
_parentBuilder = parentBuilder;
|
|
_fileName = fileName;
|
|
_lineNumber = lineNumber;
|
|
}
|
|
|
|
protected override void ProcessElement(LiteralElement element)
|
|
{
|
|
ControlBuilder subBuilder;
|
|
|
|
switch (element.Type)
|
|
{
|
|
case LiteralElementType.Text:
|
|
Debug.Assert(_tagInnerTextElements == null);
|
|
subBuilder = ControlBuilder.CreateBuilderFromType(
|
|
_parser, _parentBuilder,
|
|
typeof(LiteralText), typeof(LiteralText).Name,
|
|
null,
|
|
GetPropertyDictionary(element.Format, element.BreakAfter, null),
|
|
_lineNumber, _fileName);
|
|
break;
|
|
|
|
case LiteralElementType.Anchor:
|
|
{
|
|
String linkUrl = (String)element.GetAttribute("href");
|
|
subBuilder = ControlBuilder.CreateBuilderFromType(
|
|
_parser, _parentBuilder,
|
|
typeof(LiteralLink), typeof(LiteralLink).Name,
|
|
null,
|
|
GetPropertyDictionary(element.Format, element.BreakAfter, linkUrl),
|
|
_lineNumber, _fileName);
|
|
AddTagInnerTextElements(subBuilder);
|
|
break;
|
|
}
|
|
|
|
default:
|
|
return;
|
|
}
|
|
|
|
_parentBuilder.AppendSubBuilder(subBuilder);
|
|
|
|
if (element.Text == null || element.Text.Length != 0)
|
|
{
|
|
subBuilder.AppendLiteralString(element.Text);
|
|
}
|
|
}
|
|
|
|
private IList TagInnerTextElements
|
|
{
|
|
get
|
|
{
|
|
if (_tagInnerTextElements == null)
|
|
{
|
|
_tagInnerTextElements = new ArrayList();
|
|
}
|
|
return _tagInnerTextElements;
|
|
}
|
|
}
|
|
|
|
private void AddTagInnerTextElements(ControlBuilder builder)
|
|
{
|
|
if (_tagInnerTextElements != null)
|
|
{
|
|
foreach(Object o in _tagInnerTextElements)
|
|
{
|
|
if (o is String)
|
|
{
|
|
builder.AppendLiteralString((String)o);
|
|
}
|
|
else
|
|
{
|
|
builder.AppendSubBuilder((ControlBuilder)o);
|
|
}
|
|
}
|
|
_tagInnerTextElements = null;
|
|
}
|
|
}
|
|
|
|
protected override void ProcessTagInnerText(String text)
|
|
{
|
|
// Called to add an inner text segment of a multi-segment tag, e.g.
|
|
// <a ...>some text <%# a databinding %> some more text</a>
|
|
|
|
TagInnerTextElements.Add(text);
|
|
}
|
|
|
|
internal /*public*/ void AddDataBinding(ControlBuilder builder)
|
|
{
|
|
if (IsInTag)
|
|
{
|
|
TagInnerTextElements.Add(builder);
|
|
}
|
|
else
|
|
{
|
|
ControlBuilder newBuilder = ControlBuilder.CreateBuilderFromType(
|
|
_parser, _parentBuilder,
|
|
typeof(LiteralText), typeof(LiteralText).Name,
|
|
null,
|
|
GetPropertyDictionary(CurrentFormat, false, null),
|
|
_lineNumber, _fileName);
|
|
_parentBuilder.AppendSubBuilder(newBuilder);
|
|
newBuilder.AppendSubBuilder(builder);
|
|
OnAfterDataBoundLiteral();
|
|
}
|
|
}
|
|
|
|
// Convert formatting and other options into a set of properties, just as if they had been
|
|
// specified in persistence format.
|
|
|
|
private ListDictionary GetPropertyDictionary(LiteralFormat format, bool breakAfter, String linkUrl)
|
|
{
|
|
ListDictionary dictionary = null;
|
|
if (format != LiteralFormat.None || !breakAfter || linkUrl != null)
|
|
{
|
|
dictionary = new ListDictionary();
|
|
if ((format & LiteralFormat.Bold) == LiteralFormat.Bold)
|
|
{
|
|
dictionary.Add("Font-Bold", "True");
|
|
}
|
|
if ((format & LiteralFormat.Italic) == LiteralFormat.Italic)
|
|
{
|
|
dictionary.Add("Font-Italic", "True");
|
|
}
|
|
if(!breakAfter)
|
|
{
|
|
dictionary.Add("BreakAfter", "False");
|
|
}
|
|
if (linkUrl != null)
|
|
{
|
|
dictionary.Add("NavigateUrl", linkUrl);
|
|
}
|
|
}
|
|
|
|
return dictionary;
|
|
}
|
|
}
|
|
|
|
}
|
|
|