Example #1
0
        //----------------------------------------------------------------------------------
        // Dokumentoperationen

        public bool NewDoc(string currentLevel, string nameNewDoc, string newTitle, string descr)
        {
            // XPath- Ausdruck zur Abfrage des aktuellen Knotens
            lock (this)
            {
                string[] levels = currentLevel.Split('.');

                // Zugriff auf den Knoten

                XElement currentEntry = _directory.XPathSelectElement(WocNameToXPath(levels), _nsmgr);
                Debug.Assert(currentEntry != null);

                mkoIt.Xhtml.Directory.e newDir = new mkoIt.Xhtml.Directory.e();
                newDir.id    = nameNewDoc;
                newDir.t     = newTitle;
                newDir.descr = descr;
                newDir.ver   = 1;
                newDir.d     = DateTime.Now;
                newDir.ix    = 1;

                // Prüfen, ob das Dokument bereits existiert
                string[] newLevels = (currentLevel + "." + newDir.id).Split('.');
                if (_directory.XPathSelectElement(WocNameToXPath(newLevels), _nsmgr) != null)
                {
                    throw new Exception("Das Unterverzeichnis " + nameNewDoc + " existiert bereits");
                }


                // Markieren des Knotens als Dokumentknoten
                mkoIt.Xhtml.Directory.eVal val = new mkoIt.Xhtml.Directory.eVal();
                val.parser = "Editor.aspx";
                val.viewer = "woc.aspx";
                val.Value  = currentLevel + "." + newDir.id;

                newDir.Items = new object[] { val };

                string newDirSerialized;
                mko.algorithm.InfosSerializer <mkoIt.Xhtml.Directory.e> .WriteToXml(newDir, out newDirSerialized);

                currentEntry.Add(XElement.Parse(newDirSerialized));

                // Alle Index- Attribute neu nummerieren
                int ix = 1;
                foreach (XElement e in currentEntry.XPathSelectElements("./vz:e", _nsmgr))
                {
                    e.SetAttributeValue(XName.Get("ix"), ix++);
                }

                // Erweiterten Verzeichnisbaum sichern
                SaveDirectoryChanges();
            }

            return(true);
        }
Example #2
0
        /// <summary>
        /// Verschiebt ein Woc- Dokument innerhalb der Woc Hierarchie.
        /// Ein Woc- Name ist der Dateiname der Xhtml- Datei im App_Data Verzeichnis ohne Extension
        /// </summary>
        /// <param name="oldWocName"></param>
        /// <param name="newWocName"></param>
        /// <returns></returns>
        public bool DocCopy(string srcWocName, string destWocName, string newTitle, bool deleteSrcWoc)
        {
            lock (this)
            {
                if (srcWocName == destWocName)
                {
                    return(true);
                }


                string[] srcLevels  = srcWocName.Split('.');
                string[] destLevels = destWocName.Split('.');

                // Zugriff auf den bestehenden Knoten
                XElement srcEntry = _directory.XPathSelectElement(WocNameToXPath(srcLevels), _nsmgr);
                Debug.Assert(srcEntry != null);

                // Prüfen, ob das Verzeichnis für den neuen Namen existiert
                XElement destHomeDir = _directory.XPathSelectElement(WocNameToXPath(destLevels, destLevels.Length - 1), _nsmgr);
                if (destHomeDir == null)
                {
                    throw new Exception("Das Zielverzeichnis existiert nicht");
                }

                // Prüfen, ob der neue Name nicht bereits für ein anderes Dokument vergeben wurde
                if (_directory.XPathSelectElement(WocNameToXPath(destLevels), _nsmgr) != null)
                {
                    throw new Exception("Der Name " + destWocName + " wurde bereits für ein Unterverzeichnis verwendet");
                }

                // Neuen Verzeichniseintrag anlegen
                mkoIt.Xhtml.Directory.e newDir = new mkoIt.Xhtml.Directory.e();
                newDir.id    = GetWocNodeId(destLevels);
                newDir.t     = newTitle;
                newDir.descr = srcEntry.XPathSelectElement("./vz:descr", _nsmgr).Value;
                if (srcEntry.Attribute(XName.Get("ver")) != null)
                {
                    newDir.ver = int.Parse(srcEntry.Attribute(XName.Get("ver")).Value) + 1;
                }
                else
                {
                    newDir.ver = 1;
                }
                newDir.d  = DateTime.Now;
                newDir.ix = 1;

                // Markieren des Knotens als Dokumentknoten
                mkoIt.Xhtml.Directory.eVal val = new mkoIt.Xhtml.Directory.eVal();
                val.parser = "Editor.aspx";
                val.viewer = "woc.aspx";
                val.Value  = destWocName;

                newDir.Items = new object[] { val };

                string newDocSerialized;
                mko.algorithm.InfosSerializer <mkoIt.Xhtml.Directory.e> .WriteToXml(newDir, out newDocSerialized);

                destHomeDir.Add(XElement.Parse(newDocSerialized));

                // Alten Verzeichniseintrag löschen
                if (deleteSrcWoc)
                {
                    srcEntry.Remove();
                }

                // xhtml Datei an neuen Speicherort verschieben/kopieren und Hyperlinks im Dokument anpassen
                string oldXhtmlName = HttpContext.Current.Server.MapPath("~/App_Data/" + srcWocName + ".xhtml");

                if (File.Exists(oldXhtmlName))
                {
                    string newXhtmlName = HttpContext.Current.Server.MapPath("~/App_Data/" + destWocName + ".xhtml");

                    if (File.Exists(destWocName))
                    {
                        throw new Exception("Das Dokument " + srcWocName + ".xhtml kann nicht in " + destWocName + " umbenannt werden, da  Datei bereits existiert !");
                    }

                    if (deleteSrcWoc)
                    {
                        File.Move(oldXhtmlName, newXhtmlName);
                    }
                    else
                    {
                        File.Copy(oldXhtmlName, newXhtmlName);
                    }

                    // Zugehörige Bilder umbenennen
                    // Alle Bilder zum Dokument bestimmen
                    foreach (string img in Directory.GetFiles(HttpContext.Current.Server.MapPath("~/Bilder")))
                    {
                        if (img.Contains(srcWocName))
                        {
                            // Umbenennen
                            string newImgName = img.Replace(srcWocName, destWocName);
                            if (deleteSrcWoc)
                            {
                                File.Move(img, newImgName);
                            }
                            else
                            {
                                File.Copy(img, newImgName);
                            }
                        }
                    }

                    // Bildreferenzen im Xhtml- Dokument ändern
                    string txtXhtml = "<body>" + File.ReadAllText(newXhtmlName) + "</body>";

                    XElement xhtmlDoc = XElement.Parse(txtXhtml);
                    foreach (XElement img in xhtmlDoc.XPathSelectElements("//img"))
                    {
                        string oldSrc = img.Attribute(XName.Get("src")).Value;
                        string newSrc = oldSrc.Replace(srcWocName, destWocName);
                        img.SetAttributeValue(XName.Get("src"), newSrc);
                    }

                    // Geändertes Xhtml zurückschreiben
                    StringBuilder bld = new StringBuilder();
                    foreach (XElement xe in xhtmlDoc.Elements())
                    {
                        bld.Append(xe.ToString());
                    }

                    File.WriteAllText(newXhtmlName, bld.ToString());
                }

                // Erweiterten Verzeichnisbaum sichern
                SaveDirectoryChanges();
            }

            return(true);
        }