Esempio n. 1
0
        /// <summary>
        /// Преобразование "стандартного" портрета в более удобную форму. Сейчас будем "ваять" html типа комбинации полей и правой колонки
        /// в раскрытии персоны
        /// </summary>
        /// <param name="xtree"></param>
        /// <returns></returns>
        private XElement ToPortrait(XElement xtree)
        {
            var ph = xtree.Elements("inverse")
                     .Where(i => i.Attribute("prop").Value == "http://fogid.net/o/reflected")
                     .Select(i => i.Element("record"))
                     .Where(r => r.Elements("field").FirstOrDefault(f => f.Attribute("prop").Value == "http://fogid.net/o/ground")?.Value == "portrait")
                     .Select(r => r.Element("direct")?.Element("record"))
                     .Where(r1 => r1 != null && r1.Attribute("type").Value == "http://fogid.net/o/photo-doc")
                     .OrderByDescending(r1 => r1.Elements("field").FirstOrDefault(f => f.Attribute("prop").Value == "http://fogid.net/o/from-date")?.Value)
                     .ToArray()
                     .FirstOrDefault()
            ;
            string ph_uri = null;

            if (ph != null)
            {
                ph_uri = ph.Elements("field").FirstOrDefault(f => f.Attribute("prop").Value == "http://fogid.net/o/uri").Value;
            }

            string lang    = null;
            int    nameind = -1;

            XElement[] namefields = xtree.Elements("field")
                                    .Where(f => f.Attribute("prop").Value == "http://fogid.net/o/name")
                                    .Where((f, i) =>
            {
                string la = f.Attribute("{http://www.w3.org/XML/1998/namespace}lang")?.Value;
                if (nameind == -1 || la == "ru")
                {
                    nameind = i;
                    lang    = la;
                }
                return(true);
            })
                                    .ToArray();
            if (nameind == -1)
            {
                nameind = 0;
            }

            string fd   = xtree.Elements("field").FirstOrDefault(f => f.Attribute("prop").Value == "http://fogid.net/o/from-date")?.Value;
            string td   = xtree.Elements("field").FirstOrDefault(f => f.Attribute("prop").Value == "http://fogid.net/o/to-date")?.Value;
            string desc = xtree.Elements("field").FirstOrDefault(f => f.Attribute("prop").Value == "http://fogid.net/o/description")?.Value;

            XElement[] titles = xtree.Elements("inverse").Where(i => i.Attribute("prop").Value == "http://fogid.net/o/has-title")
                                .Select(i => i.Element("record"))
                                .OrderBy(r => r.Elements("field").FirstOrDefault(f => f.Attribute("prop").Value == "http://fogid.net/o/from-date")?.Value)
                                .ToArray();
            XElement[] works = xtree.Elements("inverse").Where(i => i.Attribute("prop").Value == "http://fogid.net/o/participant")
                               .Select(i => i.Element("record"))
                               .Where(r => r.Element("direct")?.Element("record")?
                                      .Elements("field")
                                      .FirstOrDefault(f => f.Attribute("prop").Value == "http://fogid.net/o/org-classification")?.Value == "organization")
                               .OrderBy(r => r.Elements("field").FirstOrDefault(f => f.Attribute("prop").Value == "http://fogid.net/o/from-date")?.Value)
                               .ToArray();

            XElement result = new XElement("html",
                                           new XElement("head"),
                                           new XElement("body",
                                                        new XElement("div",
                                                                     (ph_uri == null? null : new XElement("img", new XAttribute("src", Url.Content("~/Docs/GetPhoto?s=small&u=" + ph_uri)), new XAttribute("align", "right"))),
                                                                     new XElement("div", namefields[nameind].Value),
                                                                     namefields.Where((f, i) => i != nameind).Select(f => new XElement("div", f.Value)),
                                                                     (fd == null && td == null) ?null: new XElement("div",
                                                                                                                    (fd == null ? "" : StaticObjects.DatePrinted(fd)) + (td == null ? "" : " - " + StaticObjects.DatePrinted(td))),
                                                                     desc == null ? null : new XElement("div", desc),
                                                                     new XElement("div", new XAttribute("style", "background-color:aquamarine;"),
                                                                                  titles.Select(r => new XElement("div", StaticObjects.DatePrinted(StaticObjects.GetField(r, "http://fogid.net/o/from-date")),
                                                                                                                  new XElement("span", StaticObjects.GetField(r, "http://fogid.net/o/degree"))))),
                                                                     works.Select(parti =>
            {
                XElement xorg = parti.Element("direct")?.Element("record");
                return(new XElement("div",
                                    StaticObjects.GetField(parti, "http://fogid.net/o/from-date"),
                                    StaticObjects.GetField(parti, "http://fogid.net/o/role"),
                                    xorg == null ? null : StaticObjects.GetField(xorg, "http://fogid.net/o/name"),
                                    null));
            }),
                                                                     null)),
                                           null);

            return(result);
        }