Rev 9 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
using System;using System.Collections;using System.Collections.Generic;using System.IO;using System.Management;using System.Text;using System.Text.RegularExpressions;using System.Windows.Forms;using com.jamiehill;using System.Xml.Linq;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 BuildXml(string id, FileInfo file, XY position) {try {string title = this.GetHTMLTitle(file);XNamespace ns = onp.GetOneNoteNamespace();XElement x = new XElement(ns + "Page",new XAttribute(XNamespace.Xmlns + "one", ns.NamespaceName),new XAttribute("ID", id),new XElement(ns + "PageSettings",new XAttribute("RTL", "false"),new XAttribute("color", "automatic"),new XElement(ns + "PageSize",new XElement(ns + "Automatic")),new XElement(ns + "RuleLines",new XAttribute("visible", "false"))),new XElement(ns + "Title",new XAttribute("style", "font-famly:Calibri;font-size:17.0pt"),new XAttribute("lang", "en-US"),new XElement(ns + "OE",new XAttribute("alignment", "left"),new XElement(ns + "T",new XCData(title)))),new XElement(ns + "Outline",new XElement(ns + "Position",new XAttribute("x", position.x),new XAttribute("y", position.y)),new XElement(ns + "OEChildren",new XElement(ns + "OE",new XElement(ns + "InsertedFile",new XAttribute("pathSource", file.FullName))))),new XElement(ns + "Outline",new XElement(ns + "Position",new XAttribute("x", position.x),new XAttribute("y", (position.y + defaultIconSize.y + 15))),new XElement(ns + "OEChildren",new XElement(ns + "HTMLBlock",new XElement(ns + "File",new XAttribute("path", file.FullName))))));string xml = (new XDeclaration("1.0", null, null)).ToString() + "\n";xml += x.ToString();return (xml);} catch (Exception e) {throw new SystemException("Xml generation failed: " + e);}}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 bool ParseArgs(ref ArrayList args, ref int argc, string opt, out string arg) {arg = null;int tc = argc;if (argc > 0) {for (int i = 0; i < argc; i++) {string value = args[i].ToString();if (value == opt) {tc--;if (i + 1 < argc && args[i + 1].ToString().Length > 0) {tc--;arg = args[i + 1].ToString();args.RemoveAt(i + 1);args.RemoveAt(i);break;}args.RemoveAt(i);break;} else if (Regex.Match(value, "^" + opt).Success) {tc--;args.RemoveAt(i);Match m = Regex.Match(value, "^" + opt + "(.+)");arg = m.Groups[1].ToString();break;}}}argc = tc;if (arg != null) {return true;} else {return false;}}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(fi.DirectoryName + "\\" + 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 + "|" + 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 startDir) {OpenFileDialog fileOpen = new OpenFileDialog();string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);if (Directory.Exists(startDir)) {path = startDir;}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);} elsereturn (fi);}[STAThread]static int Main(string[] args) {OneNoteHTMLImporter onchi = new OneNoteHTMLImporter();OneNoteXMLObject newPage = new OneNoteXMLObject(null, null, null, null, null, null, null, false);int len = args.Length;ArrayList a = new ArrayList(args);string param = null;if (onchi.ParseArgs(ref a, ref len, "-e", out param)) {if (!Regex.Match(param, "^_").Success) {browserPostfix = "_" + param;} else {browserPostfix = param;}}param = null;onchi.ParseArgs(ref a, ref len, "-s", out param);FileInfo fi = onchi.PickFile(param);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 xml = onchi.BuildXml(newPage.id, fi, onchi.initialPosition);try {onchi.onp.UpdatePage(xml);} catch (Exception e) {DialogResult dr = MessageBox.Show(e.ToString(), "Error", MessageBoxButtons.OK);onchi.onp.DeletePage(ref newPage);}return (0);}}}