Fix mode detection for selections.
This commit is contained in:
parent
443a6b48e7
commit
ec8e277b85
@ -204,12 +204,12 @@ namespace zaaReloaded2
|
|||||||
Word.Selection selection = activeWindow.Selection;
|
Word.Selection selection = activeWindow.Selection;
|
||||||
Word.Paragraphs paragraphs = selection.Paragraphs;
|
Word.Paragraphs paragraphs = selection.Paragraphs;
|
||||||
Importer.IImporter importer = null;
|
Importer.IImporter importer = null;
|
||||||
|
Importer.AutoDetector autoDetector = new Importer.AutoDetector();
|
||||||
if (!(paragraphs.Count > 1
|
if (!(paragraphs.Count > 1
|
||||||
|| (selection.Text.Length > 1 && selection.Text.EndsWith("\r"))))
|
|| (selection.Text.Length > 1 && selection.Text.EndsWith("\r"))))
|
||||||
{
|
{
|
||||||
Logger.Info("DoFormat: Attempting to auto-detect");
|
Logger.Info("DoFormat: Attempting to auto-detect");
|
||||||
Word.Document doc = activeWindow.Document;
|
Word.Document doc = activeWindow.Document;
|
||||||
Importer.AutoDetector autoDetector = new Importer.AutoDetector();
|
|
||||||
if (!autoDetector.Detect(doc))
|
if (!autoDetector.Detect(doc))
|
||||||
{
|
{
|
||||||
Logger.Info("DoFormat: Automatic detection failed");
|
Logger.Info("DoFormat: Automatic detection failed");
|
||||||
@ -224,6 +224,12 @@ namespace zaaReloaded2
|
|||||||
// Bovender.ComHelpers.ReleaseComObject(doc);
|
// Bovender.ComHelpers.ReleaseComObject(doc);
|
||||||
importer = autoDetector.CreateImporter();
|
importer = autoDetector.CreateImporter();
|
||||||
}
|
}
|
||||||
|
else if (paragraphs.Count >= 1)
|
||||||
|
{
|
||||||
|
Logger.Info("DoFormat: Detecting mode of selection");
|
||||||
|
autoDetector.Detect(selection);
|
||||||
|
}
|
||||||
|
importer = autoDetector.CreateImporter();
|
||||||
|
|
||||||
Logger.Info("DoFormat: Importing");
|
Logger.Info("DoFormat: Importing");
|
||||||
importer.Import(selection.Text);
|
importer.Import(selection.Text);
|
||||||
|
@ -52,56 +52,29 @@ namespace zaaReloaded2.Importer
|
|||||||
"Automatic laboratory detection requires a document.");
|
"Automatic laboratory detection requires a document.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Try to make this algorithm more elegant.
|
int startParagraph = 1;
|
||||||
Paragraph start = null;
|
|
||||||
Paragraph end = null;
|
|
||||||
int i = 1;
|
|
||||||
|
|
||||||
if (document.Bookmarks.Exists("Labor"))
|
if (document.Bookmarks.Exists("Labor"))
|
||||||
{
|
{
|
||||||
Logger.Info("Detect: Found lab bookmark");
|
Logger.Info("Detect: Found lab bookmark");
|
||||||
i = GetParagraphIndex(
|
startParagraph = GetParagraphIndex(
|
||||||
document,
|
document,
|
||||||
document.Bookmarks["Labor"].Range.Paragraphs[1]);
|
document.Bookmarks["Labor"].Range.Paragraphs[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (i <= document.Paragraphs.Count)
|
return DetectRange(document, startParagraph, document.Paragraphs.Count);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Detect(Selection selection)
|
||||||
|
{
|
||||||
|
if (selection == null)
|
||||||
{
|
{
|
||||||
// Expect the first paragraph of a Lauris block to be
|
throw new ArgumentNullException(
|
||||||
// a time stamp. This prevents erroneous detection of
|
"Automatic laboratory detection requires a selection.");
|
||||||
// lines such as "Tel. (09 31) 201-39432; -39126", which
|
|
||||||
// happen to structurally resemble a paragraph with
|
|
||||||
// laboratory items.
|
|
||||||
if (IsTimeStampParagraph(document.Paragraphs[i]))
|
|
||||||
{
|
|
||||||
start = document.Paragraphs[i];
|
|
||||||
Logger.Info("Detect: Found time stamp line in paragraph #{0}", i);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (start != null)
|
return DetectRange(selection.Document,
|
||||||
{
|
GetParagraphIndex(selection.Document, selection.Paragraphs.First),
|
||||||
Logger.Info("Detect: Determining lab block");
|
GetParagraphIndex(selection.Document, selection.Paragraphs.Last) + 1);
|
||||||
end = start;
|
|
||||||
while (i <= document.Paragraphs.Count - 1)
|
|
||||||
{
|
|
||||||
Paragraph p = document.Paragraphs[i+1];
|
|
||||||
if (!IsLabParagraph(p) && !IsEmptyParagraph(p))
|
|
||||||
{
|
|
||||||
Logger.Info("Detect: Last lab paragraph is #{0}", i);
|
|
||||||
end = document.Paragraphs[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
document.Range(start.Range.Start, end.Range.End).Select();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
Logger.Warn("Detect: Did not find lab block!");
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public IImporter CreateImporter()
|
public IImporter CreateImporter()
|
||||||
@ -121,6 +94,79 @@ namespace zaaReloaded2.Importer
|
|||||||
|
|
||||||
#region Private methods
|
#region Private methods
|
||||||
|
|
||||||
|
private bool DetectRange(Document document, int startParagraph, int endParagraph)
|
||||||
|
{
|
||||||
|
if (document == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(
|
||||||
|
"Automatic laboratory detection requires a document.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startParagraph < 1 || startParagraph > document.Paragraphs.Count)
|
||||||
|
{
|
||||||
|
Logger.Fatal("Start paragraph index must be between {0} and {1}, was {2}!",
|
||||||
|
1, document.Paragraphs.Count, startParagraph);
|
||||||
|
throw new ArgumentOutOfRangeException("startParagraph");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (endParagraph < startParagraph || endParagraph > document.Paragraphs.Count)
|
||||||
|
{
|
||||||
|
Logger.Fatal("End paragraph index must be between {0} and {1}, was {2}!",
|
||||||
|
startParagraph, document.Paragraphs.Count, endParagraph);
|
||||||
|
throw new ArgumentOutOfRangeException("endParagraph");
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger.Info("DetectRange: Start paragraph is #{0}, end is #{1}, document has #{2} paragraphs",
|
||||||
|
startParagraph, endParagraph, document.Paragraphs.Count);
|
||||||
|
|
||||||
|
// TODO: Try to make this algorithm more elegant.
|
||||||
|
Paragraph start = null;
|
||||||
|
Paragraph end = null;
|
||||||
|
int i = startParagraph;
|
||||||
|
|
||||||
|
while (i <= endParagraph)
|
||||||
|
{
|
||||||
|
// Expect the first paragraph of a Lauris block to be
|
||||||
|
// a time stamp. This prevents erroneous detection of
|
||||||
|
// lines such as "Tel. (09 31) 201-39432; -39126", which
|
||||||
|
// happen to structurally resemble a paragraph with
|
||||||
|
// laboratory items.
|
||||||
|
if (IsTimeStampParagraph(document.Paragraphs[i]))
|
||||||
|
{
|
||||||
|
start = document.Paragraphs[i];
|
||||||
|
Logger.Info("DetectRange: Found time stamp line in paragraph #{0}", i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (start != null)
|
||||||
|
{
|
||||||
|
Logger.Info("DetectRange: Determining lab block");
|
||||||
|
while (i <= endParagraph - 1)
|
||||||
|
{
|
||||||
|
Paragraph p = document.Paragraphs[i + 1];
|
||||||
|
if (!IsLabParagraph(p) && !IsEmptyParagraph(p))
|
||||||
|
{
|
||||||
|
Logger.Info("Detect: Last lab paragraph is #{0}", i);
|
||||||
|
end = document.Paragraphs[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (end == null)
|
||||||
|
{
|
||||||
|
end = document.Paragraphs[endParagraph];
|
||||||
|
}
|
||||||
|
|
||||||
|
document.Range(start.Range.Start, end.Range.End).Select();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
Logger.Warn("DetectRange: Did not find lab block!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns true if a paragraph is a time stamp line.
|
/// Returns true if a paragraph is a time stamp line.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
Loading…
Reference in New Issue
Block a user