internal string MakeID(string str, int start, int len)
{
// Parse the string into a list of tokens
Tokenize(str, start, len);
StringBuilder sb = new StringBuilder();
foreach (var t in m_Tokens)
{
switch (t.type)
{
case TokenType.Text:
sb.Append(str, t.startOffset, t.length);
break;
case TokenType.link:
LinkInfo li = (LinkInfo)t.data;
sb.Append(li.LinkText);
break;
}
FreeToken(t);
}
// Now clean it using the same rules as pandoc
base.Reset(sb.ToString());
// Skip everything up to the first letter
while (!Eof)
{
if (Char.IsLetter(Current))
break;
SkipForward(1);
}
// Process all characters
sb.Length = 0;
while (!Eof)
{
char ch = Current;
if (char.IsLetterOrDigit(ch) || ch=='_' || ch=='-' || ch=='.')
sb.Append(Char.ToLower(ch));
else if (ch == ' ')
sb.Append("-");
else if (IsLineEnd(ch))
{
sb.Append("-");
SkipEol();
continue;
}
SkipForward(1);
}
return sb.ToString();
}