Rev 10 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
using System;
using System.Collections.Generic;
using System.IO;
using System.Management;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using com.jamiehill;
namespace OneNoteHTMLImporter {
class OneNoteHTMLImporter {
private JPHOneNoteUtilities onp = null;
private OneNoteXMLObject unfiledNotes;
private XY initialPosition = new XY(40, 80);
private XY defaultIconSize = new XY(65, 75);
private static String browserPostfix = "_files";
private static String HTMLFileDir = "HTML File Storage";
public static String myName = "OneNote HTML Importer";
public OneNoteHTMLImporter() {
onp = new JPHOneNoteUtilities();
unfiledNotes = onp.GetUnfiledNotesSection();
}
private string GetOpeningXml(string id, string pageName) {
string xml = "<?xml version=\"1.0\"?>" +
" <one:Page xmlns:one=\"" + onp.GetOneNoteNamespace() + "\" ID=\"" + id + "\">" +
" <one:PageSettings RTL=\"false\" color=\"automatic\">" +
" <one:PageSize>" +
" <one:Automatic/>" +
" </one:PageSize>" +
" <one:RuleLines visible=\"false\"/>" +
" </one:PageSettings>" +
" <one:Title style=\"font-family:Calibri;font-size:17.0pt\" lang=\"en-US\">" +
" <one:OE alignment=\"left\">" +
" <one:T>" +
" <![CDATA[" + pageName + "]]>" +
" </one:T>" +
" </one:OE>" +
" </one:Title>";
return (xml);
}
private string GetClosingXml() {
string xml = " </one:Page>";
return (xml);
}
private string GetHtmlXml(FileInfo file, XY position) {
string xml = "<one:Outline>" +
" <one:Position x=\""+position.x+"\" y=\""+position.y+"\"/>"+
" <one:OEChildren>"+
" <one:OE>"+
" <one:InsertedFile pathSource=\"" + file.FullName + "\"/>"+
" </one:OE>"+
" </one:OEChildren>"+
"</one:Outline>\n"+
" <one:Outline>"+
" <one:Position x=\"" + position.x + "\" y=\"" + (position.y + defaultIconSize.y + 15) + "\"/>" +
" <one:OEChildren>" +
" <one:HTMLBlock>" +
" <one:File path=\"" + file.FullName + "\"/>" +
" </one:HTMLBlock>" +
" </one:OEChildren>" +
" </one:Outline>";
return (xml);
}
private string MakeFirstLetterUpper(string str) {
int len = str.Length;
if (len <= 0) return (str);
if (len == 1) return (str.ToUpper());
char[] letters = str.ToCharArray();
letters[0] = Char.ToUpper(letters[0]);
return (new string(letters));
}
public string GetHTMLTitle(FileInfo fi) {
StreamReader stream = null;
string title = "Untitled page";
try {
stream = fi.OpenText();
} catch {
return (title);
}
while (stream.Peek() > 0) {
string text = stream.ReadLine();
if (Regex.Match(text, "<title>", RegexOptions.IgnoreCase).Success) {
Match m = Regex.Match(text, @"<title>\s*(?<title>.+?)\s*</title>", RegexOptions.IgnoreCase);
if (!m.Success) {
string build = text;
while (stream.Peek() > 0) {
text = stream.ReadLine();
if (Regex.Match(text, "</title>",RegexOptions.IgnoreCase).Success) {
build += text;
break;
} else {
build += text;
}
}
m = Regex.Match(build, @"<title>\s*(?<title>.+?)\s*</title>",RegexOptions.IgnoreCase);
}
if (m.Success) {
title = MakeFirstLetterUpper(m.Groups["title"].ToString());
} else {
title = "Untitled page";
}
break;
}
}
stream.Close();
return (title);
}
public void MakeStorageDirectory(ref FileInfo fi) {
string ondnp = onp.GetDefaultNotebookPath();
string guid = System.Guid.NewGuid().ToString();
DirectoryInfo notebookd = new DirectoryInfo(ondnp);
DirectoryInfo htmld = new DirectoryInfo(ondnp+"\\"+HTMLFileDir+"\\"+guid);
try {
if (!htmld.Exists) htmld.Create();
} catch (Exception e) {
throw new SystemException("Failed to create storage directory: "+htmld.FullName+" -- "+e);
}
try {
File.Move(fi.FullName, htmld.FullName + "\\" + fi.Name);
} catch (Exception e) {
DialogResult dr = MessageBox.Show("File move failed: " + fi.FullName + " -> " + htmld.FullName + "\\" + fi.Name + " (" + e.ToString() + ")", "Error", MessageBoxButtons.OK);
}
DirectoryInfo di = GetAdditionalFilesDir(fi);
try {
DirectoryInfo ndi = new DirectoryInfo(htmld.FullName + "\\" + di.Name);
ndi.Create();
DirectoryCopy(di.FullName, htmld.FullName + "\\" + di.Name, true);
Directory.Delete(di.FullName, true);
} catch (Exception e) {
DialogResult dr = MessageBox.Show("Directory move failed: " + di.FullName + " -> " + htmld.FullName + "\\" + di.Name + " (" + e.ToString() + ")", "Error", MessageBoxButtons.OK);
}
fi = new FileInfo(htmld.FullName + "\\" + fi.Name);
}
static uint DirectoryCopy(string SourcePath, string DestinationPath, bool Recursive) {
if (Directory.Exists(DestinationPath)) Directory.Delete(DestinationPath, true);
string objPath = @"\\.\root\cimv2:Win32_Directory.Name=" + "\"" + SourcePath.Replace("\\", "\\\\") + "\"";
using (ManagementObject dir = new ManagementObject(objPath)) {
ManagementBaseObject inputArgs = dir.GetMethodParameters("CopyEx");
inputArgs["FileName"] = DestinationPath.Replace("\\", "\\\\");
inputArgs["Recursive"] = Recursive;
ManagementBaseObject outParams = dir.InvokeMethod("CopyEx", inputArgs, null);
return ((uint)(outParams.Properties["ReturnValue"].Value));
}
}
public DirectoryInfo GetAdditionalFilesDir(FileInfo fi) {
String name = fi.Name;
name = Regex.Replace(name, fi.Extension, "");
String extdir = name + browserPostfix;
return (new DirectoryInfo(extdir));
}
public void FixUpHTML(FileInfo fi) {
StreamReader stream = null;
try {
stream = fi.OpenText();
} catch (Exception e) {
throw e;
}
String extdir = GetAdditionalFilesDir(fi).Name;
String sp_extdir = Regex.Replace(extdir, " ","%20");
Stream os = File.OpenWrite(fi.FullName + ".new");
string text = stream.ReadToEnd();
stream.Close();
string dir = fi.DirectoryName;
dir = Regex.Replace(dir, Regex.Escape(@"\"), "/");
//text = Regex.Replace(text, "\"(" + extdir + "/)", "\"file:///" + dir + "/$1", RegexOptions.Singleline);
text = Regex.Replace(text, "(" + extdir + "|" + sp_extdir + "/)", "file:///" + dir + "/$1", RegexOptions.Singleline);
os.Write((new ASCIIEncoding()).GetBytes(text), 0, text.Length);
os.Close();
fi.Delete();
(new FileInfo(fi.FullName + ".new")).MoveTo(fi.FullName);
}
public FileInfo PickFile(string[] args) {
OpenFileDialog fileOpen = new OpenFileDialog();
string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
bool flag = false;
//fileOpen.ShowReadOnly = true;
if (args.Length > 0) {
if (File.Exists(args[0])) {
fileOpen.FileName = args[0];
flag = true;
} else if (Directory.Exists(args[0])) path = args[0];
}
if (!flag) {
fileOpen.Title = myName + ": Open";
fileOpen.InitialDirectory = path;
fileOpen.Filter = "HTM Files (*.htm, *.html, *.xhtml)|*.htm;*.html;*.xhtml|All files (*.*)|*.*";
fileOpen.FilterIndex = 0;
fileOpen.RestoreDirectory = false;
if (fileOpen.ShowDialog() != DialogResult.OK) return (null);
}
FileInfo fi = new FileInfo(fileOpen.FileName);
if (!fi.Exists) {
DialogResult dr = MessageBox.Show("File not found: " + fileOpen.FileName, "Error", MessageBoxButtons.OK);
return (null);
} else return (fi);
}
[STAThread]
static int Main(string[] args) {
OneNoteHTMLImporter onchi = new OneNoteHTMLImporter();
OneNoteXMLObject newPage = new OneNoteXMLObject(null, null, null, null, null, null, null, false);
FileInfo fi = onchi.PickFile(args);
if (fi == null) return (1);
try {
onchi.MakeStorageDirectory(ref fi);
onchi.FixUpHTML(fi);
newPage = onchi.onp.CreatePage(ref onchi.unfiledNotes);
} catch (Exception e) {
DialogResult dr = MessageBox.Show(e.ToString(), "Error", MessageBoxButtons.OK);
}
string title = onchi.GetHTMLTitle(fi);
string xml = onchi.GetOpeningXml(newPage.id, title);
xml += onchi.GetHtmlXml(fi, onchi.initialPosition);
xml += onchi.GetClosingXml();
try {
onchi.onp.UpdatePage(xml);
} catch (Exception e) {
DialogResult dr = MessageBox.Show(e.ToString(), "Error", MessageBoxButtons.OK);
onchi.onp.DeletePage(ref newPage);
}
return (0);
}
}
}