public void UpdateStyleSheetLinkPaths(IFileLocator fileLocator, string folderPath, IProgress log) { foreach (XmlElement linkNode in SafeSelectNodes("/html/head/link")) { var href = linkNode.GetAttribute("href"); if (href == null) { continue; } //TODO: see long comment on ProjectContextGetFileLocations() about linking to the right version of a css //TODO: what cause this to get encoded this way? Saw it happen when creating wall calendar href = href.Replace("%5C", "/"); var fileName = FileUtils.NormalizePath(Path.GetFileName(href)); if (!fileName.StartsWith("xx")) //I use xx as a convenience to temporarily turn off stylesheets during development { var path = fileLocator.LocateOptionalFile(fileName); //we want these stylesheets to come from the book folder if (string.IsNullOrEmpty(path) || path.Contains("languageDisplay.css")) { //look in the same directory as the book var local = Path.Combine(folderPath, fileName); if (File.Exists(local)) { path = local; } } //we want these stylesheets to come from the user's collection folder, not ones found in the templates directories else if (path.Contains("CollectionStyles.css")) //settingsCollectionStyles & custonCollectionStyles { //look in the parent directory of the book var pathInCollection = Path.Combine(Path.GetDirectoryName(folderPath), fileName); if (File.Exists(pathInCollection)) { path = pathInCollection; } } if (!string.IsNullOrEmpty(path)) { //this is here for geckofx 11... probably can remove it when we move up to modern gecko, as FF22 doesn't like it. //linkNode.SetAttribute("href", "file://" + path); linkNode.SetAttribute("href", path.ToLocalhost()); } else { throw new ApplicationException( string.Format("Bloom could not find the stylesheet '{0}', which is used in {1}", fileName, folderPath)); } } } }
// /// <summary> // /// Creates a relative path from one file or folder to another. // /// </summary> // /// <param name="fromPath">Contains the directory that defines the start of the relative path.</param> // /// <param name="toPath">Contains the path that defines the endpoint of the relative path.</param> // /// <param name="dontEscape">Boolean indicating whether to add uri safe escapes to the relative path</param> // /// <returns>The relative path from the start directory to the end path.</returns> // /// <exception cref="ArgumentNullException"></exception> // public static String MakeRelativePath(String fromPath, String toPath) // { // if (String.IsNullOrEmpty(fromPath)) throw new ArgumentNullException("fromPath"); // if (String.IsNullOrEmpty(toPath)) throw new ArgumentNullException("toPath"); // // //the stuff later on needs to see directory names trailed by a "/" or "\". // fromPath = fromPath.Trim(); // if (!fromPath.EndsWith(Path.DirectorySeparatorChar.ToString())) // { // if (Directory.Exists(fromPath)) // { // fromPath = fromPath + Path.DirectorySeparatorChar; // } // } // Uri fromUri = new Uri(fromPath); // Uri toUri = new Uri(toPath); // // Uri relativeUri = fromUri.MakeRelativeUri(toUri); // String relativePath = Uri.UnescapeDataString(relativeUri.ToString()); // // return relativePath.Replace('/', Path.DirectorySeparatorChar); // } private void UpdateStyleSheetLinkPaths(HtmlDom dom, IFileLocator fileLocator, IProgress log) { foreach (XmlElement linkNode in dom.SafeSelectNodes("/html/head/link")) { var href = linkNode.GetAttribute("href"); if (href == null) { continue; } //TODO: see long comment on ProjectContextGetFileLocations() about linking to the right version of a css //TODO: what cause this to get encoded this way? Saw it happen when creating wall calendar href = href.Replace("%5C", "/"); var fileName = Path.GetFileName(href); if (!fileName.StartsWith("xx")) //I use xx as a convenience to temporarily turn off stylesheets during development { var path = fileLocator.LocateOptionalFile(fileName); //we want these stylesheets to come from the book folder if (string.IsNullOrEmpty(path)|| path.Contains("languageDisplay.css")) { //look in the same directory as the book var local = Path.Combine(_folderPath, fileName); if (File.Exists(local)) path = local; } //we want these stylesheets to come from the user's collection folder, not ones found in the templates directories else if (path.Contains("CollectionStyles.css")) //settingsCollectionStyles & custonCollectionStyles { //look in the parent directory of the book var pathInCollection = Path.Combine(Path.GetDirectoryName(_folderPath), fileName); if (File.Exists(pathInCollection)) path = pathInCollection; } if (!string.IsNullOrEmpty(path)) { //this is here for geckofx 11... probably can remove it when we move up to modern gecko, as FF22 doesn't like it. linkNode.SetAttribute("href", "file://" + path); } else { throw new ApplicationException(string.Format("Bloom could not find the stylesheet '{0}', which is used in {1}", fileName, _folderPath)); } } } }