Hi,
im Moment arbeite_ ich an einen neuen Parser für den HtmlRenderer(siehe ShowRoom).
Folgende Methode extrahiert_ die einzelnen Tags und ihre Inhalte:
Spoiler anzeigen
Wenn ein Tag keinen korrespondierenden End-Tag hat wird das Parsen des Contents übersprungen.
Damit jedoch die Prozedur kontinuieren kann, müssen folgende Werte gesetzt werden:
_Begin = false;
i = -1;
beginTag = "";
attribute = "";
_Attribute = false;
Und genau diese Region kann über die Sprungmarke "reset" erreicht werden, siehe dazu:
goto-Statement hier elegant?
Ist das elegant, oder doch lieber eine inLine-Methode?
Lieben Dank.
*Topic verschoben*
im Moment arbeite_ ich an einen neuen Parser für den HtmlRenderer(siehe ShowRoom).
Folgende Methode extrahiert_ die einzelnen Tags und ihre Inhalte:
C#-Quellcode
- private static void _Format(string BeginTag, ref string Content)
- {
- int _AppearanceCounter = 0;
- int n0 = BeginTag.Length + 1;
- int n1 = BeginTag.Length + 2;
- for (int i = 0; i < Content.Length; i++)
- {
- string sub0 = "";
- string sub1 = "";
- if (i + n0 >= Content.Length)
- sub0 = Content.Substring(i, Content.Length - i);
- else sub0 = Content.Substring(i, n0);
- if (sub0.Equals("<" + BeginTag))
- {
- _AppearanceCounter++;
- if (_AppearanceCounter == 1)
- Content = Content.Insert(i + n0, (_AppearanceCounter - 1) + "");
- }
- if (i + n1 >= Content.Length)
- sub1 = Content.Substring(i, Content.Length - i);
- else sub1 = Content.Substring(i, n1);
- if (sub1.Equals("</" + BeginTag))
- {
- _AppearanceCounter--;
- if (_AppearanceCounter == 0)
- {
- Content = Content.Insert(i + n1, (_AppearanceCounter) + "");
- return;
- }
- }
- }
- }
- public static HtmlTag[] GetTags(string Content)
- {
- string beginTag = "";
- string endTag = "";
- string attribute = "";
- List<HtmlTag> _Tags = new List<HtmlTag>();
- bool _Begin = false;
- bool _Attribute = false;
- for (int i = 0; i < Content.Length; i++)
- {
- char c = Content[i];
- switch (_Begin)
- {
- case true:
- if (c == '>')
- {
- if (Program.Tags.Contains(beginTag))
- endTag = beginTag;
- HtmlTag tag = new HtmlTag()
- {
- BeginTag = beginTag,
- EndTag = endTag,
- Attribute = attribute
- };
- _Tags.Add(tag);
- if (string.IsNullOrEmpty(endTag))
- {
- Content = Content.Replace("<" + beginTag + ">", "");
- goto reset;
- }
- #region WithEndTag
- string _begin = "<" + beginTag + "0" + attribute + ">";
- string _end = "</" + endTag + "0>";
- _Format(beginTag, ref Content);
- tag.Content = Content.Substring(Content.IndexOf(_begin) + _begin.Length, Content.IndexOf(_end) - i - 2);
- Content = Content.Replace(_begin + tag.Content + _end, "");
- #endregion
- reset:
- #region Reset
- _Begin = false;
- i = -1;
- beginTag = "";
- attribute = "";
- _Attribute = false;
- #endregion
- continue;
- }
- if (c == ' ')
- {
- _Attribute = true;
- }
- if (!_Attribute)
- beginTag += c;
- else attribute += c;
- break;
- case false:
- if (c == '<')
- {
- _Begin = true;
- }
- break;
- }
- }
- return _Tags.ToArray();
- }
Wenn ein Tag keinen korrespondierenden End-Tag hat wird das Parsen des Contents übersprungen.
Damit jedoch die Prozedur kontinuieren kann, müssen folgende Werte gesetzt werden:
_Begin = false;
i = -1;
beginTag = "";
attribute = "";
_Attribute = false;
Und genau diese Region kann über die Sprungmarke "reset" erreicht werden, siehe dazu:
goto-Statement hier elegant?
Ist das elegant, oder doch lieber eine inLine-Methode?
Lieben Dank.
*Topic verschoben*
Und Gott alleine weiß alles am allerbesten und besser.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()