highcharts 9.1.1 → 9.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bower.json +1 -1
- package/css/annotations/popup.css +29 -28
- package/css/annotations/popup.scss +29 -27
- package/css/highcharts.css +15 -0
- package/css/highcharts.scss +12 -0
- package/css/stocktools/gui.css +1 -0
- package/css/stocktools/gui.scss +1 -0
- package/css/themes/dark-unica.css +15 -0
- package/css/themes/grid-light.css +15 -0
- package/css/themes/sand-signika.css +15 -0
- package/es-modules/Accessibility/Components/InfoRegionsComponent.js +8 -2
- package/es-modules/Accessibility/Components/LegendComponent.js +19 -8
- package/es-modules/Accessibility/Components/MenuComponent.js +19 -13
- package/es-modules/Accessibility/Components/SeriesComponent/SeriesDescriber.js +4 -8
- package/es-modules/Accessibility/FocusBorder.js +1 -3
- package/es-modules/Accessibility/Options/LangOptions.js +3 -3
- package/es-modules/Accessibility/Utils/Announcer.js +22 -5
- package/es-modules/Accessibility/Utils/ChartUtilities.js +6 -1
- package/es-modules/Core/Animation/AnimationUtilities.js +12 -4
- package/es-modules/Core/Animation/Fx.js +15 -12
- package/es-modules/Core/Axis/Axis.js +25 -13
- package/es-modules/Core/Axis/AxisDefaults.js +0 -1
- package/es-modules/Core/Axis/BrokenAxis.js +32 -15
- package/es-modules/Core/Axis/Color/ColorAxis.js +665 -0
- package/es-modules/Core/Axis/Color/ColorAxisComposition.js +237 -0
- package/es-modules/Core/Axis/Color/ColorAxisDefaults.js +434 -0
- package/es-modules/Core/Axis/DateTimeAxis.js +163 -133
- package/es-modules/Core/Axis/GridAxis.js +8 -3
- package/es-modules/Core/Axis/LogarithmicAxis.js +159 -117
- package/es-modules/Core/Axis/OrdinalAxis.js +666 -460
- package/es-modules/Core/Axis/PlotLineOrBand/PlotLineOrBand.js +874 -0
- package/es-modules/Core/Axis/PlotLineOrBand/PlotLineOrBandAxis.js +292 -0
- package/es-modules/Core/Axis/RadialAxis.js +858 -745
- package/es-modules/Core/Axis/ScrollbarAxis.js +7 -0
- package/es-modules/Core/Axis/StackingAxis.js +159 -140
- package/es-modules/Core/Axis/Tick.js +17 -27
- package/es-modules/Core/Chart/Chart.js +24 -38
- package/es-modules/Core/Chart/ChartDefaults.js +1 -1
- package/es-modules/Core/Chart/StockChart.js +12 -0
- package/es-modules/Core/Color/Color.js +96 -104
- package/es-modules/Core/DefaultOptions.js +269 -248
- package/es-modules/Core/Foundation.js +9 -8
- package/es-modules/Core/Geometry/CircleUtilities.js +385 -0
- package/es-modules/Core/Geometry/GeometryUtilities.js +83 -0
- package/es-modules/Core/Globals.js +23 -1
- package/es-modules/{Extensions/Ajax.js → Core/HttpUtilities.js} +86 -42
- package/es-modules/Core/{Legend.js → Legend/Legend.js} +142 -116
- package/es-modules/{Mixins → Core/Legend}/LegendSymbol.js +54 -38
- package/es-modules/Core/Navigator.js +3 -0
- package/es-modules/Core/Pointer.js +9 -0
- package/es-modules/Core/Renderer/HTML/AST.js +100 -82
- package/es-modules/Core/Renderer/HTML/HTMLElement.js +17 -7
- package/es-modules/Core/Renderer/HTML/HTMLRenderer.js +26 -9
- package/es-modules/Core/Renderer/RendererRegistry.js +9 -4
- package/es-modules/Core/Renderer/RendererUtilities.js +159 -0
- package/es-modules/Core/Renderer/SVG/SVGElement.js +13 -7
- package/es-modules/Core/Renderer/SVG/SVGLabel.js +9 -29
- package/es-modules/Core/Renderer/SVG/SVGRenderer.js +2 -2
- package/es-modules/Core/Renderer/SVG/TextBuilder.js +18 -16
- package/es-modules/Core/Responsive.js +166 -148
- package/es-modules/Core/Series/DataLabel.js +564 -0
- package/es-modules/Core/Series/Point.js +233 -209
- package/es-modules/Core/Series/Series.js +174 -2339
- package/es-modules/Core/Series/SeriesDefaults.js +2293 -0
- package/es-modules/Core/Series/SeriesRegistry.js +3 -9
- package/es-modules/Core/Time.js +78 -2
- package/es-modules/Core/Tooltip.js +178 -236
- package/es-modules/Core/Utilities.js +409 -394
- package/es-modules/Extensions/Annotations/Annotations.js +102 -49
- package/es-modules/Extensions/Annotations/Mixins/EventEmitterMixin.js +9 -1
- package/es-modules/Extensions/Annotations/NavigationBindings.js +30 -25
- package/es-modules/Extensions/Annotations/Popup.js +16 -7
- package/es-modules/Extensions/Boost/BoostOverrides.js +5 -1
- package/es-modules/Extensions/Boost/WGLRenderer.js +5 -4
- package/es-modules/Extensions/Boost/WGLVBuffer.js +3 -0
- package/es-modules/Extensions/BoostCanvas.js +1 -1
- package/es-modules/Extensions/CurrentDateIndication.js +1 -1
- package/es-modules/Extensions/Data.js +82 -76
- package/es-modules/Extensions/DataGrouping.js +225 -184
- package/es-modules/Extensions/Debugger/ErrorMessages.js +2 -2
- package/es-modules/Extensions/DraggablePoints.js +13 -5
- package/es-modules/Extensions/Drilldown.js +41 -14
- package/es-modules/Extensions/ExportData.js +7 -4
- package/es-modules/Extensions/Exporting/Exporting.js +1273 -0
- package/es-modules/Extensions/Exporting/ExportingDefaults.js +803 -0
- package/es-modules/Extensions/Exporting/ExportingSymbols.js +73 -0
- package/es-modules/Extensions/FullScreen.js +7 -5
- package/es-modules/Extensions/NoDataToDisplay.js +1 -1
- package/es-modules/Extensions/OfflineExporting/OfflineExporting.js +617 -0
- package/es-modules/Extensions/OfflineExporting/OfflineExportingDefaults.js +58 -0
- package/es-modules/Extensions/Oldie/Oldie.js +1 -1
- package/es-modules/Extensions/Pane.js +0 -1
- package/es-modules/Extensions/PatternFill.js +23 -10
- package/es-modules/Extensions/Polar.js +2 -1
- package/es-modules/Extensions/RangeSelector.js +1 -1
- package/es-modules/Extensions/Themes/Avocado.js +49 -20
- package/es-modules/Extensions/Themes/DarkBlue.js +226 -203
- package/es-modules/Extensions/Themes/DarkGreen.js +231 -203
- package/es-modules/Extensions/Themes/DarkUnica.js +201 -172
- package/es-modules/Extensions/Themes/Gray.js +228 -205
- package/es-modules/Extensions/Themes/Grid.js +109 -81
- package/es-modules/Extensions/Themes/GridLight.js +83 -55
- package/es-modules/Extensions/Themes/HighContrastDark.js +192 -164
- package/es-modules/Extensions/Themes/HighContrastLight.js +49 -21
- package/es-modules/Extensions/Themes/SandSignika.js +115 -86
- package/es-modules/Extensions/Themes/Skies.js +102 -74
- package/es-modules/Extensions/Themes/Sunset.js +47 -19
- package/es-modules/Mixins/ColorSeries.js +0 -1
- package/es-modules/Mixins/MultipleLines.js +6 -0
- package/es-modules/Mixins/TreeSeries.js +1 -1
- package/es-modules/Series/Area/AreaSeries.js +2 -2
- package/es-modules/Series/AreaSpline/AreaSplineSeries.js +2 -2
- package/es-modules/Series/Bubble/BubbleLegendComposition.js +279 -0
- package/es-modules/Series/Bubble/BubbleLegendDefaults.js +267 -0
- package/es-modules/Series/Bubble/BubbleLegendItem.js +472 -0
- package/es-modules/Series/Bubble/BubbleSeries.js +6 -2
- package/es-modules/Series/Column/ColumnDataLabel.js +109 -0
- package/es-modules/Series/Column/ColumnSeries.js +39 -26
- package/es-modules/Series/Column3D/Column3DComposition.js +5 -2
- package/es-modules/Series/Flags/FlagsSeries.js +8 -1
- package/es-modules/Series/Gantt/GanttSeries.js +3 -3
- package/es-modules/Series/Heatmap/HeatmapSeries.js +9 -5
- package/es-modules/Series/HeikinAshi/HeikinAshiPoint.js +60 -0
- package/es-modules/Series/HeikinAshi/HeikinAshiSeries.js +277 -0
- package/es-modules/Series/HollowCandlestick/HollowCandlestickPoint.js +83 -0
- package/es-modules/Series/HollowCandlestick/HollowCandlestickSeries.js +370 -0
- package/es-modules/Series/Line/LineSeries.js +12 -8
- package/es-modules/Series/Map/MapSeries.js +5 -3
- package/es-modules/Series/MapBubble/MapBubbleSeries.js +6 -5
- package/es-modules/Series/OHLC/OHLCPoint.js +11 -0
- package/es-modules/Series/PackedBubble/PackedBubbleSeries.js +3 -1
- package/es-modules/Series/Pie/PieDataLabel.js +448 -0
- package/es-modules/Series/Pie/PiePoint.js +35 -34
- package/es-modules/Series/Pie/PieSeries.js +19 -16
- package/es-modules/Series/Polygon/PolygonSeries.js +3 -3
- package/es-modules/Series/Sankey/SankeySeries.js +9 -7
- package/es-modules/Series/SolidGauge/SolidGaugeSeries.js +2 -2
- package/es-modules/Series/Sunburst/SunburstSeries.js +1 -14
- package/es-modules/Series/Timeline/TimelinePoint.js +6 -0
- package/es-modules/Series/Timeline/TimelineSeries.js +14 -17
- package/es-modules/Series/Treemap/TreemapSeries.js +3 -3
- package/es-modules/Series/Venn/VennSeries.js +4 -4
- package/es-modules/Series/Venn/VennUtils.js +10 -16
- package/es-modules/Series/Waterfall/WaterfallSeries.js +40 -35
- package/es-modules/Series/Wordcloud/WordcloudSeries.js +1 -0
- package/es-modules/Series/XRange/XRangeSeries.js +4 -2
- package/es-modules/Stock/Indicators/SMA/SMAIndicator.js +92 -75
- package/es-modules/Stock/Indicators/Supertrend/SupertrendIndicator.js +20 -8
- package/es-modules/Stock/Indicators/VBP/VBPIndicator.js +17 -4
- package/es-modules/Stock/StockToolsBindings.js +77 -38
- package/es-modules/Stock/StockToolsGui.js +28 -3
- package/es-modules/masters/highcharts-3d.src.js +1 -1
- package/es-modules/masters/highcharts-gantt.src.js +1 -1
- package/es-modules/masters/highcharts-more.src.js +11 -7
- package/es-modules/masters/highcharts.src.js +25 -9
- package/es-modules/masters/highmaps.src.js +1 -1
- package/es-modules/masters/highstock.src.js +1 -1
- package/es-modules/masters/indicators/acceleration-bands.src.js +1 -1
- package/es-modules/masters/indicators/accumulation-distribution.src.js +1 -1
- package/es-modules/masters/indicators/ao.src.js +1 -1
- package/es-modules/masters/indicators/apo.src.js +1 -1
- package/es-modules/masters/indicators/aroon-oscillator.src.js +1 -1
- package/es-modules/masters/indicators/aroon.src.js +1 -1
- package/es-modules/masters/indicators/atr.src.js +1 -1
- package/es-modules/masters/indicators/bollinger-bands.src.js +1 -1
- package/es-modules/masters/indicators/cci.src.js +1 -1
- package/es-modules/masters/indicators/chaikin.src.js +1 -1
- package/es-modules/masters/indicators/cmf.src.js +1 -1
- package/es-modules/masters/indicators/cmo.src.js +1 -1
- package/es-modules/masters/indicators/dema.src.js +1 -1
- package/es-modules/masters/indicators/disparity-index.src.js +1 -1
- package/es-modules/masters/indicators/dmi.src.js +1 -1
- package/es-modules/masters/indicators/dpo.src.js +1 -1
- package/es-modules/masters/indicators/ema.src.js +1 -1
- package/es-modules/masters/indicators/ichimoku-kinko-hyo.src.js +1 -1
- package/es-modules/masters/indicators/indicators-all.src.js +1 -1
- package/es-modules/masters/indicators/indicators.src.js +1 -1
- package/es-modules/masters/indicators/keltner-channels.src.js +1 -1
- package/es-modules/masters/indicators/klinger.src.js +1 -1
- package/es-modules/masters/indicators/macd.src.js +1 -1
- package/es-modules/masters/indicators/mfi.src.js +1 -1
- package/es-modules/masters/indicators/momentum.src.js +1 -1
- package/es-modules/masters/indicators/natr.src.js +1 -1
- package/es-modules/masters/indicators/obv.src.js +1 -1
- package/es-modules/masters/indicators/pivot-points.src.js +1 -1
- package/es-modules/masters/indicators/ppo.src.js +1 -1
- package/es-modules/masters/indicators/price-channel.src.js +1 -1
- package/es-modules/masters/indicators/price-envelopes.src.js +1 -1
- package/es-modules/masters/indicators/psar.src.js +1 -1
- package/es-modules/masters/indicators/regressions.src.js +1 -1
- package/es-modules/masters/indicators/roc.src.js +1 -1
- package/es-modules/masters/indicators/rsi.src.js +1 -1
- package/es-modules/masters/indicators/slow-stochastic.src.js +1 -1
- package/es-modules/masters/indicators/stochastic.src.js +1 -1
- package/es-modules/masters/indicators/supertrend.src.js +1 -1
- package/es-modules/masters/indicators/tema.src.js +1 -1
- package/es-modules/masters/indicators/trendline.src.js +1 -1
- package/es-modules/masters/indicators/trix.src.js +1 -1
- package/es-modules/masters/indicators/volume-by-price.src.js +1 -1
- package/es-modules/masters/indicators/vwap.src.js +1 -1
- package/es-modules/masters/indicators/williams-r.src.js +1 -1
- package/es-modules/masters/indicators/wma.src.js +1 -1
- package/es-modules/masters/indicators/zigzag.src.js +1 -1
- package/es-modules/masters/modules/accessibility.src.js +1 -1
- package/es-modules/masters/modules/annotations-advanced.src.js +1 -1
- package/es-modules/masters/modules/annotations.src.js +1 -1
- package/es-modules/masters/modules/arrow-symbols.src.js +1 -1
- package/es-modules/masters/modules/boost-canvas.src.js +1 -1
- package/es-modules/masters/modules/boost.src.js +1 -1
- package/es-modules/masters/modules/broken-axis.src.js +1 -1
- package/es-modules/masters/modules/bullet.src.js +1 -1
- package/es-modules/masters/modules/coloraxis.src.js +6 -2
- package/es-modules/masters/modules/current-date-indicator.src.js +1 -1
- package/es-modules/masters/modules/cylinder.src.js +1 -1
- package/es-modules/masters/modules/data.src.js +8 -1
- package/es-modules/masters/modules/datagrouping.src.js +1 -1
- package/es-modules/masters/modules/debugger.src.js +1 -1
- package/es-modules/masters/modules/dependency-wheel.src.js +1 -1
- package/es-modules/masters/modules/dotplot.src.js +1 -1
- package/es-modules/masters/modules/drag-panes.src.js +1 -1
- package/es-modules/masters/modules/draggable-points.src.js +1 -1
- package/es-modules/masters/modules/drilldown.src.js +1 -1
- package/es-modules/masters/modules/dumbbell.src.js +1 -1
- package/es-modules/masters/modules/export-data.src.js +1 -1
- package/es-modules/masters/modules/exporting.src.js +10 -2
- package/es-modules/masters/modules/full-screen.src.js +1 -1
- package/es-modules/masters/modules/funnel.src.js +1 -1
- package/es-modules/masters/modules/funnel3d.src.js +1 -1
- package/es-modules/masters/modules/gantt.src.js +9 -4
- package/es-modules/masters/modules/grid-axis.src.js +1 -1
- package/es-modules/masters/modules/heatmap.src.js +6 -2
- package/es-modules/masters/modules/heikinashi.src.js +14 -0
- package/es-modules/masters/modules/histogram-bellcurve.src.js +1 -1
- package/es-modules/masters/modules/hollowcandlestick.src.js +14 -0
- package/es-modules/masters/modules/item-series.src.js +1 -1
- package/es-modules/masters/modules/lollipop.src.js +1 -1
- package/es-modules/masters/modules/map.src.js +10 -6
- package/es-modules/masters/modules/marker-clusters.src.js +1 -1
- package/es-modules/masters/modules/networkgraph.src.js +1 -1
- package/es-modules/masters/modules/no-data-to-display.src.js +1 -1
- package/es-modules/masters/modules/offline-exporting.src.js +8 -2
- package/es-modules/masters/modules/oldie-polyfills.src.js +1 -1
- package/es-modules/masters/modules/oldie.src.js +1 -1
- package/es-modules/masters/modules/organization.src.js +1 -1
- package/es-modules/masters/modules/overlapping-datalabels.src.js +1 -1
- package/es-modules/masters/modules/parallel-coordinates.src.js +1 -1
- package/es-modules/masters/modules/pareto.src.js +1 -1
- package/es-modules/masters/modules/pathfinder.src.js +1 -1
- package/es-modules/masters/modules/pattern-fill.src.js +1 -1
- package/es-modules/masters/modules/price-indicator.src.js +1 -1
- package/es-modules/masters/modules/pyramid3d.src.js +1 -1
- package/es-modules/masters/modules/sankey.src.js +1 -1
- package/es-modules/masters/modules/series-label.src.js +1 -1
- package/es-modules/masters/modules/solid-gauge.src.js +1 -1
- package/es-modules/masters/modules/sonification.src.js +1 -1
- package/es-modules/masters/modules/static-scale.src.js +1 -1
- package/es-modules/masters/modules/stock-tools.src.js +1 -1
- package/es-modules/masters/modules/stock.src.js +3 -2
- package/es-modules/masters/modules/streamgraph.src.js +1 -1
- package/es-modules/masters/modules/sunburst.src.js +1 -1
- package/es-modules/masters/modules/tilemap.src.js +1 -1
- package/es-modules/masters/modules/timeline.src.js +1 -1
- package/es-modules/masters/modules/treegrid.src.js +1 -1
- package/es-modules/masters/modules/treemap.src.js +1 -1
- package/es-modules/masters/modules/variable-pie.src.js +1 -1
- package/es-modules/masters/modules/variwide.src.js +1 -1
- package/es-modules/masters/modules/vector.src.js +1 -1
- package/es-modules/masters/modules/venn.src.js +1 -1
- package/es-modules/masters/modules/windbarb.src.js +1 -1
- package/es-modules/masters/modules/wordcloud.src.js +1 -1
- package/es-modules/masters/modules/xrange.src.js +1 -1
- package/es-modules/masters/themes/avocado.src.js +5 -2
- package/es-modules/masters/themes/dark-blue.src.js +5 -2
- package/es-modules/masters/themes/dark-green.src.js +5 -2
- package/es-modules/masters/themes/dark-unica.src.js +5 -2
- package/es-modules/masters/themes/gray.src.js +5 -2
- package/es-modules/masters/themes/grid-light.src.js +5 -2
- package/es-modules/masters/themes/grid.src.js +5 -2
- package/es-modules/masters/themes/high-contrast-dark.src.js +5 -2
- package/es-modules/masters/themes/high-contrast-light.src.js +5 -2
- package/es-modules/masters/themes/sand-signika.src.js +5 -2
- package/es-modules/masters/themes/skies.src.js +5 -2
- package/es-modules/masters/themes/sunset.src.js +5 -2
- package/gfx/stock-icons/annotations-hidden.svg +1 -1
- package/gfx/stock-icons/annotations-visible.svg +2 -2
- package/gfx/stock-icons/arrow-bottom.svg +1 -1
- package/gfx/stock-icons/arrow-left.svg +1 -1
- package/gfx/stock-icons/arrow-line.svg +1 -1
- package/gfx/stock-icons/arrow-ray.svg +1 -1
- package/gfx/stock-icons/arrow-right.svg +1 -1
- package/gfx/stock-icons/arrow-segment.svg +1 -2
- package/gfx/stock-icons/circle.svg +1 -1
- package/gfx/stock-icons/close.svg +2 -2
- package/gfx/stock-icons/crooked-3.svg +1 -1
- package/gfx/stock-icons/crooked-5.svg +1 -1
- package/gfx/stock-icons/current-price-hide.svg +3 -3
- package/gfx/stock-icons/current-price-show.svg +2 -2
- package/gfx/stock-icons/destroy.svg +1 -1
- package/gfx/stock-icons/drawing.svg +18 -0
- package/gfx/stock-icons/edit.svg +1 -1
- package/gfx/stock-icons/elliott-3.svg +1 -1
- package/gfx/stock-icons/elliott-5.svg +1 -1
- package/gfx/stock-icons/ellipse.svg +11 -0
- package/gfx/stock-icons/fibonacci-timezone.svg +16 -0
- package/gfx/stock-icons/fibonacci.svg +1 -1
- package/gfx/stock-icons/flag-basic.svg +1 -1
- package/gfx/stock-icons/flag-diamond.svg +2 -2
- package/gfx/stock-icons/flag-elipse.svg +1 -1
- package/gfx/stock-icons/flag-trapeze.svg +2 -2
- package/gfx/stock-icons/fullscreen.svg +4 -4
- package/gfx/stock-icons/horizontal-line.svg +1 -1
- package/gfx/stock-icons/indicators.svg +3 -3
- package/gfx/stock-icons/label.svg +4 -4
- package/gfx/stock-icons/line.svg +1 -1
- package/gfx/stock-icons/linear.svg +11 -0
- package/gfx/stock-icons/logarithmic.svg +1 -0
- package/gfx/stock-icons/measure-x.svg +2 -2
- package/gfx/stock-icons/measure-xy.svg +1 -1
- package/gfx/stock-icons/measure-y.svg +1 -1
- package/gfx/stock-icons/panning.svg +17 -0
- package/gfx/stock-icons/parallel-channel.svg +1 -1
- package/gfx/stock-icons/pitchfork.svg +1 -1
- package/gfx/stock-icons/ray.svg +1 -1
- package/gfx/stock-icons/rectangle.svg +1 -1
- package/gfx/stock-icons/remove-annotations.svg +2 -2
- package/gfx/stock-icons/save-chart.svg +3 -3
- package/gfx/stock-icons/segment.svg +1 -1
- package/gfx/stock-icons/separator.svg +1 -1
- package/gfx/stock-icons/series-candlestick.svg +1 -1
- package/gfx/stock-icons/series-heikin-ashi.svg +1 -0
- package/gfx/stock-icons/series-hlc.svg +1 -0
- package/gfx/stock-icons/series-hollow-candlestick.svg +1 -0
- package/gfx/stock-icons/series-line.svg +1 -1
- package/gfx/stock-icons/series-ohlc.svg +4 -4
- package/gfx/stock-icons/time-cycles.svg +35 -0
- package/gfx/stock-icons/vertical-arrow.svg +1 -1
- package/gfx/stock-icons/vertical-counter.svg +1 -1
- package/gfx/stock-icons/vertical-double-arrow.svg +1 -1
- package/gfx/stock-icons/vertical-label.svg +3 -3
- package/gfx/stock-icons/vertical-line.svg +1 -1
- package/gfx/stock-icons/zoom-x.svg +2 -2
- package/gfx/stock-icons/zoom-xy.svg +2 -2
- package/gfx/stock-icons/zoom-y.svg +2 -2
- package/highcharts-3d.js +24 -24
- package/highcharts-3d.js.map +1 -1
- package/highcharts-3d.src.js +6 -3
- package/highcharts-gantt.js +800 -792
- package/highcharts-gantt.js.map +1 -1
- package/highcharts-gantt.src.js +16535 -15918
- package/highcharts-more.d.ts +73 -1
- package/highcharts-more.js +193 -192
- package/highcharts-more.js.map +1 -1
- package/highcharts-more.src.d.ts +73 -1
- package/highcharts-more.src.js +8044 -7839
- package/highcharts.d.ts +3850 -177
- package/highcharts.js +589 -581
- package/highcharts.js.map +1 -1
- package/highcharts.src.d.ts +3850 -177
- package/highcharts.src.js +16635 -16060
- package/highmaps.js +708 -698
- package/highmaps.js.map +1 -1
- package/highmaps.src.js +17419 -16521
- package/highstock.js +782 -769
- package/highstock.js.map +1 -1
- package/highstock.src.js +28867 -27975
- package/indicators/acceleration-bands.js +9 -9
- package/indicators/acceleration-bands.js.map +1 -1
- package/indicators/acceleration-bands.src.js +7 -1
- package/indicators/accumulation-distribution.js +1 -1
- package/indicators/accumulation-distribution.src.js +1 -1
- package/indicators/ao.js +1 -1
- package/indicators/ao.src.js +1 -1
- package/indicators/apo.js +1 -1
- package/indicators/apo.src.js +1 -1
- package/indicators/aroon-oscillator.js +9 -9
- package/indicators/aroon-oscillator.js.map +1 -1
- package/indicators/aroon-oscillator.src.js +7 -1
- package/indicators/aroon.js +9 -9
- package/indicators/aroon.js.map +1 -1
- package/indicators/aroon.src.js +7 -1
- package/indicators/atr.js +1 -1
- package/indicators/atr.src.js +1 -1
- package/indicators/bollinger-bands.js +9 -9
- package/indicators/bollinger-bands.js.map +1 -1
- package/indicators/bollinger-bands.src.js +7 -1
- package/indicators/cci.js +1 -1
- package/indicators/cci.src.js +1 -1
- package/indicators/chaikin.js +1 -1
- package/indicators/chaikin.src.js +1 -1
- package/indicators/cmf.js +1 -1
- package/indicators/cmf.src.js +1 -1
- package/indicators/cmo.js +1 -1
- package/indicators/cmo.src.js +1 -1
- package/indicators/dema.js +1 -1
- package/indicators/dema.src.js +1 -1
- package/indicators/disparity-index.js +1 -1
- package/indicators/disparity-index.src.js +1 -1
- package/indicators/dmi.js +11 -11
- package/indicators/dmi.js.map +1 -1
- package/indicators/dmi.src.js +7 -1
- package/indicators/dpo.js +1 -1
- package/indicators/dpo.src.js +1 -1
- package/indicators/ema.js +1 -1
- package/indicators/ema.src.js +1 -1
- package/indicators/ichimoku-kinko-hyo.js +1 -1
- package/indicators/ichimoku-kinko-hyo.src.js +1 -1
- package/indicators/indicators-all.js +203 -200
- package/indicators/indicators-all.js.map +1 -1
- package/indicators/indicators-all.src.js +206 -104
- package/indicators/indicators.js +12 -11
- package/indicators/indicators.js.map +1 -1
- package/indicators/indicators.src.js +108 -90
- package/indicators/keltner-channels.js +9 -9
- package/indicators/keltner-channels.js.map +1 -1
- package/indicators/keltner-channels.src.js +7 -1
- package/indicators/klinger.js +13 -13
- package/indicators/klinger.js.map +1 -1
- package/indicators/klinger.src.js +7 -1
- package/indicators/macd.js +1 -1
- package/indicators/macd.src.js +1 -1
- package/indicators/mfi.js +1 -1
- package/indicators/mfi.src.js +1 -1
- package/indicators/momentum.js +1 -1
- package/indicators/momentum.src.js +1 -1
- package/indicators/natr.js +1 -1
- package/indicators/natr.src.js +1 -1
- package/indicators/obv.js +1 -1
- package/indicators/obv.src.js +1 -1
- package/indicators/pivot-points.js +1 -1
- package/indicators/pivot-points.src.js +1 -1
- package/indicators/ppo.js +1 -1
- package/indicators/ppo.src.js +1 -1
- package/indicators/price-channel.js +9 -9
- package/indicators/price-channel.js.map +1 -1
- package/indicators/price-channel.src.js +7 -1
- package/indicators/price-envelopes.js +1 -1
- package/indicators/price-envelopes.src.js +1 -1
- package/indicators/psar.js +1 -1
- package/indicators/psar.src.js +1 -1
- package/indicators/regressions.js +1 -1
- package/indicators/regressions.src.js +1 -1
- package/indicators/roc.js +1 -1
- package/indicators/roc.src.js +1 -1
- package/indicators/rsi.js +1 -1
- package/indicators/rsi.src.js +1 -1
- package/indicators/slow-stochastic.js +1 -1
- package/indicators/slow-stochastic.src.js +1 -1
- package/indicators/stochastic.js +10 -10
- package/indicators/stochastic.js.map +1 -1
- package/indicators/stochastic.src.js +7 -1
- package/indicators/supertrend.js +10 -10
- package/indicators/supertrend.js.map +1 -1
- package/indicators/supertrend.src.js +23 -10
- package/indicators/tema.js +1 -1
- package/indicators/tema.src.js +1 -1
- package/indicators/trendline.js +1 -1
- package/indicators/trendline.src.js +1 -1
- package/indicators/trix.js +1 -1
- package/indicators/trix.src.js +1 -1
- package/indicators/volume-by-price.js +17 -15
- package/indicators/volume-by-price.js.map +1 -1
- package/indicators/volume-by-price.src.js +71 -6
- package/indicators/vwap.js +1 -1
- package/indicators/vwap.src.js +1 -1
- package/indicators/williams-r.js +1 -1
- package/indicators/williams-r.src.js +1 -1
- package/indicators/wma.js +1 -1
- package/indicators/wma.src.js +1 -1
- package/indicators/zigzag.js +1 -1
- package/indicators/zigzag.src.js +1 -1
- package/modules/accessibility.js +203 -202
- package/modules/accessibility.js.map +1 -1
- package/modules/accessibility.src.js +89 -49
- package/modules/annotations-advanced.js +164 -163
- package/modules/annotations-advanced.js.map +1 -1
- package/modules/annotations-advanced.src.js +162 -87
- package/modules/annotations.js +111 -111
- package/modules/annotations.js.map +1 -1
- package/modules/annotations.src.js +162 -87
- package/modules/arrow-symbols.js +1 -1
- package/modules/arrow-symbols.src.js +1 -1
- package/modules/boost-canvas.js +2 -2
- package/modules/boost-canvas.js.map +1 -1
- package/modules/boost-canvas.src.js +2 -2
- package/modules/boost.js +52 -52
- package/modules/boost.js.map +1 -1
- package/modules/boost.src.js +15 -7
- package/modules/broken-axis.js +13 -13
- package/modules/broken-axis.js.map +1 -1
- package/modules/broken-axis.src.js +34 -15
- package/modules/bullet.js +1 -1
- package/modules/bullet.src.js +1 -1
- package/modules/coloraxis.js +24 -22
- package/modules/coloraxis.js.map +1 -1
- package/modules/coloraxis.src.js +954 -774
- package/modules/current-date-indicator.js +2 -2
- package/modules/current-date-indicator.js.map +1 -1
- package/modules/current-date-indicator.src.js +2 -2
- package/modules/cylinder.js +1 -1
- package/modules/cylinder.src.js +1 -1
- package/modules/data.js +33 -32
- package/modules/data.js.map +1 -1
- package/modules/data.src.js +182 -134
- package/modules/datagrouping.d.ts +5 -0
- package/modules/datagrouping.js +20 -20
- package/modules/datagrouping.js.map +1 -1
- package/modules/datagrouping.src.d.ts +5 -0
- package/modules/datagrouping.src.js +270 -228
- package/modules/debugger.js +3 -3
- package/modules/debugger.js.map +1 -1
- package/modules/debugger.src.js +3 -3
- package/modules/dependency-wheel.js +1 -1
- package/modules/dependency-wheel.src.js +1 -1
- package/modules/dotplot.js +1 -1
- package/modules/dotplot.src.js +1 -1
- package/modules/drag-panes.js +1 -1
- package/modules/drag-panes.src.js +1 -1
- package/modules/draggable-points.js +34 -34
- package/modules/draggable-points.js.map +1 -1
- package/modules/draggable-points.src.js +14 -5
- package/modules/drilldown.d.ts +27 -0
- package/modules/drilldown.js +18 -18
- package/modules/drilldown.js.map +1 -1
- package/modules/drilldown.src.d.ts +27 -0
- package/modules/drilldown.src.js +42 -16
- package/modules/dumbbell.js +1 -1
- package/modules/dumbbell.src.js +1 -1
- package/modules/export-data.js +20 -20
- package/modules/export-data.js.map +1 -1
- package/modules/export-data.src.js +8 -5
- package/modules/exporting.d.ts +29 -0
- package/modules/exporting.js +38 -35
- package/modules/exporting.js.map +1 -1
- package/modules/exporting.src.d.ts +29 -0
- package/modules/exporting.src.js +1937 -1614
- package/modules/full-screen.js +2 -2
- package/modules/full-screen.js.map +1 -1
- package/modules/full-screen.src.js +8 -6
- package/modules/funnel.js +1 -1
- package/modules/funnel.src.js +1 -1
- package/modules/funnel3d.js +1 -1
- package/modules/funnel3d.src.js +1 -1
- package/modules/gantt.js +218 -217
- package/modules/gantt.js.map +1 -1
- package/modules/gantt.src.js +74 -32
- package/modules/grid-axis.js +23 -22
- package/modules/grid-axis.js.map +1 -1
- package/modules/grid-axis.src.js +9 -4
- package/modules/heatmap.js +39 -37
- package/modules/heatmap.js.map +1 -1
- package/modules/heatmap.src.js +963 -779
- package/modules/heikinashi.js +17 -0
- package/modules/heikinashi.js.map +1 -0
- package/modules/heikinashi.src.js +394 -0
- package/modules/histogram-bellcurve.js +1 -1
- package/modules/histogram-bellcurve.src.js +1 -1
- package/modules/hollowcandlestick.js +18 -0
- package/modules/hollowcandlestick.js.map +1 -0
- package/modules/hollowcandlestick.src.js +504 -0
- package/modules/item-series.js +1 -1
- package/modules/item-series.src.js +1 -1
- package/modules/lollipop.js +1 -1
- package/modules/lollipop.src.js +1 -1
- package/modules/map.d.ts +9 -0
- package/modules/map.js +122 -119
- package/modules/map.js.map +1 -1
- package/modules/map.src.d.ts +9 -0
- package/modules/map.src.js +1655 -1332
- package/modules/marker-clusters.js +1 -1
- package/modules/marker-clusters.src.js +1 -1
- package/modules/networkgraph.js +1 -1
- package/modules/networkgraph.src.js +1 -1
- package/modules/no-data-to-display.js +3 -3
- package/modules/no-data-to-display.js.map +1 -1
- package/modules/no-data-to-display.src.js +2 -2
- package/modules/offline-exporting.js +18 -16
- package/modules/offline-exporting.js.map +1 -1
- package/modules/offline-exporting.src.js +623 -562
- package/modules/oldie-polyfills.js +1 -1
- package/modules/oldie-polyfills.src.js +1 -1
- package/modules/oldie.js +2 -2
- package/modules/oldie.src.js +2 -2
- package/modules/organization.js +1 -1
- package/modules/organization.src.js +1 -1
- package/modules/overlapping-datalabels.js +1 -1
- package/modules/overlapping-datalabels.src.js +1 -1
- package/modules/parallel-coordinates.js +1 -1
- package/modules/parallel-coordinates.src.js +1 -1
- package/modules/pareto.js +1 -1
- package/modules/pareto.src.js +1 -1
- package/modules/pathfinder.js +1 -1
- package/modules/pathfinder.src.js +1 -1
- package/modules/pattern-fill.js +14 -14
- package/modules/pattern-fill.js.map +1 -1
- package/modules/pattern-fill.src.js +24 -12
- package/modules/price-indicator.js +1 -1
- package/modules/price-indicator.src.js +1 -1
- package/modules/pyramid3d.js +1 -1
- package/modules/pyramid3d.src.js +1 -1
- package/modules/sankey.js +28 -28
- package/modules/sankey.js.map +1 -1
- package/modules/sankey.src.js +11 -11
- package/modules/series-label.js +1 -1
- package/modules/series-label.src.js +1 -1
- package/modules/solid-gauge.js +2 -2
- package/modules/solid-gauge.js.map +1 -1
- package/modules/solid-gauge.src.js +3 -3
- package/modules/sonification.js +1 -1
- package/modules/sonification.src.js +1 -1
- package/modules/static-scale.js +1 -1
- package/modules/static-scale.src.js +1 -1
- package/modules/stock-tools.js +159 -157
- package/modules/stock-tools.js.map +1 -1
- package/modules/stock-tools.src.js +253 -123
- package/modules/stock.d.ts +5 -0
- package/modules/stock.js +196 -191
- package/modules/stock.js.map +1 -1
- package/modules/stock.src.d.ts +5 -0
- package/modules/stock.src.js +7749 -7432
- package/modules/streamgraph.js +1 -1
- package/modules/streamgraph.src.js +1 -1
- package/modules/sunburst.js +5 -5
- package/modules/sunburst.js.map +1 -1
- package/modules/sunburst.src.js +6 -19
- package/modules/tilemap.js +1 -1
- package/modules/tilemap.src.js +1 -1
- package/modules/timeline.js +18 -17
- package/modules/timeline.js.map +1 -1
- package/modules/timeline.src.js +21 -24
- package/modules/treegrid.js +57 -57
- package/modules/treegrid.js.map +1 -1
- package/modules/treegrid.src.js +43 -19
- package/modules/treemap.js +5 -5
- package/modules/treemap.js.map +1 -1
- package/modules/treemap.src.js +5 -5
- package/modules/variable-pie.js +1 -1
- package/modules/variable-pie.src.js +1 -1
- package/modules/variwide.js +1 -1
- package/modules/variwide.src.js +1 -1
- package/modules/vector.js +1 -1
- package/modules/vector.src.js +1 -1
- package/modules/venn.js +31 -30
- package/modules/venn.js.map +1 -1
- package/modules/venn.src.js +508 -424
- package/modules/windbarb.js +1 -1
- package/modules/windbarb.src.js +1 -1
- package/modules/wordcloud.js +4 -4
- package/modules/wordcloud.js.map +1 -1
- package/modules/wordcloud.src.js +2 -1
- package/modules/xrange.js +17 -17
- package/modules/xrange.js.map +1 -1
- package/modules/xrange.src.js +7 -4
- package/package.json +1 -1
- package/themes/avocado.d.ts +6 -1
- package/themes/avocado.js +3 -3
- package/themes/avocado.js.map +1 -1
- package/themes/avocado.src.d.ts +6 -1
- package/themes/avocado.src.js +53 -22
- package/themes/dark-blue.d.ts +6 -1
- package/themes/dark-blue.js +3 -3
- package/themes/dark-blue.js.map +1 -1
- package/themes/dark-blue.src.d.ts +6 -1
- package/themes/dark-blue.src.js +231 -205
- package/themes/dark-green.d.ts +6 -1
- package/themes/dark-green.js +4 -4
- package/themes/dark-green.js.map +1 -1
- package/themes/dark-green.src.d.ts +6 -1
- package/themes/dark-green.src.js +236 -205
- package/themes/dark-unica.d.ts +6 -1
- package/themes/dark-unica.js +7 -7
- package/themes/dark-unica.js.map +1 -1
- package/themes/dark-unica.src.d.ts +6 -1
- package/themes/dark-unica.src.js +206 -174
- package/themes/gray.d.ts +6 -1
- package/themes/gray.js +3 -3
- package/themes/gray.js.map +1 -1
- package/themes/gray.src.d.ts +6 -1
- package/themes/gray.src.js +233 -207
- package/themes/grid-light.d.ts +6 -1
- package/themes/grid-light.js +4 -4
- package/themes/grid-light.js.map +1 -1
- package/themes/grid-light.src.d.ts +6 -1
- package/themes/grid-light.src.js +88 -57
- package/themes/grid.d.ts +6 -1
- package/themes/grid.js +3 -3
- package/themes/grid.js.map +1 -1
- package/themes/grid.src.d.ts +6 -1
- package/themes/grid.src.js +114 -83
- package/themes/high-contrast-dark.js +5 -4
- package/themes/high-contrast-dark.js.map +1 -1
- package/themes/high-contrast-dark.src.js +197 -166
- package/themes/high-contrast-light.js +3 -3
- package/themes/high-contrast-light.js.map +1 -1
- package/themes/high-contrast-light.src.js +54 -23
- package/themes/sand-signika.d.ts +6 -1
- package/themes/sand-signika.js +5 -5
- package/themes/sand-signika.js.map +1 -1
- package/themes/sand-signika.src.d.ts +6 -1
- package/themes/sand-signika.src.js +119 -88
- package/themes/skies.d.ts +6 -1
- package/themes/skies.js +5 -5
- package/themes/skies.js.map +1 -1
- package/themes/skies.src.d.ts +6 -1
- package/themes/skies.src.js +107 -76
- package/themes/sunset.d.ts +6 -1
- package/themes/sunset.js +3 -3
- package/themes/sunset.js.map +1 -1
- package/themes/sunset.src.d.ts +6 -1
- package/themes/sunset.src.js +52 -21
- package/es-modules/Core/Axis/ColorAxis.js +0 -1164
- package/es-modules/Core/Axis/HiddenAxis.js +0 -46
- package/es-modules/Core/Axis/PlotLineOrBand.js +0 -1051
- package/es-modules/Core/Series/DataLabels.js +0 -1173
- package/es-modules/Extensions/Exporting.js +0 -2024
- package/es-modules/Extensions/OfflineExporting.js +0 -621
- package/es-modules/Mixins/Geometry.js +0 -56
- package/es-modules/Mixins/GeometryCircles.js +0 -320
- package/es-modules/Series/Bubble/BubbleLegend.js +0 -893
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Highcharts JS v9.
|
|
2
|
+
* @license Highcharts JS v9.2.2 (2021-08-24)
|
|
3
3
|
*
|
|
4
4
|
* Client side exporting module
|
|
5
5
|
*
|
|
@@ -141,206 +141,651 @@
|
|
|
141
141
|
|
|
142
142
|
return exports;
|
|
143
143
|
});
|
|
144
|
-
_registerModule(_modules, 'Extensions/OfflineExporting
|
|
144
|
+
_registerModule(_modules, 'Extensions/OfflineExporting/OfflineExportingDefaults.js', [], function () {
|
|
145
145
|
/* *
|
|
146
146
|
*
|
|
147
|
-
*
|
|
148
|
-
*
|
|
149
|
-
* (c) 2015 Torstein Honsi / Oystein Moseng
|
|
147
|
+
* (c) 2010-2021 Torstein Honsi
|
|
150
148
|
*
|
|
151
149
|
* License: www.highcharts.com/license
|
|
152
150
|
*
|
|
153
151
|
* !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
|
|
154
152
|
*
|
|
155
153
|
* */
|
|
156
|
-
|
|
157
|
-
doc = H.doc;
|
|
158
|
-
var getOptions = D.getOptions;
|
|
159
|
-
var addEvent = U.addEvent,
|
|
160
|
-
error = U.error,
|
|
161
|
-
extend = U.extend,
|
|
162
|
-
fireEvent = U.fireEvent,
|
|
163
|
-
merge = U.merge;
|
|
164
|
-
var downloadURL = DownloadURL.downloadURL;
|
|
165
|
-
var domurl = win.URL || win.webkitURL || win,
|
|
166
|
-
// Milliseconds to defer image load event handlers to offset IE bug
|
|
167
|
-
loadEventDeferDelay = H.isMS ? 150 : 0;
|
|
168
|
-
// Dummy object so we can reuse our canvas-tools.js without errors
|
|
169
|
-
H.CanVGRenderer = {};
|
|
170
|
-
/* eslint-disable valid-jsdoc */
|
|
171
|
-
/**
|
|
172
|
-
* Downloads a script and executes a callback when done.
|
|
154
|
+
/* *
|
|
173
155
|
*
|
|
174
|
-
*
|
|
175
|
-
* @function getScript
|
|
176
|
-
* @param {string} scriptLocation
|
|
177
|
-
* @param {Function} callback
|
|
178
|
-
* @return {void}
|
|
179
|
-
*/
|
|
180
|
-
function getScript(scriptLocation, callback) {
|
|
181
|
-
var head = doc.getElementsByTagName('head')[0], script = doc.createElement('script');
|
|
182
|
-
script.type = 'text/javascript';
|
|
183
|
-
script.src = scriptLocation;
|
|
184
|
-
script.onload = callback;
|
|
185
|
-
script.onerror = function () {
|
|
186
|
-
error('Error loading script ' + scriptLocation);
|
|
187
|
-
};
|
|
188
|
-
head.appendChild(script);
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Get blob URL from SVG code. Falls back to normal data URI.
|
|
156
|
+
* Declarations
|
|
192
157
|
*
|
|
193
|
-
*
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
}
|
|
158
|
+
* */
|
|
159
|
+
var OfflineExportingDefaults = {
|
|
160
|
+
libURL: 'https://code.highcharts.com/9.2.2/lib/',
|
|
161
|
+
// When offline-exporting is loaded, redefine the menu item definitions
|
|
162
|
+
// related to download.
|
|
163
|
+
menuItemDefinitions: {
|
|
164
|
+
downloadPNG: {
|
|
165
|
+
textKey: 'downloadPNG',
|
|
166
|
+
onclick: function () {
|
|
167
|
+
this.exportChartLocal();
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
downloadJPEG: {
|
|
171
|
+
textKey: 'downloadJPEG',
|
|
172
|
+
onclick: function () {
|
|
173
|
+
this.exportChartLocal({
|
|
174
|
+
type: 'image/jpeg'
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
downloadSVG: {
|
|
179
|
+
textKey: 'downloadSVG',
|
|
180
|
+
onclick: function () {
|
|
181
|
+
this.exportChartLocal({
|
|
182
|
+
type: 'image/svg+xml'
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
downloadPDF: {
|
|
187
|
+
textKey: 'downloadPDF',
|
|
188
|
+
onclick: function () {
|
|
189
|
+
this.exportChartLocal({
|
|
190
|
+
type: 'application/pdf'
|
|
191
|
+
});
|
|
192
|
+
}
|
|
212
193
|
}
|
|
213
194
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
}
|
|
217
|
-
return 'data:image/svg+xml;charset=UTF-8,' + encodeURIComponent(svg);
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* Get data:URL from image URL. Pass in callbacks to handle results.
|
|
195
|
+
};
|
|
196
|
+
/* *
|
|
221
197
|
*
|
|
222
|
-
*
|
|
223
|
-
* @function Highcharts.imageToDataUrl
|
|
198
|
+
* Default Export
|
|
224
199
|
*
|
|
225
|
-
*
|
|
200
|
+
* */
|
|
201
|
+
|
|
202
|
+
return OfflineExportingDefaults;
|
|
203
|
+
});
|
|
204
|
+
_registerModule(_modules, 'Extensions/OfflineExporting/OfflineExporting.js', [_modules['Core/Chart/Chart.js'], _modules['Core/DefaultOptions.js'], _modules['Extensions/DownloadURL.js'], _modules['Extensions/Exporting/Exporting.js'], _modules['Core/Globals.js'], _modules['Extensions/OfflineExporting/OfflineExportingDefaults.js'], _modules['Core/Utilities.js']], function (Chart, D, DownloadURL, Exporting, H, OfflineExportingDefaults, U) {
|
|
205
|
+
/* *
|
|
226
206
|
*
|
|
227
|
-
*
|
|
207
|
+
* Client side exporting module
|
|
228
208
|
*
|
|
229
|
-
*
|
|
230
|
-
* callbackArgs is used only by callbacks.
|
|
209
|
+
* (c) 2015 Torstein Honsi / Oystein Moseng
|
|
231
210
|
*
|
|
232
|
-
*
|
|
211
|
+
* License: www.highcharts.com/license
|
|
233
212
|
*
|
|
234
|
-
*
|
|
235
|
-
* Receives four arguments: imageURL, imageType, callbackArgs, and scale.
|
|
213
|
+
* !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
|
|
236
214
|
*
|
|
237
|
-
*
|
|
238
|
-
|
|
215
|
+
* */
|
|
216
|
+
/* global MSBlobBuilder */
|
|
217
|
+
var defaultOptions = D.defaultOptions;
|
|
218
|
+
var downloadURL = DownloadURL.downloadURL;
|
|
219
|
+
var win = H.win,
|
|
220
|
+
doc = H.doc;
|
|
221
|
+
var addEvent = U.addEvent,
|
|
222
|
+
error = U.error,
|
|
223
|
+
extend = U.extend,
|
|
224
|
+
fireEvent = U.fireEvent,
|
|
225
|
+
merge = U.merge;
|
|
226
|
+
/* *
|
|
239
227
|
*
|
|
240
|
-
*
|
|
241
|
-
* Receives four arguments: imageURL, imageType, callbackArgs, and scale.
|
|
228
|
+
* Constants
|
|
242
229
|
*
|
|
243
|
-
*
|
|
244
|
-
|
|
230
|
+
* */
|
|
231
|
+
var composedClasses = [];
|
|
232
|
+
/* *
|
|
245
233
|
*
|
|
246
|
-
*
|
|
247
|
-
* finallyCallback is always called at the end of the process. All
|
|
248
|
-
* callbacks receive four arguments: imageURL, imageType, callbackArgs,
|
|
249
|
-
* and scale.
|
|
234
|
+
* Composition
|
|
250
235
|
*
|
|
251
|
-
*
|
|
252
|
-
|
|
253
|
-
function
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
236
|
+
* */
|
|
237
|
+
var OfflineExporting;
|
|
238
|
+
(function (OfflineExporting) {
|
|
239
|
+
/* *
|
|
240
|
+
*
|
|
241
|
+
* Declarations
|
|
242
|
+
*
|
|
243
|
+
* */
|
|
244
|
+
/* *
|
|
245
|
+
*
|
|
246
|
+
* Constants
|
|
247
|
+
*
|
|
248
|
+
* */
|
|
249
|
+
// Dummy object so we can reuse our canvas-tools.js without errors
|
|
250
|
+
OfflineExporting.CanVGRenderer = {}, OfflineExporting.domurl = win.URL || win.webkitURL || win,
|
|
251
|
+
// Milliseconds to defer image load event handlers to offset IE bug
|
|
252
|
+
OfflineExporting.loadEventDeferDelay = H.isMS ? 150 : 0;
|
|
253
|
+
/* *
|
|
254
|
+
*
|
|
255
|
+
* Functions
|
|
256
|
+
*
|
|
257
|
+
* */
|
|
258
|
+
/* eslint-disable valid-jsdoc */
|
|
259
|
+
/**
|
|
260
|
+
* Extends OfflineExporting with Chart.
|
|
261
|
+
* @private
|
|
262
|
+
*/
|
|
263
|
+
function compose(ChartClass) {
|
|
264
|
+
if (composedClasses.indexOf(ChartClass) === -1) {
|
|
265
|
+
composedClasses.push(ChartClass);
|
|
266
|
+
var chartProto = ChartClass.prototype;
|
|
267
|
+
chartProto.getSVGForLocalExport = getSVGForLocalExport;
|
|
268
|
+
chartProto.exportChartLocal = exportChartLocal;
|
|
269
|
+
// Extend the default options to use the local exporter logic
|
|
270
|
+
merge(true, defaultOptions.exporting, OfflineExportingDefaults);
|
|
271
|
+
}
|
|
272
|
+
return ChartClass;
|
|
273
|
+
}
|
|
274
|
+
OfflineExporting.compose = compose;
|
|
275
|
+
/* eslint-disable valid-jsdoc */
|
|
276
|
+
/**
|
|
277
|
+
* Get data URL to an image of an SVG and call download on it options
|
|
278
|
+
* object:
|
|
279
|
+
* - **filename:** Name of resulting downloaded file without extension.
|
|
280
|
+
* Default is `chart`.
|
|
281
|
+
*
|
|
282
|
+
* - **type:** File type of resulting download. Default is `image/png`.
|
|
283
|
+
*
|
|
284
|
+
* - **scale:** Scaling factor of downloaded image compared to source.
|
|
285
|
+
* Default is `1`.
|
|
286
|
+
*
|
|
287
|
+
* - **libURL:** URL pointing to location of dependency scripts to download
|
|
288
|
+
* on demand. Default is the exporting.libURL option of the global
|
|
289
|
+
* Highcharts options pointing to our server.
|
|
290
|
+
*
|
|
291
|
+
* @function Highcharts.downloadSVGLocal
|
|
292
|
+
*
|
|
293
|
+
* @param {string} svg
|
|
294
|
+
* The generated SVG
|
|
295
|
+
*
|
|
296
|
+
* @param {Highcharts.ExportingOptions} options
|
|
297
|
+
* The exporting options
|
|
298
|
+
*
|
|
299
|
+
* @param {Function} failCallback
|
|
300
|
+
* The callback function in case of errors
|
|
301
|
+
*
|
|
302
|
+
* @param {Function} [successCallback]
|
|
303
|
+
* The callback function in case of success
|
|
304
|
+
*
|
|
305
|
+
* @return {void}
|
|
306
|
+
*/
|
|
307
|
+
function downloadSVGLocal(svg, options, failCallback, successCallback) {
|
|
308
|
+
var dummySVGContainer = doc.createElement('div'), imageType = options.type || 'image/png', filename = ((options.filename || 'chart') +
|
|
309
|
+
'.' +
|
|
310
|
+
(imageType === 'image/svg+xml' ? 'svg' : imageType.split('/')[1])), scale = options.scale || 1;
|
|
311
|
+
var svgurl,
|
|
312
|
+
blob,
|
|
313
|
+
finallyHandler,
|
|
314
|
+
libURL = (options.libURL || defaultOptions.exporting.libURL),
|
|
315
|
+
objectURLRevoke = true;
|
|
316
|
+
// Allow libURL to end with or without fordward slash
|
|
317
|
+
libURL = libURL.slice(-1) !== '/' ? libURL + '/' : libURL;
|
|
318
|
+
/**
|
|
319
|
+
* @private
|
|
320
|
+
* @return {void}
|
|
321
|
+
*/
|
|
322
|
+
var downloadPDF = function () {
|
|
323
|
+
dummySVGContainer.innerHTML = svg;
|
|
324
|
+
var textElements = dummySVGContainer.getElementsByTagName('text'),
|
|
325
|
+
// Copy style property to element from parents if it's not
|
|
326
|
+
// there. Searches up hierarchy until it finds prop, or hits the
|
|
327
|
+
// chart container.
|
|
328
|
+
setStylePropertyFromParents = function (el,
|
|
329
|
+
propName) {
|
|
330
|
+
var curParent = el;
|
|
331
|
+
while (curParent && curParent !== dummySVGContainer) {
|
|
332
|
+
if (curParent.style[propName]) {
|
|
333
|
+
el.style[propName] =
|
|
334
|
+
curParent.style[propName];
|
|
335
|
+
break;
|
|
336
|
+
}
|
|
337
|
+
curParent = curParent.parentNode;
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
var titleElements;
|
|
341
|
+
// Workaround for the text styling. Making sure it does pick up
|
|
342
|
+
// settings for parent elements.
|
|
343
|
+
[].forEach.call(textElements, function (el) {
|
|
344
|
+
// Workaround for the text styling. making sure it does pick up@
|
|
345
|
+
// the root element
|
|
346
|
+
['font-family', 'font-size'].forEach(function (property) {
|
|
347
|
+
setStylePropertyFromParents(el, property);
|
|
348
|
+
});
|
|
349
|
+
el.style['font-family'] = (el.style['font-family'] &&
|
|
350
|
+
el.style['font-family'].split(' ').splice(-1));
|
|
351
|
+
// Workaround for plotband with width, removing title from text
|
|
352
|
+
// nodes
|
|
353
|
+
titleElements = el.getElementsByTagName('title');
|
|
354
|
+
[].forEach.call(titleElements, function (titleElement) {
|
|
355
|
+
el.removeChild(titleElement);
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
var svgData = svgToPdf(dummySVGContainer.firstChild, 0);
|
|
359
|
+
try {
|
|
360
|
+
downloadURL(svgData, filename);
|
|
361
|
+
if (successCallback) {
|
|
362
|
+
successCallback();
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
catch (e) {
|
|
366
|
+
failCallback(e);
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
// Initiate download depending on file type
|
|
370
|
+
if (imageType === 'image/svg+xml') {
|
|
371
|
+
// SVG download. In this case, we want to use Microsoft specific
|
|
372
|
+
// Blob if available
|
|
257
373
|
try {
|
|
258
|
-
if (
|
|
259
|
-
|
|
374
|
+
if (typeof win.navigator.msSaveOrOpenBlob !== 'undefined') {
|
|
375
|
+
blob = new MSBlobBuilder();
|
|
376
|
+
blob.append(svg);
|
|
377
|
+
svgurl = blob.getBlob('image/svg+xml');
|
|
260
378
|
}
|
|
261
379
|
else {
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
380
|
+
svgurl = svgToDataUrl(svg);
|
|
381
|
+
}
|
|
382
|
+
downloadURL(svgurl, filename);
|
|
383
|
+
if (successCallback) {
|
|
384
|
+
successCallback();
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
catch (e) {
|
|
388
|
+
failCallback(e);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
else if (imageType === 'application/pdf') {
|
|
392
|
+
if (win.jsPDF && win.svg2pdf) {
|
|
393
|
+
downloadPDF();
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
// Must load pdf libraries first. // Don't destroy the object
|
|
397
|
+
// URL yet since we are doing things asynchronously. A cleaner
|
|
398
|
+
// solution would be nice, but this will do for now.
|
|
399
|
+
objectURLRevoke = true;
|
|
400
|
+
getScript(libURL + 'jspdf.js', function () {
|
|
401
|
+
getScript(libURL + 'svg2pdf.js', function () {
|
|
402
|
+
downloadPDF();
|
|
403
|
+
});
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
else {
|
|
408
|
+
// PNG/JPEG download - create bitmap from SVG
|
|
409
|
+
svgurl = svgToDataUrl(svg);
|
|
410
|
+
finallyHandler = function () {
|
|
411
|
+
try {
|
|
412
|
+
OfflineExporting.domurl.revokeObjectURL(svgurl);
|
|
413
|
+
}
|
|
414
|
+
catch (e) {
|
|
415
|
+
// Ignore
|
|
416
|
+
}
|
|
417
|
+
};
|
|
418
|
+
// First, try to get PNG by rendering on canvas
|
|
419
|
+
imageToDataUrl(svgurl, imageType, {}, scale, function (imageURL) {
|
|
420
|
+
// Success
|
|
421
|
+
try {
|
|
422
|
+
downloadURL(imageURL, filename);
|
|
423
|
+
if (successCallback) {
|
|
424
|
+
successCallback();
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
catch (e) {
|
|
428
|
+
failCallback(e);
|
|
429
|
+
}
|
|
430
|
+
}, function () {
|
|
431
|
+
// Failed due to tainted canvas
|
|
432
|
+
// Create new and untainted canvas
|
|
433
|
+
var canvas = doc.createElement('canvas'), ctx = canvas.getContext('2d'), imageWidth = svg.match(/^<svg[^>]*width\s*=\s*\"?(\d+)\"?[^>]*>/)[1] * scale, imageHeight = svg.match(/^<svg[^>]*height\s*=\s*\"?(\d+)\"?[^>]*>/)[1] * scale, downloadWithCanVG = function () {
|
|
434
|
+
var v = win.canvg.Canvg.fromString(ctx, svg);
|
|
435
|
+
v.start();
|
|
266
436
|
try {
|
|
267
|
-
|
|
268
|
-
|
|
437
|
+
downloadURL(win.navigator.msSaveOrOpenBlob ?
|
|
438
|
+
canvas.msToBlob() :
|
|
439
|
+
canvas.toDataURL(imageType), filename);
|
|
440
|
+
if (successCallback) {
|
|
441
|
+
successCallback();
|
|
442
|
+
}
|
|
269
443
|
}
|
|
270
444
|
catch (e) {
|
|
271
|
-
|
|
445
|
+
failCallback(e);
|
|
446
|
+
}
|
|
447
|
+
finally {
|
|
448
|
+
finallyHandler();
|
|
272
449
|
}
|
|
450
|
+
};
|
|
451
|
+
canvas.width = imageWidth;
|
|
452
|
+
canvas.height = imageHeight;
|
|
453
|
+
if (win.canvg) {
|
|
454
|
+
// Use preloaded canvg
|
|
455
|
+
downloadWithCanVG();
|
|
456
|
+
}
|
|
457
|
+
else {
|
|
458
|
+
// Must load canVG first. // Don't destroy the object
|
|
459
|
+
// URL yet since we are doing things asynchronously. A
|
|
460
|
+
// cleaner solution would be nice, but this will do for
|
|
461
|
+
// now.
|
|
462
|
+
objectURLRevoke = true;
|
|
463
|
+
getScript(libURL + 'canvg.js', function () {
|
|
464
|
+
downloadWithCanVG();
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
},
|
|
468
|
+
// No canvas support
|
|
469
|
+
failCallback,
|
|
470
|
+
// Failed to load image
|
|
471
|
+
failCallback,
|
|
472
|
+
// Finally
|
|
473
|
+
function () {
|
|
474
|
+
if (objectURLRevoke) {
|
|
475
|
+
finallyHandler();
|
|
476
|
+
}
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
OfflineExporting.downloadSVGLocal = downloadSVGLocal;
|
|
481
|
+
/* eslint-disable valid-jsdoc */
|
|
482
|
+
/**
|
|
483
|
+
* Exporting and offline-exporting modules required. Export a chart to
|
|
484
|
+
* an image locally in the user's browser.
|
|
485
|
+
*
|
|
486
|
+
* @function Highcharts.Chart#exportChartLocal
|
|
487
|
+
*
|
|
488
|
+
* @param {Highcharts.ExportingOptions} [exportingOptions]
|
|
489
|
+
* Exporting options, the same as in
|
|
490
|
+
* {@link Highcharts.Chart#exportChart}.
|
|
491
|
+
*
|
|
492
|
+
* @param {Highcharts.Options} [chartOptions]
|
|
493
|
+
* Additional chart options for the exported chart. For example
|
|
494
|
+
* a different background color can be added here, or
|
|
495
|
+
* `dataLabels` for export only.
|
|
496
|
+
*
|
|
497
|
+
* @return {void}
|
|
498
|
+
*
|
|
499
|
+
* @requires modules/exporting
|
|
500
|
+
*/
|
|
501
|
+
function exportChartLocal(exportingOptions, chartOptions) {
|
|
502
|
+
var chart = this,
|
|
503
|
+
options = merge(chart.options.exporting,
|
|
504
|
+
exportingOptions),
|
|
505
|
+
fallbackToExportServer = function (err) {
|
|
506
|
+
if (options.fallbackToExportServer === false) {
|
|
507
|
+
if (options.error) {
|
|
508
|
+
options.error(options,
|
|
509
|
+
err);
|
|
510
|
+
}
|
|
511
|
+
else {
|
|
512
|
+
error(28, true); // Fallback disabled
|
|
273
513
|
}
|
|
274
514
|
}
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
515
|
+
else {
|
|
516
|
+
chart.exportChart(options);
|
|
517
|
+
}
|
|
518
|
+
}, svgSuccess = function (svg) {
|
|
519
|
+
// If SVG contains foreignObjects PDF fails in all browsers
|
|
520
|
+
// and all exports except SVG will fail in IE, as both CanVG
|
|
521
|
+
// and svg2pdf choke on this. Gracefully fall back.
|
|
522
|
+
if (svg.indexOf('<foreignObject') > -1 &&
|
|
523
|
+
options.type !== 'image/svg+xml' &&
|
|
524
|
+
(H.isMS || options.type === 'application/pdf')) {
|
|
525
|
+
fallbackToExportServer('Image type not supported' +
|
|
526
|
+
'for charts with embedded HTML');
|
|
527
|
+
}
|
|
528
|
+
else {
|
|
529
|
+
OfflineExporting.downloadSVGLocal(svg, extend({ filename: chart.getFilename() }, options), fallbackToExportServer, function () { return fireEvent(chart, 'exportChartLocalSuccess'); });
|
|
530
|
+
}
|
|
531
|
+
},
|
|
532
|
+
// Return true if the SVG contains images with external data.
|
|
533
|
+
// With the boost module there are `image` elements with encoded
|
|
534
|
+
// PNGs, these are supported by svg2pdf and should
|
|
535
|
+
// pass (#10243).
|
|
536
|
+
hasExternalImages = function () {
|
|
537
|
+
return [].some.call(chart.container.getElementsByTagName('image'), function (image) {
|
|
538
|
+
var href = image.getAttribute('href');
|
|
539
|
+
return href !== '' && href.indexOf('data:') !== 0;
|
|
540
|
+
});
|
|
541
|
+
};
|
|
542
|
+
// If we are on IE and in styled mode, add a whitelist to the
|
|
543
|
+
// renderer for inline styles that we want to pass through. There
|
|
544
|
+
// are so many styles by default in IE that we don't want to
|
|
545
|
+
// blacklist them all.
|
|
546
|
+
if (H.isMS && chart.styledMode && !Exporting.inlineWhitelist.length) {
|
|
547
|
+
Exporting.inlineWhitelist.push(/^blockSize/, /^border/, /^caretColor/, /^color/, /^columnRule/, /^columnRuleColor/, /^cssFloat/, /^cursor/, /^fill$/, /^fillOpacity/, /^font/, /^inlineSize/, /^length/, /^lineHeight/, /^opacity/, /^outline/, /^parentRule/, /^rx$/, /^ry$/, /^stroke/, /^textAlign/, /^textAnchor/, /^textDecoration/, /^transform/, /^vectorEffect/, /^visibility/, /^x$/, /^y$/);
|
|
548
|
+
}
|
|
549
|
+
// Always fall back on:
|
|
550
|
+
// - MS browsers: Embedded images JPEG/PNG, or any PDF
|
|
551
|
+
// - Embedded images and PDF
|
|
552
|
+
if ((H.isMS &&
|
|
553
|
+
(options.type === 'application/pdf' ||
|
|
554
|
+
chart.container.getElementsByTagName('image').length &&
|
|
555
|
+
options.type !== 'image/svg+xml')) || (options.type === 'application/pdf' &&
|
|
556
|
+
hasExternalImages())) {
|
|
557
|
+
fallbackToExportServer('Image type not supported for this chart/browser.');
|
|
558
|
+
return;
|
|
559
|
+
}
|
|
560
|
+
chart.getSVGForLocalExport(options, chartOptions || {}, fallbackToExportServer, svgSuccess);
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* Downloads a script and executes a callback when done.
|
|
564
|
+
*
|
|
565
|
+
* @private
|
|
566
|
+
* @function getScript
|
|
567
|
+
* @param {string} scriptLocation
|
|
568
|
+
* @param {Function} callback
|
|
569
|
+
*/
|
|
570
|
+
function getScript(scriptLocation, callback) {
|
|
571
|
+
var head = doc.getElementsByTagName('head')[0], script = doc.createElement('script');
|
|
572
|
+
script.type = 'text/javascript';
|
|
573
|
+
script.src = scriptLocation;
|
|
574
|
+
script.onload = callback;
|
|
575
|
+
script.onerror = function () {
|
|
576
|
+
error('Error loading script ' + scriptLocation);
|
|
577
|
+
};
|
|
578
|
+
head.appendChild(script);
|
|
579
|
+
}
|
|
580
|
+
OfflineExporting.getScript = getScript;
|
|
581
|
+
/**
|
|
582
|
+
* Get SVG of chart prepared for client side export. This converts
|
|
583
|
+
* embedded images in the SVG to data URIs. It requires the regular
|
|
584
|
+
* exporting module. The options and chartOptions arguments are passed
|
|
585
|
+
* to the getSVGForExport function.
|
|
586
|
+
*
|
|
587
|
+
* @private
|
|
588
|
+
* @function Highcharts.Chart#getSVGForLocalExport
|
|
589
|
+
* @param {Highcharts.ExportingOptions} options
|
|
590
|
+
* @param {Highcharts.Options} chartOptions
|
|
591
|
+
* @param {Function} failCallback
|
|
592
|
+
* @param {Function} successCallback
|
|
593
|
+
* @return {void}
|
|
594
|
+
*/
|
|
595
|
+
function getSVGForLocalExport(options, chartOptions, failCallback, successCallback) {
|
|
596
|
+
var chart = this,
|
|
597
|
+
// After grabbing the SVG of the chart's copy container we need
|
|
598
|
+
// to do sanitation on the SVG
|
|
599
|
+
sanitize = function (svg) { return chart.sanitizeSVG(svg,
|
|
600
|
+
chartCopyOptions); },
|
|
601
|
+
// When done with last image we have our SVG
|
|
602
|
+
checkDone = function () {
|
|
603
|
+
if (images && imagesEmbedded === images.length) {
|
|
604
|
+
successCallback(sanitize(chartCopyContainer.innerHTML));
|
|
605
|
+
}
|
|
606
|
+
},
|
|
607
|
+
// Success handler, we converted image to base64!
|
|
608
|
+
embeddedSuccess = function (imageURL, imageType, callbackArgs) {
|
|
609
|
+
++imagesEmbedded;
|
|
610
|
+
// Change image href in chart copy
|
|
611
|
+
callbackArgs.imageElement.setAttributeNS('http://www.w3.org/1999/xlink', 'href', imageURL);
|
|
612
|
+
checkDone();
|
|
613
|
+
};
|
|
614
|
+
var el,
|
|
615
|
+
i,
|
|
616
|
+
l,
|
|
617
|
+
chartCopyContainer,
|
|
618
|
+
chartCopyOptions,
|
|
619
|
+
href = null,
|
|
620
|
+
images,
|
|
621
|
+
imagesEmbedded = 0;
|
|
622
|
+
// Hook into getSVG to get a copy of the chart copy's
|
|
623
|
+
// container (#8273)
|
|
624
|
+
chart.unbindGetSVG = addEvent(chart, 'getSVG', function (e) {
|
|
625
|
+
chartCopyOptions = e.chartCopy.options;
|
|
626
|
+
chartCopyContainer = e.chartCopy.container.cloneNode(true);
|
|
627
|
+
images = chartCopyContainer && chartCopyContainer.getElementsByTagName('image') || [];
|
|
628
|
+
});
|
|
629
|
+
// Trigger hook to get chart copy
|
|
630
|
+
chart.getSVGForExport(options, chartOptions);
|
|
631
|
+
try {
|
|
632
|
+
// If there are no images to embed, the SVG is okay now.
|
|
633
|
+
if (!images || !images.length) {
|
|
634
|
+
// Use SVG of chart copy
|
|
635
|
+
successCallback(sanitize(chartCopyContainer.innerHTML));
|
|
636
|
+
return;
|
|
637
|
+
}
|
|
638
|
+
// Go through the images we want to embed
|
|
639
|
+
for (i = 0, l = images.length; i < l; ++i) {
|
|
640
|
+
el = images[i];
|
|
641
|
+
href = el.getAttributeNS('http://www.w3.org/1999/xlink', 'href');
|
|
642
|
+
if (href) {
|
|
643
|
+
OfflineExporting.imageToDataUrl(href, 'image/png', { imageElement: el }, options.scale, embeddedSuccess,
|
|
644
|
+
// Tainted canvas
|
|
645
|
+
failCallback,
|
|
646
|
+
// No canvas support
|
|
647
|
+
failCallback,
|
|
648
|
+
// Failed to load source
|
|
649
|
+
failCallback);
|
|
650
|
+
// Hidden, boosted series have blank href (#10243)
|
|
651
|
+
}
|
|
652
|
+
else {
|
|
653
|
+
++imagesEmbedded;
|
|
654
|
+
el.parentNode.removeChild(el);
|
|
655
|
+
checkDone();
|
|
278
656
|
}
|
|
279
657
|
}
|
|
280
|
-
// IE bug where image is not always ready despite calling load
|
|
281
|
-
// event.
|
|
282
|
-
}, loadEventDeferDelay);
|
|
283
|
-
},
|
|
284
|
-
// Image load failed (e.g. invalid URL)
|
|
285
|
-
errorHandler = function () {
|
|
286
|
-
failedLoadCallback(imageURL, imageType, callbackArgs, scale);
|
|
287
|
-
if (finallyCallback) {
|
|
288
|
-
finallyCallback(imageURL, imageType, callbackArgs, scale);
|
|
289
658
|
}
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
659
|
+
catch (e) {
|
|
660
|
+
failCallback(e);
|
|
661
|
+
}
|
|
662
|
+
// Clean up
|
|
663
|
+
chart.unbindGetSVG();
|
|
664
|
+
}
|
|
665
|
+
/**
|
|
666
|
+
* Get data:URL from image URL. Pass in callbacks to handle results.
|
|
667
|
+
*
|
|
668
|
+
* @private
|
|
669
|
+
* @function Highcharts.imageToDataUrl
|
|
670
|
+
*
|
|
671
|
+
* @param {string} imageURL
|
|
672
|
+
*
|
|
673
|
+
* @param {string} imageType
|
|
674
|
+
*
|
|
675
|
+
* @param {*} callbackArgs
|
|
676
|
+
* callbackArgs is used only by callbacks.
|
|
677
|
+
*
|
|
678
|
+
* @param {number} scale
|
|
679
|
+
*
|
|
680
|
+
* @param {Function} successCallback
|
|
681
|
+
* Receives four arguments: imageURL, imageType, callbackArgs,
|
|
682
|
+
* and scale.
|
|
683
|
+
*
|
|
684
|
+
* @param {Function} taintedCallback
|
|
685
|
+
* Receives four arguments: imageURL, imageType, callbackArgs,
|
|
686
|
+
* and scale.
|
|
687
|
+
*
|
|
688
|
+
* @param {Function} noCanvasSupportCallback
|
|
689
|
+
* Receives four arguments: imageURL, imageType, callbackArgs,
|
|
690
|
+
* and scale.
|
|
691
|
+
*
|
|
692
|
+
* @param {Function} failedLoadCallback
|
|
693
|
+
* Receives four arguments: imageURL, imageType, callbackArgs,
|
|
694
|
+
* and scale.
|
|
695
|
+
*
|
|
696
|
+
* @param {Function} [finallyCallback]
|
|
697
|
+
* finallyCallback is always called at the end of the process. All
|
|
698
|
+
* callbacks receive four arguments: imageURL, imageType,
|
|
699
|
+
* callbackArgs, and scale.
|
|
700
|
+
*/
|
|
701
|
+
function imageToDataUrl(imageURL, imageType, callbackArgs, scale, successCallback, taintedCallback, noCanvasSupportCallback, failedLoadCallback, finallyCallback) {
|
|
702
|
+
var img = new win.Image(),
|
|
703
|
+
taintedHandler;
|
|
704
|
+
var loadHandler = function () {
|
|
705
|
+
setTimeout(function () {
|
|
706
|
+
var canvas = doc.createElement('canvas'), ctx = canvas.getContext && canvas.getContext('2d');
|
|
707
|
+
var dataURL;
|
|
708
|
+
try {
|
|
709
|
+
if (!ctx) {
|
|
710
|
+
noCanvasSupportCallback(imageURL, imageType, callbackArgs, scale);
|
|
711
|
+
}
|
|
712
|
+
else {
|
|
713
|
+
canvas.height = img.height * scale;
|
|
714
|
+
canvas.width = img.width * scale;
|
|
715
|
+
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
|
|
716
|
+
// Now we try to get the contents of the canvas.
|
|
717
|
+
try {
|
|
718
|
+
dataURL = canvas.toDataURL(imageType);
|
|
719
|
+
successCallback(dataURL, imageType, callbackArgs, scale);
|
|
720
|
+
}
|
|
721
|
+
catch (e) {
|
|
722
|
+
taintedHandler(imageURL, imageType, callbackArgs, scale);
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
finally {
|
|
727
|
+
if (finallyCallback) {
|
|
728
|
+
finallyCallback(imageURL, imageType, callbackArgs, scale);
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
// IE bug where image is not always ready despite calling load
|
|
732
|
+
// event.
|
|
733
|
+
}, OfflineExporting.loadEventDeferDelay);
|
|
734
|
+
},
|
|
735
|
+
// Image load failed (e.g. invalid URL)
|
|
736
|
+
errorHandler = function () {
|
|
737
|
+
failedLoadCallback(imageURL, imageType, callbackArgs, scale);
|
|
738
|
+
if (finallyCallback) {
|
|
739
|
+
finallyCallback(imageURL, imageType, callbackArgs, scale);
|
|
740
|
+
}
|
|
741
|
+
};
|
|
742
|
+
// This is called on load if the image drawing to canvas failed with a
|
|
743
|
+
// security error. We retry the drawing with crossOrigin set to
|
|
744
|
+
// Anonymous.
|
|
745
|
+
taintedHandler = function () {
|
|
746
|
+
img = new win.Image();
|
|
747
|
+
taintedHandler = taintedCallback;
|
|
748
|
+
// Must be set prior to loading image source
|
|
749
|
+
img.crossOrigin = 'Anonymous';
|
|
750
|
+
img.onload = loadHandler;
|
|
751
|
+
img.onerror = errorHandler;
|
|
752
|
+
img.src = imageURL;
|
|
753
|
+
};
|
|
298
754
|
img.onload = loadHandler;
|
|
299
755
|
img.onerror = errorHandler;
|
|
300
756
|
img.src = imageURL;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
* @param {Function} [successCallback]
|
|
334
|
-
* The callback function in case of success
|
|
335
|
-
*
|
|
336
|
-
* @return {void}
|
|
337
|
-
*/
|
|
338
|
-
function downloadSVGLocal(svg, options, failCallback, successCallback) {
|
|
339
|
-
var svgurl, blob, objectURLRevoke = true, finallyHandler, libURL = (options.libURL || getOptions().exporting.libURL), dummySVGContainer = doc.createElement('div'), imageType = options.type || 'image/png', filename = ((options.filename || 'chart') +
|
|
340
|
-
'.' +
|
|
341
|
-
(imageType === 'image/svg+xml' ? 'svg' : imageType.split('/')[1])), scale = options.scale || 1;
|
|
342
|
-
// Allow libURL to end with or without fordward slash
|
|
343
|
-
libURL = libURL.slice(-1) !== '/' ? libURL + '/' : libURL;
|
|
757
|
+
}
|
|
758
|
+
OfflineExporting.imageToDataUrl = imageToDataUrl;
|
|
759
|
+
/**
|
|
760
|
+
* Get blob URL from SVG code. Falls back to normal data URI.
|
|
761
|
+
*
|
|
762
|
+
* @private
|
|
763
|
+
* @function Highcharts.svgToDataURL
|
|
764
|
+
* @param {string} svg
|
|
765
|
+
* @return {string}
|
|
766
|
+
*/
|
|
767
|
+
function svgToDataUrl(svg) {
|
|
768
|
+
// Webkit and not chrome
|
|
769
|
+
var userAgent = win.navigator.userAgent;
|
|
770
|
+
var webKit = (userAgent.indexOf('WebKit') > -1 &&
|
|
771
|
+
userAgent.indexOf('Chrome') < 0);
|
|
772
|
+
try {
|
|
773
|
+
// Safari requires data URI since it doesn't allow navigation to
|
|
774
|
+
// blob URLs. Firefox has an issue with Blobs and internal
|
|
775
|
+
// references, leading to gradients not working using Blobs (#4550).
|
|
776
|
+
// foreignObjects also dont work well in Blobs in Chrome (#14780).
|
|
777
|
+
if (!webKit && !H.isFirefox && svg.indexOf('<foreignObject') === -1) {
|
|
778
|
+
return OfflineExporting.domurl.createObjectURL(new win.Blob([svg], {
|
|
779
|
+
type: 'image/svg+xml;charset-utf-16'
|
|
780
|
+
}));
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
catch (e) {
|
|
784
|
+
// Ignore
|
|
785
|
+
}
|
|
786
|
+
return 'data:image/svg+xml;charset=UTF-8,' + encodeURIComponent(svg);
|
|
787
|
+
}
|
|
788
|
+
OfflineExporting.svgToDataUrl = svgToDataUrl;
|
|
344
789
|
/* eslint-disable valid-jsdoc */
|
|
345
790
|
/**
|
|
346
791
|
* @private
|
|
@@ -373,9 +818,9 @@
|
|
|
373
818
|
i++;
|
|
374
819
|
}
|
|
375
820
|
}
|
|
376
|
-
// Workaround for #15135, zero width spaces, which Highcharts uses
|
|
377
|
-
// break lines, are not correctly rendered in PDF. Replace it
|
|
378
|
-
// regular space and offset by some pixels to compensate.
|
|
821
|
+
// Workaround for #15135, zero width spaces, which Highcharts uses
|
|
822
|
+
// to break lines, are not correctly rendered in PDF. Replace it
|
|
823
|
+
// with a regular space and offset by some pixels to compensate.
|
|
379
824
|
[].forEach.call(svgElement.querySelectorAll('tspan'), function (tspan) {
|
|
380
825
|
if (tspan.textContent === '\u200B') {
|
|
381
826
|
tspan.textContent = ' ';
|
|
@@ -385,407 +830,23 @@
|
|
|
385
830
|
win.svg2pdf(svgElement, pdf, { removeInvalid: true });
|
|
386
831
|
return pdf.output('datauristring');
|
|
387
832
|
}
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
*/
|
|
392
|
-
function downloadPDF() {
|
|
393
|
-
dummySVGContainer.innerHTML = svg;
|
|
394
|
-
var textElements = dummySVGContainer.getElementsByTagName('text'),
|
|
395
|
-
titleElements,
|
|
396
|
-
svgData,
|
|
397
|
-
// Copy style property to element from parents if it's not there.
|
|
398
|
-
// Searches up hierarchy until it finds prop, or hits the chart
|
|
399
|
-
// container.
|
|
400
|
-
setStylePropertyFromParents = function (el,
|
|
401
|
-
propName) {
|
|
402
|
-
var curParent = el;
|
|
403
|
-
while (curParent && curParent !== dummySVGContainer) {
|
|
404
|
-
if (curParent.style[propName]) {
|
|
405
|
-
el.style[propName] =
|
|
406
|
-
curParent.style[propName];
|
|
407
|
-
break;
|
|
408
|
-
}
|
|
409
|
-
curParent = curParent.parentNode;
|
|
410
|
-
}
|
|
411
|
-
};
|
|
412
|
-
// Workaround for the text styling. Making sure it does pick up settings
|
|
413
|
-
// for parent elements.
|
|
414
|
-
[].forEach.call(textElements, function (el) {
|
|
415
|
-
// Workaround for the text styling. making sure it does pick up the
|
|
416
|
-
// root element
|
|
417
|
-
['font-family', 'font-size'].forEach(function (property) {
|
|
418
|
-
setStylePropertyFromParents(el, property);
|
|
419
|
-
});
|
|
420
|
-
el.style['font-family'] = (el.style['font-family'] &&
|
|
421
|
-
el.style['font-family'].split(' ').splice(-1));
|
|
422
|
-
// Workaround for plotband with width, removing title from text
|
|
423
|
-
// nodes
|
|
424
|
-
titleElements = el.getElementsByTagName('title');
|
|
425
|
-
[].forEach.call(titleElements, function (titleElement) {
|
|
426
|
-
el.removeChild(titleElement);
|
|
427
|
-
});
|
|
428
|
-
});
|
|
429
|
-
svgData = svgToPdf(dummySVGContainer.firstChild, 0);
|
|
430
|
-
try {
|
|
431
|
-
downloadURL(svgData, filename);
|
|
432
|
-
if (successCallback) {
|
|
433
|
-
successCallback();
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
catch (e) {
|
|
437
|
-
failCallback(e);
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
/* eslint-enable valid-jsdoc */
|
|
441
|
-
// Initiate download depending on file type
|
|
442
|
-
if (imageType === 'image/svg+xml') {
|
|
443
|
-
// SVG download. In this case, we want to use Microsoft specific Blob if
|
|
444
|
-
// available
|
|
445
|
-
try {
|
|
446
|
-
if (typeof win.navigator.msSaveOrOpenBlob !== 'undefined') {
|
|
447
|
-
blob = new MSBlobBuilder();
|
|
448
|
-
blob.append(svg);
|
|
449
|
-
svgurl = blob.getBlob('image/svg+xml');
|
|
450
|
-
}
|
|
451
|
-
else {
|
|
452
|
-
svgurl = svgToDataUrl(svg);
|
|
453
|
-
}
|
|
454
|
-
downloadURL(svgurl, filename);
|
|
455
|
-
if (successCallback) {
|
|
456
|
-
successCallback();
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
catch (e) {
|
|
460
|
-
failCallback(e);
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
else if (imageType === 'application/pdf') {
|
|
464
|
-
if (win.jsPDF && win.svg2pdf) {
|
|
465
|
-
downloadPDF();
|
|
466
|
-
}
|
|
467
|
-
else {
|
|
468
|
-
// Must load pdf libraries first. // Don't destroy the object URL
|
|
469
|
-
// yet since we are doing things asynchronously. A cleaner solution
|
|
470
|
-
// would be nice, but this will do for now.
|
|
471
|
-
objectURLRevoke = true;
|
|
472
|
-
getScript(libURL + 'jspdf.js', function () {
|
|
473
|
-
getScript(libURL + 'svg2pdf.js', function () {
|
|
474
|
-
downloadPDF();
|
|
475
|
-
});
|
|
476
|
-
});
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
else {
|
|
480
|
-
// PNG/JPEG download - create bitmap from SVG
|
|
481
|
-
svgurl = svgToDataUrl(svg);
|
|
482
|
-
finallyHandler = function () {
|
|
483
|
-
try {
|
|
484
|
-
domurl.revokeObjectURL(svgurl);
|
|
485
|
-
}
|
|
486
|
-
catch (e) {
|
|
487
|
-
// Ignore
|
|
488
|
-
}
|
|
489
|
-
};
|
|
490
|
-
// First, try to get PNG by rendering on canvas
|
|
491
|
-
imageToDataUrl(svgurl, imageType, {}, scale, function (imageURL) {
|
|
492
|
-
// Success
|
|
493
|
-
try {
|
|
494
|
-
downloadURL(imageURL, filename);
|
|
495
|
-
if (successCallback) {
|
|
496
|
-
successCallback();
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
catch (e) {
|
|
500
|
-
failCallback(e);
|
|
501
|
-
}
|
|
502
|
-
}, function () {
|
|
503
|
-
// Failed due to tainted canvas
|
|
504
|
-
// Create new and untainted canvas
|
|
505
|
-
var canvas = doc.createElement('canvas'), ctx = canvas.getContext('2d'), imageWidth = svg.match(/^<svg[^>]*width\s*=\s*\"?(\d+)\"?[^>]*>/)[1] * scale, imageHeight = svg.match(/^<svg[^>]*height\s*=\s*\"?(\d+)\"?[^>]*>/)[1] * scale, downloadWithCanVG = function () {
|
|
506
|
-
var v = win.canvg.Canvg.fromString(ctx, svg);
|
|
507
|
-
v.start();
|
|
508
|
-
try {
|
|
509
|
-
downloadURL(win.navigator.msSaveOrOpenBlob ?
|
|
510
|
-
canvas.msToBlob() :
|
|
511
|
-
canvas.toDataURL(imageType), filename);
|
|
512
|
-
if (successCallback) {
|
|
513
|
-
successCallback();
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
catch (e) {
|
|
517
|
-
failCallback(e);
|
|
518
|
-
}
|
|
519
|
-
finally {
|
|
520
|
-
finallyHandler();
|
|
521
|
-
}
|
|
522
|
-
};
|
|
523
|
-
canvas.width = imageWidth;
|
|
524
|
-
canvas.height = imageHeight;
|
|
525
|
-
if (win.canvg) {
|
|
526
|
-
// Use preloaded canvg
|
|
527
|
-
downloadWithCanVG();
|
|
528
|
-
}
|
|
529
|
-
else {
|
|
530
|
-
// Must load canVG first. // Don't destroy the object URL
|
|
531
|
-
// yet since we are doing things asynchronously. A cleaner
|
|
532
|
-
// solution would be nice, but this will do for now.
|
|
533
|
-
objectURLRevoke = true;
|
|
534
|
-
getScript(libURL + 'canvg.js', function () {
|
|
535
|
-
downloadWithCanVG();
|
|
536
|
-
});
|
|
537
|
-
}
|
|
538
|
-
},
|
|
539
|
-
// No canvas support
|
|
540
|
-
failCallback,
|
|
541
|
-
// Failed to load image
|
|
542
|
-
failCallback,
|
|
543
|
-
// Finally
|
|
544
|
-
function () {
|
|
545
|
-
if (objectURLRevoke) {
|
|
546
|
-
finallyHandler();
|
|
547
|
-
}
|
|
548
|
-
});
|
|
549
|
-
}
|
|
550
|
-
}
|
|
551
|
-
/* eslint-disable valid-jsdoc */
|
|
552
|
-
/**
|
|
553
|
-
* Get SVG of chart prepared for client side export. This converts embedded
|
|
554
|
-
* images in the SVG to data URIs. It requires the regular exporting module. The
|
|
555
|
-
* options and chartOptions arguments are passed to the getSVGForExport
|
|
556
|
-
* function.
|
|
557
|
-
*
|
|
558
|
-
* @private
|
|
559
|
-
* @function Highcharts.Chart#getSVGForLocalExport
|
|
560
|
-
* @param {Highcharts.ExportingOptions} options
|
|
561
|
-
* @param {Highcharts.Options} chartOptions
|
|
562
|
-
* @param {Function} failCallback
|
|
563
|
-
* @param {Function} successCallback
|
|
564
|
-
* @return {void}
|
|
565
|
-
*/
|
|
566
|
-
Chart.prototype.getSVGForLocalExport = function (options, chartOptions, failCallback, successCallback) {
|
|
567
|
-
var chart = this,
|
|
568
|
-
images,
|
|
569
|
-
imagesEmbedded = 0,
|
|
570
|
-
chartCopyContainer,
|
|
571
|
-
chartCopyOptions,
|
|
572
|
-
el,
|
|
573
|
-
i,
|
|
574
|
-
l,
|
|
575
|
-
href,
|
|
576
|
-
// After grabbing the SVG of the chart's copy container we need to do
|
|
577
|
-
// sanitation on the SVG
|
|
578
|
-
sanitize = function (svg) {
|
|
579
|
-
return chart.sanitizeSVG(svg,
|
|
580
|
-
chartCopyOptions);
|
|
581
|
-
},
|
|
582
|
-
// When done with last image we have our SVG
|
|
583
|
-
checkDone = function () {
|
|
584
|
-
if (imagesEmbedded === images.length) {
|
|
585
|
-
successCallback(sanitize(chartCopyContainer.innerHTML));
|
|
586
|
-
}
|
|
587
|
-
},
|
|
588
|
-
// Success handler, we converted image to base64!
|
|
589
|
-
embeddedSuccess = function (imageURL, imageType, callbackArgs) {
|
|
590
|
-
++imagesEmbedded;
|
|
591
|
-
// Change image href in chart copy
|
|
592
|
-
callbackArgs.imageElement.setAttributeNS('http://www.w3.org/1999/xlink', 'href', imageURL);
|
|
593
|
-
checkDone();
|
|
594
|
-
};
|
|
595
|
-
// Hook into getSVG to get a copy of the chart copy's container (#8273)
|
|
596
|
-
chart.unbindGetSVG = addEvent(chart, 'getSVG', function (e) {
|
|
597
|
-
chartCopyOptions = e.chartCopy.options;
|
|
598
|
-
chartCopyContainer = e.chartCopy.container.cloneNode(true);
|
|
599
|
-
});
|
|
600
|
-
// Trigger hook to get chart copy
|
|
601
|
-
chart.getSVGForExport(options, chartOptions);
|
|
602
|
-
images = chartCopyContainer.getElementsByTagName('image');
|
|
603
|
-
try {
|
|
604
|
-
// If there are no images to embed, the SVG is okay now.
|
|
605
|
-
if (!images.length) {
|
|
606
|
-
// Use SVG of chart copy
|
|
607
|
-
successCallback(sanitize(chartCopyContainer.innerHTML));
|
|
608
|
-
return;
|
|
609
|
-
}
|
|
610
|
-
// Go through the images we want to embed
|
|
611
|
-
for (i = 0, l = images.length; i < l; ++i) {
|
|
612
|
-
el = images[i];
|
|
613
|
-
href = el.getAttributeNS('http://www.w3.org/1999/xlink', 'href');
|
|
614
|
-
if (href) {
|
|
615
|
-
imageToDataUrl(href, 'image/png', { imageElement: el }, options.scale, embeddedSuccess,
|
|
616
|
-
// Tainted canvas
|
|
617
|
-
failCallback,
|
|
618
|
-
// No canvas support
|
|
619
|
-
failCallback,
|
|
620
|
-
// Failed to load source
|
|
621
|
-
failCallback);
|
|
622
|
-
// Hidden, boosted series have blank href (#10243)
|
|
623
|
-
}
|
|
624
|
-
else {
|
|
625
|
-
++imagesEmbedded;
|
|
626
|
-
el.parentNode.removeChild(el);
|
|
627
|
-
checkDone();
|
|
628
|
-
}
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
catch (e) {
|
|
632
|
-
failCallback(e);
|
|
633
|
-
}
|
|
634
|
-
// Clean up
|
|
635
|
-
chart.unbindGetSVG();
|
|
636
|
-
};
|
|
637
|
-
/* eslint-enable valid-jsdoc */
|
|
638
|
-
/**
|
|
639
|
-
* Exporting and offline-exporting modules required. Export a chart to an image
|
|
640
|
-
* locally in the user's browser.
|
|
641
|
-
*
|
|
642
|
-
* @function Highcharts.Chart#exportChartLocal
|
|
643
|
-
*
|
|
644
|
-
* @param {Highcharts.ExportingOptions} [exportingOptions]
|
|
645
|
-
* Exporting options, the same as in
|
|
646
|
-
* {@link Highcharts.Chart#exportChart}.
|
|
647
|
-
*
|
|
648
|
-
* @param {Highcharts.Options} [chartOptions]
|
|
649
|
-
* Additional chart options for the exported chart. For example a
|
|
650
|
-
* different background color can be added here, or `dataLabels`
|
|
651
|
-
* for export only.
|
|
833
|
+
OfflineExporting.svgToPdf = svgToPdf;
|
|
834
|
+
})(OfflineExporting || (OfflineExporting = {}));
|
|
835
|
+
/* *
|
|
652
836
|
*
|
|
653
|
-
*
|
|
837
|
+
* Default Export
|
|
654
838
|
*
|
|
655
|
-
*
|
|
656
|
-
*/
|
|
657
|
-
Chart.prototype.exportChartLocal = function (exportingOptions, chartOptions) {
|
|
658
|
-
var chart = this,
|
|
659
|
-
options = merge(chart.options.exporting,
|
|
660
|
-
exportingOptions),
|
|
661
|
-
fallbackToExportServer = function (err) {
|
|
662
|
-
if (options.fallbackToExportServer === false) {
|
|
663
|
-
if (options.error) {
|
|
664
|
-
options.error(options,
|
|
665
|
-
err);
|
|
666
|
-
}
|
|
667
|
-
else {
|
|
668
|
-
error(28, true); // Fallback disabled
|
|
669
|
-
}
|
|
670
|
-
}
|
|
671
|
-
else {
|
|
672
|
-
chart.exportChart(options);
|
|
673
|
-
}
|
|
674
|
-
}, svgSuccess = function (svg) {
|
|
675
|
-
// If SVG contains foreignObjects PDF fails in all browsers and all
|
|
676
|
-
// exports except SVG will fail in IE, as both CanVG and svg2pdf
|
|
677
|
-
// choke on this. Gracefully fall back.
|
|
678
|
-
if (svg.indexOf('<foreignObject') > -1 &&
|
|
679
|
-
options.type !== 'image/svg+xml' &&
|
|
680
|
-
(H.isMS || options.type === 'application/pdf')) {
|
|
681
|
-
fallbackToExportServer('Image type not supported' +
|
|
682
|
-
'for charts with embedded HTML');
|
|
683
|
-
}
|
|
684
|
-
else {
|
|
685
|
-
downloadSVGLocal(svg, extend({ filename: chart.getFilename() }, options), fallbackToExportServer, function () { return fireEvent(chart, 'exportChartLocalSuccess'); });
|
|
686
|
-
}
|
|
687
|
-
},
|
|
688
|
-
// Return true if the SVG contains images with external data. With the
|
|
689
|
-
// boost module there are `image` elements with encoded PNGs, these are
|
|
690
|
-
// supported by svg2pdf and should pass (#10243).
|
|
691
|
-
hasExternalImages = function () {
|
|
692
|
-
return [].some.call(chart.container.getElementsByTagName('image'), function (image) {
|
|
693
|
-
var href = image.getAttribute('href');
|
|
694
|
-
return href !== '' && href.indexOf('data:') !== 0;
|
|
695
|
-
});
|
|
696
|
-
};
|
|
697
|
-
// If we are on IE and in styled mode, add a whitelist to the renderer for
|
|
698
|
-
// inline styles that we want to pass through. There are so many styles by
|
|
699
|
-
// default in IE that we don't want to blacklist them all.
|
|
700
|
-
if (H.isMS && chart.styledMode) {
|
|
701
|
-
SVGRenderer.prototype.inlineWhitelist = [
|
|
702
|
-
/^blockSize/,
|
|
703
|
-
/^border/,
|
|
704
|
-
/^caretColor/,
|
|
705
|
-
/^color/,
|
|
706
|
-
/^columnRule/,
|
|
707
|
-
/^columnRuleColor/,
|
|
708
|
-
/^cssFloat/,
|
|
709
|
-
/^cursor/,
|
|
710
|
-
/^fill$/,
|
|
711
|
-
/^fillOpacity/,
|
|
712
|
-
/^font/,
|
|
713
|
-
/^inlineSize/,
|
|
714
|
-
/^length/,
|
|
715
|
-
/^lineHeight/,
|
|
716
|
-
/^opacity/,
|
|
717
|
-
/^outline/,
|
|
718
|
-
/^parentRule/,
|
|
719
|
-
/^rx$/,
|
|
720
|
-
/^ry$/,
|
|
721
|
-
/^stroke/,
|
|
722
|
-
/^textAlign/,
|
|
723
|
-
/^textAnchor/,
|
|
724
|
-
/^textDecoration/,
|
|
725
|
-
/^transform/,
|
|
726
|
-
/^vectorEffect/,
|
|
727
|
-
/^visibility/,
|
|
728
|
-
/^x$/,
|
|
729
|
-
/^y$/
|
|
730
|
-
];
|
|
731
|
-
}
|
|
732
|
-
// Always fall back on:
|
|
733
|
-
// - MS browsers: Embedded images JPEG/PNG, or any PDF
|
|
734
|
-
// - Embedded images and PDF
|
|
735
|
-
if ((H.isMS &&
|
|
736
|
-
(options.type === 'application/pdf' ||
|
|
737
|
-
chart.container.getElementsByTagName('image').length &&
|
|
738
|
-
options.type !== 'image/svg+xml')) || (options.type === 'application/pdf' &&
|
|
739
|
-
hasExternalImages())) {
|
|
740
|
-
fallbackToExportServer('Image type not supported for this chart/browser.');
|
|
741
|
-
return;
|
|
742
|
-
}
|
|
743
|
-
chart.getSVGForLocalExport(options, chartOptions || {}, fallbackToExportServer, svgSuccess);
|
|
744
|
-
};
|
|
745
|
-
// Extend the default options to use the local exporter logic
|
|
746
|
-
merge(true, getOptions().exporting, {
|
|
747
|
-
libURL: 'https://code.highcharts.com/9.1.1/lib/',
|
|
748
|
-
// When offline-exporting is loaded, redefine the menu item definitions
|
|
749
|
-
// related to download.
|
|
750
|
-
menuItemDefinitions: {
|
|
751
|
-
downloadPNG: {
|
|
752
|
-
textKey: 'downloadPNG',
|
|
753
|
-
onclick: function () {
|
|
754
|
-
this.exportChartLocal();
|
|
755
|
-
}
|
|
756
|
-
},
|
|
757
|
-
downloadJPEG: {
|
|
758
|
-
textKey: 'downloadJPEG',
|
|
759
|
-
onclick: function () {
|
|
760
|
-
this.exportChartLocal({
|
|
761
|
-
type: 'image/jpeg'
|
|
762
|
-
});
|
|
763
|
-
}
|
|
764
|
-
},
|
|
765
|
-
downloadSVG: {
|
|
766
|
-
textKey: 'downloadSVG',
|
|
767
|
-
onclick: function () {
|
|
768
|
-
this.exportChartLocal({
|
|
769
|
-
type: 'image/svg+xml'
|
|
770
|
-
});
|
|
771
|
-
}
|
|
772
|
-
},
|
|
773
|
-
downloadPDF: {
|
|
774
|
-
textKey: 'downloadPDF',
|
|
775
|
-
onclick: function () {
|
|
776
|
-
this.exportChartLocal({
|
|
777
|
-
type: 'application/pdf'
|
|
778
|
-
});
|
|
779
|
-
}
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
});
|
|
783
|
-
// Compatibility
|
|
784
|
-
H.downloadSVGLocal = downloadSVGLocal;
|
|
839
|
+
* */
|
|
785
840
|
|
|
841
|
+
return OfflineExporting;
|
|
786
842
|
});
|
|
787
|
-
_registerModule(_modules, 'masters/modules/offline-exporting.src.js', [], function () {
|
|
843
|
+
_registerModule(_modules, 'masters/modules/offline-exporting.src.js', [_modules['Core/Globals.js'], _modules['Extensions/OfflineExporting/OfflineExporting.js']], function (Highcharts, OfflineExporting) {
|
|
788
844
|
|
|
845
|
+
var G = Highcharts;
|
|
846
|
+
// Compatibility
|
|
847
|
+
G.downloadSVGLocal = OfflineExporting.downloadSVGLocal;
|
|
848
|
+
// Compose
|
|
849
|
+
OfflineExporting.compose(G.Chart);
|
|
789
850
|
|
|
790
851
|
});
|
|
791
852
|
}));
|