Diversity workbench
Keywords
Keywords in Hugo
Die Schlüsselwörter werden zum Test in der Datei keywords_ori_dwb erfasst und dann angepasst in die Datei keywords_dwb kopiert. Hugo übersetzt die dort angegebenen Adressen. Ein Service auf dem Apacheserver übersetzt dies dann in eine Datei keywords.txt mit Paaren aus Schlüsselwort und dem zugehörigen Link. Dies wird dann als Service zur Verfügung gestellt und kann von den Applikationen benutzt werden.
Keywords in den Applikationen
- die Formulare benötigen einen Helpprovider
- die Keywords werden als Property vermittelt durch den Helpprovider direkt beim Formular oder in den controls eingetragen
Event handler
Bei der ersten Verwendung von F1 in einem Formular werden durch den KeyDown-Handler des Formulars das Formular und die enthaltenen Controls sofern ein Keyword eingetragen wurde mit einem Eventhandler versorgt die dann für den Aufruf des Manuals sorgen.
Da die Funktion erst beim KeyDown im Formular gestartet wird und asynchron ist bremst sie den Start der Applikationen nicht.
aktuelle Probleme:
- Beim allerersten Aufruf des Manuals wird auch die Hauptseite für das Formular geöffnet sofern dort ein Keyword hinterlegt ist
Beispiel für Umsetzung anhand DiversityCollection_GUC_8 im Formular FormArtCode:
Code im Formular
in the constructor or in the properties of the form
this.KeyPreview = true;
im Code
link the KeyDown event of the form to the Form_KeyDown event
#region Manual
/// <summary>
/// Adding event deletates to form and controls
/// </summary>
/// <returns></returns>
private async Task InitManual()
{
try
{
DiversityWorkbench.DwbManual.Hugo manual = new Hugo(this.helpProvider, this);
if (manual != null)
{
await manual.addKeyDownF1ToForm();
}
}
catch (Exception ex) { DiversityWorkbench.ExceptionHandling.WriteToErrorLogFile(ex); }
}
/// <summary>
/// ensure that init is only done once
/// </summary>
private bool _InitManualDone = false;
/// <summary>
/// KeyDown of the form adding event deletates to form and controls within the form
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void Form_KeyDown(object sender, KeyEventArgs e)
{
try
{
if (!_InitManualDone)
{
await this.InitManual();
_InitManualDone = true;
}
}
catch (Exception ex) { MessageBox.Show(ex.Message); }
}
#endregion
Zentraler code in e.g. Klasse Manual
#region Adding functions
/// <summary>
/// If the control contains a keyword related to the helpprovider of the form
/// </summary>
/// <param name="control"></param>
/// <param name="helpProvider"></param>
/// <returns></returns>
private bool IsControlLinkedToHelpKeyword(Control control, HelpProvider helpProvider)
{
string helpKeyword = helpProvider.GetHelpKeyword(control);
return !string.IsNullOrEmpty(helpKeyword);
}
/// <summary>
/// If the form contains a keyword related to the helpprovider
/// </summary>
/// <param name="form"></param>
/// <param name="helpProvider"></param>
/// <returns></returns>
private bool IsFormLinkedToHelpKeyword(Form form, HelpProvider helpProvider)
{
string helpKeyword = helpProvider.GetHelpKeyword(form);
return !string.IsNullOrEmpty(helpKeyword);
}
/// <summary>
/// Constructor
/// </summary>
/// <param name="helpProvider">The helpprovider of the form</param>
/// <param name="form">The form where the event handlers should be added</param>
public Manual(HelpProvider helpProvider, Form form)
{
_helpProvider = helpProvider;
_form = form;
}
/// <summary>
/// HelpProvider of the form
/// </summary>
private HelpProvider _helpProvider;
/// <summary>
/// the form containing the HelpProvider
/// </summary>
private System.Windows.Forms.Form _form;
/// <summary>
/// adding the event delegates to form and controls
/// </summary>
/// <returns></returns>
public async Task addKeyDownF1ToForm()
{
try
{
if (_form != null && _helpProvider != null)
{
if (IsFormLinkedToHelpKeyword((Form)_form, _helpProvider))
{
_form.KeyUp += new KeyEventHandler(form_KeyDown);
}
foreach (System.Windows.Forms.Control C in _form.Controls)
{
await addKeyDownF1ToControls(C);
}
}
}
catch (Exception ex) { MessageBox.Show(ex.Message); }
}
/// <summary>
/// Adding Event delegates to the controls
/// </summary>
/// <param name="Cont">the control to which the delegate should be added it a keyword is present</param>
/// <returns></returns>
private async Task addKeyDownF1ToControls(System.Windows.Forms.Control Cont)
{
try
{
foreach (System.Windows.Forms.Control C in Cont.Controls)
{
if (IsControlLinkedToHelpKeyword(C, _helpProvider))
{
C.KeyDown += new KeyEventHandler(control_KeyDown);
}
await addKeyDownF1ToControls(C);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
/// <summary>
/// Opening the manual if F1 is pressed within the form
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void form_KeyDown(object sender, KeyEventArgs e)
{
try
{
if (!e.Handled && e.KeyCode == Keys.F1)
{
string Keyword = _helpProvider.GetHelpKeyword(_form);
OpenManual(Keyword);
}
}
catch (Exception ex) { MessageBox.Show(ex.Message); }
}
/// <summary>
/// Opening the manual if F1 is pressed within the control
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void control_KeyDown(object sender, KeyEventArgs e)
{
try
{
if (e.KeyCode == Keys.F1)
{
string Keyword = _helpProvider.GetHelpKeyword((System.Windows.Forms.Control)sender);
OpenManual(Keyword);
e.Handled = true;
}
}
catch (Exception ex) { MessageBox.Show(ex.Message); }
}
#endregion
zentrale Funktionen
- holen keyword Verzeichnis via HtmlAgilityPack
- öffnen Webseite anhand von Keyword
vorerst mit HtmlAgilityPack gelöst. Service hierzu kommt noch
#region HtmlAgilityPack
/// <summary>
/// Prefix for websites
/// </summary>
private static readonly string HugoManualUrlPrefix = "https://www.diversityworkbench.de";
/// <summary>
/// The URL of the site containing the keywords
/// </summary>
private static readonly string _UrlForKeywords = "https://www.diversityworkbench.de/manual/dwb_latest/diversityworkbench/keywords_dwb/index.html";
private static Dictionary<string, string> _KeywordsFromHugo;
/// <summary>
/// The dictionary of the keyword/Links scraped from the website in the Hugo manual
/// </summary>
private static Dictionary<string, string> KeywordsFromHugo
{
get
{
if (_KeywordsFromHugo == null)
{
HtmlWeb HtmlWeb = new HtmlWeb();
HtmlAgilityPack.HtmlDocument htmlDocument = HtmlWeb.Load(_UrlForKeywords);
var Links = htmlDocument.DocumentNode.SelectNodes("//html//body//div//main//div//article//ul//a");
if (Links != null)
{
_KeywordsFromHugo = new Dictionary<string, string>();
foreach (var Link in Links)
{
string Key = Link.InnerText;
string URL = HugoManualUrlPrefix + Link.GetAttributeValue("href", string.Empty);
if (Key != null && Key.Length > 0 &&
URL != null && URL.Length > 0 &&
!_KeywordsFromHugo.ContainsKey(Key))
{
_KeywordsFromHugo.Add(Key, URL);
}
}
}
}
return _KeywordsFromHugo;
}
}
/// <summary>
/// Open a manual site
/// </summary>
/// <param name="keyword">The keyword linked to the site in the manual</param>
public void OpenHugoManual(string keyword)
{
if (KeywordsFromHugo == null) { return; }
if (KeywordsFromHugo.ContainsKey(keyword))
{
string Link = DiversityCollection_GUC.Hugo.Manual.KeywordsFromHugo[keyword];
try
{
if (Link.Length > 0)
{
Process.Start(new ProcessStartInfo
{
FileName = Link,
UseShellExecute = true
});
}
}
catch (Exception ex) { MessageBox.Show("Error opening URL: " + ex.Message); }
}
}
#endregion
graph TD; Start[Open form] Handler["Creation of handlers"] Manual[Open the manual] F1[Click F1 in form or control] Scrape[Using the<br>***HtmlAgilityPack***<br>to scrape the dictionary<br>for the keywords<br>from the<br>Hugo keyword site<br>at first call] Key[Use keyword to get link] Start --> | using F1 in the form for the first time | Handler Handler --> Scrape F1 --> Scrape Scrape --> Key Key --> Manual
Alternative nicht verwendete Optionen
Im frontmatter der Seiten können für einzelne Kapitel Schlüsselwörter hinterlegt werden:
---
title: ...
linktitle: ...
keywords:
- Nachweis_GUC
- Fundort_GUC
---
Was wir benötigen ist ein Schlüsselwort in der Applikation und dazu ein Link zum Manual. Aus den CHM Dateien lassen sich die bereits jetzt vorhandenen Schlüssel extrahieren (Außer den von Wolfgang umgebauten Modulen DSP und DG).
Eine Alternative zum manuellen Aufbau wäre ein Scan aller vorhandenen Seiten und die Extraktion der verwendeten Links.
Options
Links in manual
Examlpe for GUC
damit werden automatisch die korrekten Links im html erzeugt und könnten dann extrahiert werden
Aktuellen Liste: keywords_dwb
Links extracted from chm from DA
Contact_DA modules/diversitycollection/Contact_DA Agent_DA modules/diversitycollection/Agent_DA Archive_DA modules/diversitycollection/Archive_DA Backup_DA modules/diversitycollection/Backup_DA Contact_DA modules/diversitycollection/Contact_DA DataWithholding_DA modules/diversitycollection/DataWithholding_DA AgentDisplayTypes_DA modules/diversitycollection/AgentDisplayTypes_DA Descriptors_DA modules/diversitycollection/Descriptors_DA ExternalData_DA modules/diversitycollection/ExternalData_DA Feedback_DA modules/diversitycollection/Feedback_DA Hierarchy_DA modules/diversitycollection/Hierarchy_DA History_DA modules/diversitycollection/History_DA Images_DA modules/diversitycollection/Images_DA …
hier müssen die Links noch angepasst werden. Insofern noch nicht wirklich brauchbar