Implement lab data autodetection.

- NEU: Wenn kein Text markiert ist, wird ein Versuch unternommen, die Labordaten im Arztbrief automatisch zu erkennen; dabei wird der erste erkannte Lauris-Laborblock formatiert.
This commit is contained in:
Daniel Kraus 2015-09-03 21:47:21 +02:00
parent e366226a64
commit 2ca7f4211d
4 changed files with 114 additions and 73 deletions

View File

@ -1,65 +0,0 @@
/* AutoDetect.cs
* part of zaaReloaded2
*
* Copyright 2015 Daniel Kraus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace zaaReloaded2
{
class AutoDetect
{
/// <summary>
/// Attempts to automatically detect laboratory data in the Word
/// document.
/// </summary>
public void AutoDetect()
{
if (Document == null)
{
throw new InvalidOperationException(
"Automatic laboratory detection requires a document.");
}
// If the 'Labor' bookmark exists, go to it.
if (Document.Bookmarks.Exists("Labor"))
{
Document.Bookmarks["Labor"].Range.Collapse(WdCollapseDirection.wdCollapseStart);
}
// If the current paragraph looks like a Lauris paragraph, fine.
// If it does not look like a Lauris paragraph, move the cursor
// up until we find one.
string s = Document.ActiveWindow.Selection.Paragraphs[1].Range.Text;
// If we found a Lauris paragraph by moving up, start extending the
// selection upwards until we encounter a paragraph that is not a
// Lauris paragraph.
// If we have previously reached the start of the document without finding
// a Lauris paragraph, go back to where we started and move the
// cursor down paragraph by paragraph until we find a Lauris
// paragraph.
// If we found a Lauris paragraph by moving down, start extending the
// selection downwards until we encounter a paragraph that is not a
// Lauris paragraph.
}
}
}

View File

@ -0,0 +1,91 @@
using Microsoft.Office.Interop.Word;
/* AutoDetect.cs
* part of zaaReloaded2
*
* Copyright 2015 Daniel Kraus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace zaaReloaded2.Importer.ZaaImporter
{
static class AutoDetect
{
/// <summary>
/// Attempts to automatically detect laboratory data in the Word
/// document.
/// </summary>
/// <param name="document">Document which to parse for laboratory
/// data.</param>
/// <returns>True if laboratory data was detected, false if not.</returns>
/// <exception cref="ArgumentNullException">if <paramref name="document"/>
/// is null.</exception>
public static bool Detect(Document document)
{
if (document == null)
{
throw new ArgumentNullException(
"Automatic laboratory detection requires a document.");
}
// TODO: Try to make this algorithm more elegant.
Paragraph start = null;
Paragraph end = null;
int i = 1;
while (i <= document.Paragraphs.Count)
{
if (IsLabParagraph(document.Paragraphs[i]))
{
start = document.Paragraphs[i];
break;
}
i++;
}
if (start != null)
{
end = start;
while (i <= document.Paragraphs.Count - 1)
{
if (!IsLabParagraph(document.Paragraphs[i+1]))
{
end = document.Paragraphs[i];
break;
}
i++;
}
document.Range(start.Range.Start, end.Range.End).Select();
return true;
}
return false;
}
/// <summary>
/// Returns true if a paragraph is either a time stamp line
/// or a paragraph with laboratory items.
/// </summary>
/// <param name="paragraph"></param>
/// <returns></returns>
private static bool IsLabParagraph(Paragraph paragraph)
{
string text = paragraph.Range.Text;
return (LaurisParagraph.ResemblesLaurisParagraph(text)
|| LaurisTimePoint.IsTimeStampLine(text));
}
}
}

View File

@ -16,12 +16,9 @@
* limitations under the License. * limitations under the License.
*/ */
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq;
using System.Reflection; using System.Reflection;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text;
using System.Windows; using System.Windows;
using System.Drawing; using System.Drawing;
using System.Windows.Resources; using System.Windows.Resources;
@ -33,7 +30,6 @@ using zaaReloaded2.Formatter;
using zaaReloaded2.Controller; using zaaReloaded2.Controller;
using Word = Microsoft.Office.Interop.Word; using Word = Microsoft.Office.Interop.Word;
using Bovender.Mvvm.Actions; using Bovender.Mvvm.Actions;
using Bovender.Mvvm.Messaging;
// TODO: Follow these steps to enable the Ribbon (XML) item: // TODO: Follow these steps to enable the Ribbon (XML) item:
@ -166,9 +162,10 @@ namespace zaaReloaded2
/// </remarks> /// </remarks>
public bool CanFormat(Office.IRibbonControl control) public bool CanFormat(Office.IRibbonControl control)
{ {
Word.Selection s = Globals.ThisAddIn.Application.ActiveWindow.Selection; return Globals.ThisAddIn.Application.ActiveDocument != null;
return s.Paragraphs.Count > 1 || //Word.Selection s = Globals.ThisAddIn.Application.ActiveWindow.Selection;
(s.Text.Length > 1 && s.Text.EndsWith("\r")); //return s.Paragraphs.Count > 1 ||
// (s.Text.Length > 1 && s.Text.EndsWith("\r"));
} }
#endregion #endregion
@ -177,6 +174,24 @@ namespace zaaReloaded2
void DoFormat() void DoFormat()
{ {
// If no "real" selection exists, attempt to auto-detect the lab data.
// (NB Technically, there is never _no_ selection in a document.)
Word.Window activeWindow = Globals.ThisAddIn.Application.ActiveWindow;
Word.Selection sel = activeWindow.Selection;
if (!(sel.Paragraphs.Count > 1
|| (sel.Text.Length > 1 && sel.Text.EndsWith("\r"))))
{
if (!AutoDetect.Detect(activeWindow.Document))
{
NotificationAction a = new NotificationAction();
a.Caption = "Formatieren nicht möglich";
a.Message = "Das Dokument scheint keine Lauris-Labordaten zu enthalten.";
a.OkButtonLabel = "Schließen";
a.Invoke();
return;
}
}
if (CanFormat(null)) if (CanFormat(null))
{ {
SettingsRepository repository = SettingsRepository.Load(); SettingsRepository repository = SettingsRepository.Load();

View File

@ -192,7 +192,7 @@
can be found. can be found.
--> -->
<ItemGroup> <ItemGroup>
<Compile Include="AutoDetect.cs" /> <Compile Include="Importer\ZaaImporter\AutoDetect.cs" />
<Compile Include="Controller\Elements\ControlElementBase.cs" /> <Compile Include="Controller\Elements\ControlElementBase.cs" />
<Compile Include="Controller\Elements\FormatElementBase.cs" /> <Compile Include="Controller\Elements\FormatElementBase.cs" />
<Compile Include="Controller\Elements\NextColumn.cs" /> <Compile Include="Controller\Elements\NextColumn.cs" />