txt2bib/Text2Bib.cs
2024-01-16 11:51:32 +01:00

120 lines
3.5 KiB
C#

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Txt2Bib.Records;
using System.Windows;
using System.Runtime.CompilerServices;
using System.CodeDom;
namespace Txt2Bib
{
/// <summary>
/// Converting entries from text file to BibTeX format
/// </summary>
public class Text2Bib
{
private string[] _citTypes = { "J", "B", "C", "P", "I" };
/// <summary>
/// Generate single .bib file from input text files
/// </summary>
/// <param name="filenames"></param>
/// <returns></returns>
public string Generate(string filenames)
{
var paths = filenames.Trim().Split('\n');
var output = "";
foreach (var path in paths)
{
output += CreateBibTeX(path);
}
return output;
}
/// <summary>
/// Create a BibTeX string from an input file path
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public string CreateBibTeX(string path)
{
using var reader = File.OpenText(path);
byte[] contentBytes = File.ReadAllBytes(path);
var content = Encoding.Latin1.GetString(contentBytes);
IEnumerable<string> entries = new List<string>();
try
{
entries = content.Split('%').ToList().Select(entry => Process(entry));
}
catch (Exception)
{
throw;
}
var bibtex = "";
foreach (var entry in entries)
{
bibtex += entry;
}
return bibtex;
}
/// <summary>
/// Creates a bib entry from source text
/// </summary>
/// <remarks>Handle exception</remarks>
/// <param name="entryFromTxt"></param>
/// <returns></returns>
/// <exception cref="Exception">Invalid citation type for this entry</exception>
public string Process(string entryFromTxt)
{
var lines = entryFromTxt.Trim().Replace("\r", string.Empty).Split("\n");
var type = lines.First().Trim();
if (!IsValidEntry(type)) throw new Exception($"Invalid entry type '{type}'");
string citation;
try
{
citation = type switch
{
"J" => new Article().Convert(lines),
"B" => new Book().Convert(lines),
//"C" => new ChapterBib(),
"P" => new Proceedings().Convert(lines),
_ => ""
};
}
catch (Exception)
{
throw new Exception("Faulty string in " + entryFromTxt);
}
return citation;
}
/// <summary>
/// Validate txt entry based
/// on citation types
/// </summary>
/// <param name="entry"></param>
protected bool IsValidEntry(string entryType)
{
return _citTypes.Contains(entryType);
}
/// <summary>
/// TODO: How to determine correct encoding of text file??
/// </summary>
/// <param name="reader">The stream reader for the file</param>
/// <returns></returns>
private Encoding GuessEncoding(StreamReader reader)
{
var cp = "UTF-8";
return Encoding.GetEncoding(cp);
}
}
}