Esempio n. 1
0
            public static void WikipediaHtmlExampleParseTest()
            {
                // <img src="data:image/png;base64,iVBORw0KGgoAAA
                // ANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4
                // //8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU
                // 5ErkJggg==" alt="Red dot" />
                var actual = DataUri.Parse(
                    "data:image/png;base64,iVBORw0KGgoAAA" +
                    "ANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4" +
                    "//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU" +
                    "5ErkJggg=="
                    );
                var expected = new DataUri(
                    mediaType: "image/png",
                    parameters: new Dictionary <string, string>(),
                    data: new byte[] {
                    137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82,
                    0, 0, 0, 5, 0, 0, 0, 5, 8, 6, 0, 0, 0, 141, 111, 38,
                    229, 0, 0, 0, 28, 73, 68, 65, 84, 8, 215, 99, 248, 255, 255, 63,
                    195, 127, 6, 32, 5, 195, 32, 18, 132, 208, 49, 241, 130, 88, 205, 4,
                    0, 14, 245, 53, 203, 209, 142, 14, 31, 0, 0, 0, 0, 73, 69, 78,
                    68, 174, 66, 96, 130
                }
                    );

                Assert.AreEqual(expected.MediaType, actual.MediaType);
                Assert.AreEqual(expected.Parameters, actual.Parameters);
                Assert.AreEqual(expected.Data, actual.Data);
            }
        /// <summary>
        /// Gets the OpenXml ImagePartType associated to an image.
        /// </summary>
        public static ImagePartType?GetImagePartTypeForImageUrl(Uri uri)
        {
            ImagePartType type;
            String        extension = System.IO.Path.GetExtension(uri.IsAbsoluteUri ? uri.Segments[uri.Segments.Length - 1] : uri.OriginalString);

            if (knownExtensions.TryGetValue(extension, out type))
            {
                return(type);
            }

            // extension not recognized, try with checking the query string. Expecting to resolve something like:
            // ./image.axd?picture=img1.jpg
            extension = System.IO.Path.GetExtension(uri.IsAbsoluteUri ? uri.AbsoluteUri : uri.ToString());
            if (knownExtensions.TryGetValue(extension, out type))
            {
                return(type);
            }

            // so, match text of the form: data:image/yyy;base64,zzzzzzzzzzzz...
            // where yyy is the MIME type, zzz is the base64 encoded data
            DataUri dataUri = DataUri.Parse(uri.ToString());

            if (dataUri != null)
            {
                if (knownContentType.TryGetValue(dataUri.Mime, out type))
                {
                    return(type);
                }
            }

            return(null);
        }
Esempio n. 3
0
            public static void DataUriFunctionExample2ParseTest()
            {
                var actual   = DataUri.Parse("data:;base64,SGVsbG8sIFdvcmxkIQ==");
                var expected = new DataUri(
                    mediaType: string.Empty,
                    parameters: new Dictionary <string, string>(),
                    data: Encoding.UTF8.GetBytes("Hello, World!")
                    );

                Assert.AreEqual(expected.MediaType, actual.MediaType);
                Assert.AreEqual(expected.Parameters, actual.Parameters);
                Assert.AreEqual(expected.Data, actual.Data);
            }
Esempio n. 4
0
        public void DataUriToObjectUnknownMediaType()
        {
            string imageUri = "data:image/jpeg;base64,fooBar";

            try
            {
                var dataUri = DataUri.Parse(imageUri);
                DataUri.ToObject <Bitmap>(dataUri);
                throw new Exception("DataUri Should be invalid");
            }
            catch (ArgumentException)
            {
            }
        }
        //____________________________________________________________________
        //
        // Public Functionality

        #region DownloadData

        /// <summary>
        /// Download the remote or local image located at the specified url.
        /// </summary>
        public HtmlImageInfo DownloadData(Uri imageUrl)
        {
            // is it a local path?
            if (imageUrl.IsFile)
            {
                // replace string %20 in LocalPath by daviderapicavoli (patch #15938)
                String localPath = Uri.UnescapeDataString(imageUrl.LocalPath);

                try
                {
                    // just read the picture from the file system
                    imageInfo.RawData = File.ReadAllBytes(localPath);
                }
                catch (Exception exc)
                {
                    if (Logging.On)
                    {
                        Logging.PrintError("ImageDownloader.DownloadData(\"" + localPath + "\")", exc);
                    }

                    if (exc is IOException || exc is UnauthorizedAccessException || exc is System.Security.SecurityException || exc is NotSupportedException)
                    {
                        return(null);
                    }
                    throw;
                }

                return(imageInfo);
            }

            // data inline, encoded in base64
            if (imageUrl.Scheme == "data")
            {
                DataUri dataUri = DataUri.Parse(imageUrl.OriginalString);
                return(DownloadData(dataUri));
            }

            var response = BackChannels.CreateWebRequest(imageUrl, proxy);

            if (response != null)
            {
                imageInfo.RawData = response.Body;

                // For requested url with no filename, we need to read the media mime type if provided
                imageInfo.Type = InspectMimeType(response.ContentType);
            }

            return(imageInfo);
        }
Esempio n. 6
0
            public static void WikipediaExample1ParseTest()
            {
                var actual   = DataUri.Parse("data:text/vnd-example+xyz;foo=bar;base64,R0lGODdh");
                var expected = new DataUri(
                    mediaType: "text/vnd-example+xyz",
                    parameters: new Dictionary <string, string> {
                    { "foo", "bar" }
                },
                    data: Encoding.ASCII.GetBytes("GIF87a")
                    );

                Assert.AreEqual(expected.MediaType, actual.MediaType);
                Assert.AreEqual(expected.Parameters, actual.Parameters);
                Assert.AreEqual(expected.Data, actual.Data);
            }
Esempio n. 7
0
            public static void DataUriFunctionExample1ParseTest()
            {
                var actual   = DataUri.Parse("data:text/plain;charset=utf8;base64,SGVsbG8=");
                var expected = new DataUri(
                    mediaType: "text/plain",
                    parameters: new Dictionary <string, string> {
                    { "charset", "utf8" }
                },
                    data: Encoding.UTF8.GetBytes("Hello")
                    );

                Assert.AreEqual(expected.MediaType, actual.MediaType);
                Assert.AreEqual(expected.Parameters, actual.Parameters);
                Assert.AreEqual(expected.Data, actual.Data);
            }
Esempio n. 8
0
            public static void WikipediaExample2ParseTest()
            {
                var actual   = DataUri.Parse("data:text/plain;charset=UTF-8;page=21,the%20data:1234,5678");
                var expected = new DataUri(
                    mediaType: "text/plain",
                    parameters: new Dictionary <string, string> {
                    { "charset", "UTF-8" },
                    { "page", "21" },
                },
                    data: Encoding.ASCII.GetBytes("the data:1234,5678")
                    );

                Assert.AreEqual(expected.MediaType, actual.MediaType);
                Assert.AreEqual(expected.Parameters, actual.Parameters);
                Assert.AreEqual(expected.Data, actual.Data);
            }
Esempio n. 9
0
        public void ParseMultiline()
        {
            string html = @"data:image/jpeg;base64,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
";

            Assert.IsNotNull(DataUri.Parse(html));
        }
Esempio n. 10
0
            public static void Rfc2397ExampleParseTest()
            {
                var actual = DataUri.Parse(
                    "data:,A%20brief%20note"
                    );
                var expected = new DataUri(
                    mediaType: string.Empty,
                    parameters: new Dictionary <string, string>(),
                    data: new byte[] {
                    65, 32, 98, 114, 105, 101, 102, 32, 110, 111, 116, 101
                }
                    );

                Assert.AreEqual(expected.MediaType, actual.MediaType);
                Assert.AreEqual(expected.Parameters, actual.Parameters);
                Assert.AreEqual(expected.Data, actual.Data);
            }
Esempio n. 11
0
            public static void WikipediaCssExampleParseTest()
            {
                // ul.checklist li.complete {
                //     padding-left: 20px;
                //     background: white url('data:image/png;base64,iVB\
                // ORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEU\
                // AAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8\
                // yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAEl\
                // FTkSuQmCC') no-repeat scroll left top;
                // }
                var actual = DataUri.Parse(
                    "data:image/png;base64,iVB" +
                    "ORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEU" +
                    "AAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8" +
                    "yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAEl" +
                    "FTkSuQmCC"
                    );
                var expected = new DataUri(
                    mediaType: "image/png",
                    parameters: new Dictionary <string, string>(),
                    data: new byte[] {
                    137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82,
                    0, 0, 0, 16, 0, 0, 0, 16, 1, 3, 0, 0, 0, 37, 61, 109,
                    34, 0, 0, 0, 6, 80, 76, 84, 69, 0, 0, 0, 255, 255, 255, 165,
                    217, 159, 221, 0, 0, 0, 51, 73, 68, 65, 84, 120, 156, 99, 248, 255,
                    159, 225, 255, 95, 134, 255, 159, 25, 14, 176, 51, 220, 63, 204, 112, 127,
                    50, 195, 205, 205, 12, 55, 141, 25, 238, 20, 131, 208, 189, 207, 12, 247,
                    129, 82, 204, 12, 15, 192, 232, 255, 127, 0, 81, 134, 23, 40, 206, 93,
                    155, 80, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130
                }
                    );

                Assert.AreEqual(expected.MediaType, actual.MediaType);
                Assert.AreEqual(expected.Parameters, actual.Parameters);
                Assert.AreEqual(expected.Data, actual.Data);
            }
Esempio n. 12
0
        private Drawing AddImagePart(Uri imageUrl, String imageSource, String alt, Size preferredSize)
        {
            if (imageObjId == UInt32.MinValue)
            {
                // In order to add images in the document, we need to asisgn an unique id
                // to each Drawing object. So we'll loop through all of the existing <wp:docPr> elements
                // to find the largest Id, then increment it for each new image.

                drawingObjId = 1;                 // 1 is the minimum ID set by MS Office.
                imageObjId   = 1;
                foreach (var d in mainPart.Document.Body.Descendants <Drawing>())
                {
                    if (d.Inline == null)
                    {
                        continue;                                       // fix some rare issue where Inline is null (reported by scwebgroup)
                    }
                    if (d.Inline.DocProperties.Id > drawingObjId)
                    {
                        drawingObjId = d.Inline.DocProperties.Id;
                    }

                    var nvPr = d.Inline.Graphic.GraphicData.GetFirstChild <pic.NonVisualPictureProperties>();
                    if (nvPr != null && nvPr.NonVisualDrawingProperties.Id > imageObjId)
                    {
                        imageObjId = nvPr.NonVisualDrawingProperties.Id;
                    }
                }
                if (drawingObjId > 1)
                {
                    drawingObjId++;
                }
                if (imageObjId > 1)
                {
                    imageObjId++;
                }
            }

            // Cache all the ImagePart processed to avoid downloading the same image.
            CachedImagePart imagePart = null;

            // if imageUrl is null, we may consider imageSource is a DataUri.
            // thus, no need to download and cache anything
            if (imageUrl == null || !knownImageParts.TryGetValue(imageUrl, out imagePart))
            {
                HtmlImageInfo             iinfo    = null;
                ImageProvisioningProvider provider = new ImageProvisioningProvider(this.WebProxy, preferredSize);

                if (imageUrl == null)
                {
                    iinfo = provider.DownloadData(DataUri.Parse(imageSource));
                }
                else if (this.ImageProcessing == ImageProcessing.ManualProvisioning)
                {
                    // as HtmlImageInfo is a class, the EventArgs will act as a proxy
                    iinfo = new HtmlImageInfo()
                    {
                        Size = preferredSize
                    };
                    ProvisionImageEventArgs args = new ProvisionImageEventArgs(imageUrl, iinfo);
                    OnProvisionImage(args);

                    // did the user want to ignore this image?
                    if (args.Cancel)
                    {
                        return(null);
                    }
                }

                // Automatic Processing or the user did not supply himself the image and did not cancel the provisioning.
                // We download ourself the image.
                if (iinfo == null || (iinfo.RawData == null && imageUrl.IsAbsoluteUri))
                {
                    iinfo = provider.DownloadData(imageUrl);
                }

                if (!ImageProvisioningProvider.Provision(iinfo, imageUrl))
                {
                    return(null);
                }

                ImagePart ipart = mainPart.AddImagePart(iinfo.Type.Value);
                imagePart = new CachedImagePart()
                {
                    Part = ipart
                };
                imagePart.Width  = iinfo.Size.Width;
                imagePart.Height = iinfo.Size.Height;

                using (Stream outputStream = ipart.GetStream(FileMode.Create))
                {
                    outputStream.Write(iinfo.RawData, 0, iinfo.RawData.Length);
                    outputStream.Seek(0L, SeekOrigin.Begin);
                }

                if (imageUrl != null)                 // don't need to cache inlined-image
                {
                    knownImageParts.Add(imageUrl, imagePart);
                }
            }

            if (preferredSize.IsEmpty)
            {
                preferredSize.Width  = imagePart.Width;
                preferredSize.Height = imagePart.Height;
            }
            else if (preferredSize.Width <= 0 || preferredSize.Height <= 0)
            {
                Size actualSize = new Size(imagePart.Width, imagePart.Height);
                preferredSize = ImageHeader.KeepAspectRatio(actualSize, preferredSize);
            }

            String imagePartId  = mainPart.GetIdOfPart(imagePart.Part);
            long   widthInEmus  = new Unit(UnitMetric.Pixel, preferredSize.Width).ValueInEmus;
            long   heightInEmus = new Unit(UnitMetric.Pixel, preferredSize.Height).ValueInEmus;

            ++drawingObjId;
            ++imageObjId;

            var img = new Drawing(
                new wp.Inline(
                    new wp.Extent()
            {
                Cx = widthInEmus, Cy = heightInEmus
            },
                    new wp.EffectExtent()
            {
                LeftEdge = 19050L, TopEdge = 0L, RightEdge = 0L, BottomEdge = 0L
            },
                    new wp.DocProperties()
            {
                Id = drawingObjId, Name = imageSource, Description = String.Empty
            },
                    new wp.NonVisualGraphicFrameDrawingProperties {
                GraphicFrameLocks = new a.GraphicFrameLocks()
                {
                    NoChangeAspect = true
                }
            },
                    new a.Graphic(
                        new a.GraphicData(
                            new pic.Picture(
                                new pic.NonVisualPictureProperties {
                NonVisualDrawingProperties = new pic.NonVisualDrawingProperties()
                {
                    Id = imageObjId, Name = imageSource, Description = alt
                },
                NonVisualPictureDrawingProperties = new pic.NonVisualPictureDrawingProperties(
                    new a.PictureLocks()
                {
                    NoChangeAspect = true, NoChangeArrowheads = true
                })
            },
                                new pic.BlipFill(
                                    new a.Blip()
            {
                Embed = imagePartId
            },
                                    new a.SourceRectangle(),
                                    new a.Stretch(
                                        new a.FillRectangle())),
                                new pic.ShapeProperties(
                                    new a.Transform2D(
                                        new a.Offset()
            {
                X = 0L, Y = 0L
            },
                                        new a.Extents()
            {
                Cx = widthInEmus, Cy = heightInEmus
            }),
                                    new a.PresetGeometry(
                                        new a.AdjustValueList()
                                        )
            {
                Preset = a.ShapeTypeValues.Rectangle
            }
                                    )
            {
                BlackWhiteMode = a.BlackWhiteModeValues.Auto
            })
                            )
            {
                Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture"
            })
                    )
            {
                DistanceFromTop = (UInt32Value)0U, DistanceFromBottom = (UInt32Value)0U, DistanceFromLeft = (UInt32Value)0U, DistanceFromRight = (UInt32Value)0U
            }
                );

            return(img);
        }
Esempio n. 13
0
        /// <summary>
        /// Gets the object.
        /// </summary>
        /// <param name="model">The model.</param>
        /// <param name="db">The db.</param>
        /// <returns></returns>
        /// <exception cref="Glass.Mapper.MapperException">Failed to find context {0}.Formatted(ContextName)</exception>
        public virtual object GetObject(string model, Database db, Rendering renderingItem)
        {
            if (model.IsNullOrEmpty())
            {
                return(null);
            }

            //must be a path to a Model item
            if (model.StartsWith("/sitecore"))
            {
                var target = db.GetItem(model);
                if (target == null)
                {
                    return(null);
                }

                string newModel = target[ModelTypeField];
                return(GetObject(newModel, db, renderingItem));
            }
            //if guid must be that to Model item
            Guid targetId;

            if (Guid.TryParse(model, out targetId))
            {
                var target = db.GetItem(new ID(targetId));
                if (target == null)
                {
                    return(null);
                }

                string newModel = target[ModelTypeField];
                return(GetObject(newModel, db, renderingItem));
            }


            var type = Type.GetType(model, false);

            if (type == null || renderingModelType.IsAssignableFrom(type))
            {
                return(null);
            }

            IMvcContext mvcContext = new MvcContext(new SitecoreService(Sitecore.Context.Database));

            //this is really aggressive
            if (!mvcContext.SitecoreService.GlassContext.TypeConfigurations.ContainsKey(type))
            {
                //if the config is null then it is probably an ondemand mapping so we have to load the ondemand part

                IConfigurationLoader loader =
                    new OnDemandLoader <SitecoreTypeConfiguration>(type);
                mvcContext.SitecoreService.GlassContext.Load(loader);
            }

            if (renderingItem.DataSource.HasValue())
            {
                // Switch to handle AB test datasources which contain Sitecore reference
                // syntax
                //TODO: repeated code - refactor to a helper and use in IMvcContext
                var item = renderingItem.DataSource.StartsWith("sitecore://", StringComparison.Ordinal) ?
                           Sitecore.Context.Database.GetItem(DataUri.Parse(renderingItem.DataSource)) :
                           MvcSettings.ItemLocator.GetItem(renderingItem.DataSource);

                var getOptions = new GetItemByItemOptions()
                {
                    Item = item,
                    Type = type
                };

                return(mvcContext.SitecoreService.GetItem(getOptions));
            }

            if (renderingItem.RenderingItem.DataSource.HasValue())
            {
                var getOptions = new GetItemByPathOptions()
                {
                    Path = renderingItem.RenderingItem.DataSource,
                    Type = type
                };
                return(mvcContext.SitecoreService.GetItem(getOptions));
            }

            /**
             * Issues #82:
             * Check Item before defaulting to the current item.
             */
            if (renderingItem.Item != null)
            {
                var getOptions = new GetItemByItemOptions()
                {
                    Item = renderingItem.Item,
                    Type = type
                };
                return(mvcContext.SitecoreService.GetItem(getOptions));
            }
            else
            {
                //TODO? shoudl we use the GetCurrentitem
                var getOptions = new GetItemByItemOptions()
                {
                    Item = mvcContext.ContextItem,
                    Type = type
                };
                return(mvcContext.SitecoreService.GetItem(getOptions));
            }
        }