Skip to content

Commit

Permalink
nuget package
Browse files Browse the repository at this point in the history
  • Loading branch information
FolkerKinzel committed Jan 28, 2025
1 parent a05a59a commit 7c4ade5
Show file tree
Hide file tree
Showing 212 changed files with 26,491 additions and 8 deletions.
32 changes: 32 additions & 0 deletions docs/reference/GeneralError.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="shortcut icon" href="icons/favicon.ico" />
<link rel="stylesheet" href="css/bulma.css" />
<link rel="stylesheet" href="css/font-awesome.min.css" />
<link rel="stylesheet" href="css/presentationStyle.css" />
<script src="scripts/jquery-3.5.1.min.js"></script>
<script src="scripts/presentationStyle.js"></script>
<title>FolkerKinzel.CsvTools - General Error</title>
</head>

<body>
<section id="MainSection" class="section p-0">
<div class="pageHeader level mb-2 pt-2 pb-2 pl-5 pr-5">
<div id="TitleContainer" class="level-left">
<div id="DocumentationTitle" class="level-item">
FolkerKinzel.CsvTools - General Error
</div>
</div>
</div>
</section>

<div id="TopicContent" class="column content is-7">
<h1>We're sorry, a general error has occurred.</h1>
<p>Please try to load the page again. If the error persists, please contact the site administrator.</p>
</div>
</body>

</html>
34 changes: 34 additions & 0 deletions docs/reference/PageNotFound.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="shortcut icon" href="icons/favicon.ico" />
<link rel="stylesheet" href="css/bulma.css" />
<link rel="stylesheet" href="css/font-awesome.min.css" />
<link rel="stylesheet" href="css/presentationStyle.css" />
<script src="scripts/jquery-3.5.1.min.js"></script>
<script src="scripts/presentationStyle.js"></script>
<title>FolkerKinzel.CsvTools - Page Not Found</title>
</head>

<body>
<section id="MainSection" class="section p-0">
<div class="pageHeader level mb-2 pt-2 pb-2 pl-5 pr-5">
<div id="TitleContainer" class="level-left">
<div id="DocumentationTitle" class="level-item">
FolkerKinzel.CsvTools - Page Not Found
</div>
</div>
</div>
</section>

<div id="TopicContent" class="column content is-7">
<h1>We're sorry, the page you requested cannot be found.</h1>
<p>The URL might be misspelled or the page you are looking for is no longer available. If you typed in the
URL, check that it does not contain a typo. You can return to the <a href="html/6fb8ee98-40ba-fd2d-5684-d21f3ef90dce.htm">main page</a> to
use the table of contents or the search option to try and locate the page.</p>
</div>
</body>

</html>
235 changes: 235 additions & 0 deletions docs/reference/SearchHelp.aspx
Original file line number Diff line number Diff line change
@@ -0,0 +1,235 @@
<%@ Page Language="C#" EnableViewState="False" %>

<script runat="server">
//===============================================================================================================
// System : Sandcastle Help File Builder
// File : SearchHelp.aspx
// Author : Eric Woodruff (Eric@EWoodruff.us)
// Updated : 08/02/2024
// Note : Copyright 2007-2024, Eric Woodruff, All rights reserved
//
// This file contains the code used to search for keywords within the help topics using the full-text index
// files created by the help file builder.
//
// This code is published under the Microsoft Public License (Ms-PL). A copy of the license should be
// distributed with the code and can be found at the project website: https://GitHub.com/EWSoftware/SHFB. This
// notice, the author's name, and all copyright notices must remain intact in all applications, documentation,
// and source files.
//
// Date Who Comments
// ==============================================================================================================
// 06/24/2007 EFW Created the code
// 02/17/2012 EFW Switched to JSON serialization to support websites that use something other than ASP.NET
// such as PHP.
// 05/15/2014 EFW Updated for use with the lightweight website presentation styles
//===============================================================================================================
/// <summary>
/// This class is used to track the results and their rankings
/// </summary>
private class Ranking
{
public string Filename, PageTitle;
public int Rank;
public Ranking(string file, string title, int rank)
{
Filename = file;
PageTitle = title;
Rank = rank;
}
}
/// <summary>
/// Render the search results
/// </summary>
/// <param name="writer">The writer to which the results are written</param>
protected override void Render(HtmlTextWriter writer)
{
JavaScriptSerializer jss = new JavaScriptSerializer();
string searchText, ftiFile;
char letter;
bool sortByTitle = false;
jss.MaxJsonLength = Int32.MaxValue;
// The keywords for which to search should be passed in the query string
searchText = this.Request.QueryString["Keywords"];
if(String.IsNullOrEmpty(searchText))
{
writer.Write("<strong>Nothing found</strong>");
return;
}
// An optional SortByTitle option can also be specified
if(this.Request.QueryString["SortByTitle"] != null)
sortByTitle = Convert.ToBoolean(this.Request.QueryString["SortByTitle"]);
List<string> keywords = this.ParseKeywords(searchText);
List<char> letters = new List<char>();
List<string> fileList;
Dictionary<string, List<long>> ftiWords, wordDictionary = new Dictionary<string,List<long>>();
// Load the file index
using(StreamReader sr = new StreamReader(Server.MapPath("fti/FTI_Files.json")))
{
fileList = jss.Deserialize<List<string>>(sr.ReadToEnd());
}
// Load the required word index files
foreach(string word in keywords)
{
letter = word[0];
if(!letters.Contains(letter))
{
letters.Add(letter);
ftiFile = Server.MapPath(String.Format(CultureInfo.InvariantCulture, "fti/FTI_{0}.json", (int)letter));
if(File.Exists(ftiFile))
{
using(StreamReader sr = new StreamReader(ftiFile))
{
ftiWords = jss.Deserialize<Dictionary<string, List<long>>>(sr.ReadToEnd());
}
foreach(string ftiWord in ftiWords.Keys)
wordDictionary.Add(ftiWord, ftiWords[ftiWord]);
}
}
}
// Perform the search and return the results as a block of HTML
writer.Write(this.Search(keywords, fileList, wordDictionary, sortByTitle));
}
/// <summary>
/// Split the search text up into keywords
/// </summary>
/// <param name="keywords">The keywords to parse</param>
/// <returns>A list containing the words for which to search</returns>
private List<string> ParseKeywords(string keywords)
{
List<string> keywordList = new List<string>();
string checkWord;
string[] words = Regex.Split(keywords, @"\W+");
foreach(string word in words)
{
checkWord = word.ToLower(CultureInfo.InvariantCulture);
if(checkWord.Length >= 2 && !keywordList.Contains(checkWord))
keywordList.Add(checkWord);
}
return keywordList;
}
/// <summary>
/// Search for the specified keywords and return the results as a block of HTML
/// </summary>
/// <param name="keywords">The keywords for which to search</param>
/// <param name="fileInfo">The file list</param>
/// <param name="wordDictionary">The dictionary used to find the words</param>
/// <param name="sortByTitle">True to sort by title, false to sort by ranking</param>
/// <returns>A block of HTML representing the search results</returns>
private string Search(List<string> keywords, List<string> fileInfo,
Dictionary<string, List<long>> wordDictionary, bool sortByTitle)
{
StringBuilder sb = new StringBuilder(10240);
Dictionary<string, List<long>> matches = new Dictionary<string, List<long>>();
List<long> occurrences;
HashSet<int> matchingFileIndices = new HashSet<int>();
List<int> occurrenceIndices = new List<int>();
List<Ranking> rankings = new List<Ranking>();
string filename, title;
string[] fileIndex;
bool isFirst = true;
int idx, wordCount, matchCount;
foreach(string word in keywords)
{
occurrences = new List<long>();
foreach(KeyValuePair<string, List<long>> kv in wordDictionary)
if(kv.Key.Contains(word))
occurrences.AddRange(kv.Value);
if(occurrences.Count == 0)
return "<strong>Nothing found</strong>";
matches.Add(word, occurrences);
occurrenceIndices.Clear();
// Get a list of the file indices for this match
foreach(long entry in occurrences)
occurrenceIndices.Add((int)(entry >> 16));
if(isFirst)
{
isFirst = false;
matchingFileIndices.UnionWith(occurrenceIndices);
}
else
{
// After the first match, remove files that do not appear for all found keywords
foreach(int i in matchingFileIndices.ToArray())
if(!occurrenceIndices.Contains(i))
matchingFileIndices.Remove(i);
}
}
if(matchingFileIndices.Count == 0)
return "<strong>Nothing found</strong>";
// Rank the files based on the number of times the words occurs
foreach(int index in matchingFileIndices)
{
// Split out the title, filename, and word count
fileIndex = fileInfo[index].Split('\x0');
title = fileIndex[0];
filename = fileIndex[1];
wordCount = Convert.ToInt32(fileIndex[2]);
matchCount = 0;
foreach(string word in keywords)
{
occurrences = matches[word];
foreach(long entry in occurrences)
if((int)(entry >> 16) == index)
matchCount += (int)(entry & 0xFFFF);
}
rankings.Add(new Ranking(filename, title, matchCount * 1000 / wordCount));
if(rankings.Count > 99)
break;
}
// Sort by rank in descending order or by page title in ascending order
rankings.Sort(delegate (Ranking x, Ranking y)
{
if(!sortByTitle)
return y.Rank - x.Rank;
return x.PageTitle.CompareTo(y.PageTitle);
});
// Format the file list and return the results
sb.Append("<ol>");
foreach(Ranking r in rankings)
sb.AppendFormat("<li><a href=\"{0}\" target=\"_blank\">{1}</a></li>", r.Filename, r.PageTitle);
sb.Append("</ol>");
if(rankings.Count < matchingFileIndices.Count)
sb.AppendFormat("<p>Omitted {0} more results</p>", matchingFileIndices.Count - rankings.Count);
return sb.ToString();
}
</script>
Loading

0 comments on commit 7c4ade5

Please sign in to comment.