private void CheckQuote(QuotationMarkToken qmtok, OpenQuotes openQuotes)
{
GenerateTraceMsg(qmtok, string.Format(qmtok.IsOpener ?
Localize("Level {0} quote opened") : Localize("Level {0} quote closed"),
(qmtok.IsOpener ? openQuotes.Level + 1 : openQuotes.Level)));
if (m_qmCategorizer.IsMarkForLevel(qmtok.Tts.Text, openQuotes.Level + 1) && qmtok.IsOpener)
{
// The quote is opened properly
openQuotes.Level++;
openQuotes.Openers.Add(qmtok);
return;
}
else if (m_qmCategorizer.IsMarkForLevel(qmtok.Tts.Text, openQuotes.Level) &&
(!qmtok.IsOpener || m_qmCategorizer.OpeningAndClosingAreIdentical(openQuotes.Level)))
{
// The quote is closed properly
openQuotes.Level--;
openQuotes.Openers.RemoveAt(openQuotes.Level);
return;
}
int possibleQuoteMarkLevel = m_qmCategorizer.Level(qmtok.Tts.Text,
openQuotes.Level, qmtok.IsOpener);
if (m_fFoundMissingContinuer)
{
//Debug.Assert(openQuotes.Level == openQuotes.Openers.Count);
Debug.Assert(possibleQuoteMarkLevel != 0);
int newLevel = qmtok.IsOpener ? possibleQuoteMarkLevel : possibleQuoteMarkLevel - 1;
if (newLevel < openQuotes.Openers.Count)
{
while (openQuotes.Openers.Count > newLevel)
openQuotes.Openers.RemoveAt(openQuotes.Openers.Count - 1);
}
else if (newLevel > openQuotes.Openers.Count)
{
while (openQuotes.Openers.Count < newLevel)
openQuotes.Openers.Add("Missing Quote");
}
openQuotes.Level = newLevel;
if (qmtok.IsOpener)
openQuotes.Openers.Add(qmtok);
else if (openQuotes.Openers.Count > 0 && openQuotes.Openers.Count > openQuotes.Level)
openQuotes.Openers.RemoveAt(openQuotes.Level);
return;
}
else if (!m_qmCategorizer.TopLevelClosingExists && possibleQuoteMarkLevel == 1 &&
openQuotes.Level == 1)
{
// Opens a top-level quote when top-level closing quotes do not exist
openQuotes.Openers.RemoveAt(0);
openQuotes.Openers.Add(qmtok);
return;
}
else if (possibleQuoteMarkLevel > openQuotes.Level && !qmtok.IsOpener)
{
// The quote was closed, but was not opened
if (!m_qmCategorizer.CollapseAdjacentQuotes || openQuotes.MostRecent == null)
{
ReportError(qmtok, string.Format(Localize(m_noOpenerMsg),
possibleQuoteMarkLevel));
}
return;
}
else if (possibleQuoteMarkLevel > openQuotes.Level + 1 && qmtok.IsOpener)
{
// The opener for the quote belongs to a quote level that is too high
ReportError(qmtok, string.Format(
Localize("Unexpected opening mark: level {0}"),
possibleQuoteMarkLevel));
// Add missing tokens for skipped levels
while (openQuotes.Openers.Count < possibleQuoteMarkLevel - 1)
openQuotes.Openers.Add("Missing Quote");
openQuotes.Level = possibleQuoteMarkLevel;
openQuotes.Openers.Add(qmtok);
return;
}
else if (possibleQuoteMarkLevel <= openQuotes.Level && qmtok.IsOpener)
{
// Opens a quote at the level already open or at too far out a level
for (int i = openQuotes.Level; i >= possibleQuoteMarkLevel; i--)
{
if (!(openQuotes.Openers[i - 1] is QToken))
continue;
ReportError(openQuotes.Openers[i - 1] as QToken,
string.Format(m_noCloserMsg, i));
}
openQuotes.Openers.RemoveRange(possibleQuoteMarkLevel - 1,
openQuotes.Level - possibleQuoteMarkLevel + 1);
openQuotes.Level = possibleQuoteMarkLevel;
openQuotes.Openers.Add(qmtok);
return;
}
// A quote outside the current one is closed before the current one
for (int i = possibleQuoteMarkLevel; i < openQuotes.Level; i++)
{
if (!(openQuotes.Openers[i] is QToken))
continue;
ReportError(openQuotes.Openers[i] as QToken,
string.Format(m_noCloserMsg, i + 1));
}
openQuotes.Openers.RemoveRange(possibleQuoteMarkLevel - 1, openQuotes.Level - possibleQuoteMarkLevel);
openQuotes.Level = possibleQuoteMarkLevel - 1;
}
}