gnucash master: Multiple changes pushed

Christopher Lam clam at code.gnucash.org
Thu Jan 23 18:31:06 EST 2020


Updated	 via  https://github.com/Gnucash/gnucash/commit/c77e1975 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/10a0e5c1 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/6b74f80b (commit)
	from  https://github.com/Gnucash/gnucash/commit/490b20d2 (commit)



commit c77e197570faa9fad829554fff41e6a7c66b83c0
Merge: 490b20d2d 10a0e5c16
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Fri Jan 24 07:13:48 2020 +0800

    Merge branch 'master-jqplot-redirect'


commit 10a0e5c166ce3705b5b3f3d374a6cca1d1fe2202
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Fri Jun 21 21:22:40 2019 +0800

    [html-bar/line/pie/scatter] guard all old api calls
    
    This commit guards old jqplot API calls being used with html-chart
    objects. Mainly useful for developers who are transitioning from old
    API to new API, providing error message instead of report crash.

diff --git a/gnucash/report/html-barchart.scm b/gnucash/report/html-barchart.scm
index 8f0b0d843..2f5fe8764 100644
--- a/gnucash/report/html-barchart.scm
+++ b/gnucash/report/html-barchart.scm
@@ -43,6 +43,17 @@
                       button-2-legend-urls 
 		      button-3-legend-urls)))
 
+(define-syntax-rule (gnc:guard-html-chart api)
+  ;; this macro applied to old html-bar/line/scatter/pie apis will
+  ;; guard a report writer from passing html-chart objects. this
+  ;; should be removed in 5.x series.
+  (let ((old-api api))
+    (set! api
+      (lambda args
+        (if (and (pair? args) (gnc:html-chart? (car args)))
+            (gnc:warn "using old-api " (procedure-name api) " on html-chart object. set options via gnc:html-chart-set! or its shortcuts gnc:html-chart-set-title! etc, and set data via gnc:html-chart-add-data-series! see sample-graphs.scm for examples.")
+            (apply old-api args))))))
+
 (define gnc:html-barchart? 
   (record-predicate <html-barchart>))
 
@@ -297,3 +308,47 @@
      (else
       (gnc:warn "null-data, not rendering barchart")
       ""))))
+
+(gnc:guard-html-chart gnc:html-barchart-data)
+(gnc:guard-html-chart gnc:html-barchart-set-data!)
+(gnc:guard-html-chart gnc:html-barchart-width)
+(gnc:guard-html-chart gnc:html-barchart-set-width!)
+(gnc:guard-html-chart gnc:html-barchart-height)
+(gnc:guard-html-chart gnc:html-barchart-set-height!)
+(gnc:guard-html-chart gnc:html-barchart-x-axis-label)
+(gnc:guard-html-chart gnc:html-barchart-set-x-axis-label!)
+(gnc:guard-html-chart gnc:html-barchart-y-axis-label)
+(gnc:guard-html-chart gnc:html-barchart-set-y-axis-label!)
+(gnc:guard-html-chart gnc:html-barchart-row-labels)
+(gnc:guard-html-chart gnc:html-barchart-set-row-labels!)
+(gnc:guard-html-chart gnc:html-barchart-row-labels-rotated?)
+(gnc:guard-html-chart gnc:html-barchart-set-row-labels-rotated?!)
+(gnc:guard-html-chart gnc:html-barchart-stacked?)
+(gnc:guard-html-chart gnc:html-barchart-set-stacked?!)
+(gnc:guard-html-chart gnc:html-barchart-col-labels)
+(gnc:guard-html-chart gnc:html-barchart-set-col-labels!)
+(gnc:guard-html-chart gnc:html-barchart-col-colors)
+(gnc:guard-html-chart gnc:html-barchart-set-col-colors!)
+(gnc:guard-html-chart gnc:html-barchart-legend-reversed?)
+(gnc:guard-html-chart gnc:html-barchart-set-legend-reversed?!)
+(gnc:guard-html-chart gnc:html-barchart-title)
+(gnc:guard-html-chart gnc:html-barchart-set-title!)
+(gnc:guard-html-chart gnc:html-barchart-subtitle)
+(gnc:guard-html-chart gnc:html-barchart-set-subtitle!)
+(gnc:guard-html-chart gnc:html-barchart-button-1-bar-urls)
+(gnc:guard-html-chart gnc:html-barchart-set-button-1-bar-urls!)
+(gnc:guard-html-chart gnc:html-barchart-button-2-bar-urls)
+(gnc:guard-html-chart gnc:html-barchart-set-button-2-bar-urls!)
+(gnc:guard-html-chart gnc:html-barchart-button-3-bar-urls)
+(gnc:guard-html-chart gnc:html-barchart-set-button-3-bar-urls!)
+(gnc:guard-html-chart gnc:html-barchart-button-1-legend-urls)
+(gnc:guard-html-chart gnc:html-barchart-set-button-1-legend-urls!)
+(gnc:guard-html-chart gnc:html-barchart-button-2-legend-urls)
+(gnc:guard-html-chart gnc:html-barchart-set-button-2-legend-urls!)
+(gnc:guard-html-chart gnc:html-barchart-button-3-legend-urls)
+(gnc:guard-html-chart gnc:html-barchart-set-button-3-legend-urls!)
+(gnc:guard-html-chart gnc:html-barchart-append-row!)
+(gnc:guard-html-chart gnc:html-barchart-prepend-row!)
+(gnc:guard-html-chart gnc:html-barchart-append-column!)
+(gnc:guard-html-chart gnc:html-barchart-prepend-column!)
+(gnc:guard-html-chart gnc:html-barchart-render)
diff --git a/gnucash/report/html-linechart.scm b/gnucash/report/html-linechart.scm
index 93a0d2747..4fca2f9ca 100644
--- a/gnucash/report/html-linechart.scm
+++ b/gnucash/report/html-linechart.scm
@@ -50,6 +50,17 @@
                       button-3-legend-urls
                       line-width)))
 
+(define-syntax-rule (gnc:guard-html-chart api)
+  ;; this macro applied to old html-bar/line/scatter/pie apis will
+  ;; guard a report writer from passing html-chart objects. this
+  ;; should be removed in 5.x series.
+  (let ((old-api api))
+    (set! api
+      (lambda args
+        (if (and (pair? args) (gnc:html-chart? (car args)))
+            (gnc:warn "using old-api " (procedure-name api) " on html-chart object. set options via gnc:html-chart-set! or its shortcuts gnc:html-chart-set-title! etc, and set data via gnc:html-chart-add-data-series! see sample-graphs.scm for examples.")
+            (apply old-api args))))))
+
 (define gnc:html-linechart?
   (record-predicate <html-linechart>))
 
@@ -358,3 +369,55 @@
       (gnc:warn "null-data, not rendering linechart")
       ""))))
 
+
+(gnc:guard-html-chart gnc:html-linechart-data)
+(gnc:guard-html-chart gnc:html-linechart-set-data!)
+(gnc:guard-html-chart gnc:html-linechart-width)
+(gnc:guard-html-chart gnc:html-linechart-set-width!)
+(gnc:guard-html-chart gnc:html-linechart-height)
+(gnc:guard-html-chart gnc:html-linechart-set-height!)
+(gnc:guard-html-chart gnc:html-linechart-x-axis-label)
+(gnc:guard-html-chart gnc:html-linechart-set-x-axis-label!)
+(gnc:guard-html-chart gnc:html-linechart-y-axis-label)
+(gnc:guard-html-chart gnc:html-linechart-set-y-axis-label!)
+(gnc:guard-html-chart gnc:html-linechart-row-labels)
+(gnc:guard-html-chart gnc:html-linechart-set-row-labels!)
+(gnc:guard-html-chart gnc:html-linechart-row-labels-rotated?)
+(gnc:guard-html-chart gnc:html-linechart-set-row-labels-rotated?!)
+(gnc:guard-html-chart gnc:html-linechart-stacked?)
+(gnc:guard-html-chart gnc:html-linechart-set-stacked?!)
+(gnc:guard-html-chart gnc:html-linechart-markers?)
+(gnc:guard-html-chart gnc:html-linechart-set-markers?!)
+(gnc:guard-html-chart gnc:html-linechart-major-grid?)
+(gnc:guard-html-chart gnc:html-linechart-set-major-grid?!)
+(gnc:guard-html-chart gnc:html-linechart-minor-grid?)
+(gnc:guard-html-chart gnc:html-linechart-set-minor-grid?!)
+(gnc:guard-html-chart gnc:html-linechart-col-labels)
+(gnc:guard-html-chart gnc:html-linechart-set-col-labels!)
+(gnc:guard-html-chart gnc:html-linechart-col-colors)
+(gnc:guard-html-chart gnc:html-linechart-set-col-colors!)
+(gnc:guard-html-chart gnc:html-linechart-legend-reversed?)
+(gnc:guard-html-chart gnc:html-linechart-set-legend-reversed?!)
+(gnc:guard-html-chart gnc:html-linechart-title)
+(gnc:guard-html-chart gnc:html-linechart-set-title!)
+(gnc:guard-html-chart gnc:html-linechart-subtitle)
+(gnc:guard-html-chart gnc:html-linechart-set-subtitle!)
+(gnc:guard-html-chart gnc:html-linechart-button-1-line-urls)
+(gnc:guard-html-chart gnc:html-linechart-set-button-1-line-urls!)
+(gnc:guard-html-chart gnc:html-linechart-button-2-line-urls)
+(gnc:guard-html-chart gnc:html-linechart-set-button-2-line-urls!)
+(gnc:guard-html-chart gnc:html-linechart-button-3-line-urls)
+(gnc:guard-html-chart gnc:html-linechart-set-button-3-line-urls!)
+(gnc:guard-html-chart gnc:html-linechart-button-1-legend-urls)
+(gnc:guard-html-chart gnc:html-linechart-set-button-1-legend-urls!)
+(gnc:guard-html-chart gnc:html-linechart-button-2-legend-urls)
+(gnc:guard-html-chart gnc:html-linechart-set-button-2-legend-urls!)
+(gnc:guard-html-chart gnc:html-linechart-button-3-legend-urls)
+(gnc:guard-html-chart gnc:html-linechart-set-button-3-legend-urls!)
+(gnc:guard-html-chart gnc:html-linechart-append-row!)
+(gnc:guard-html-chart gnc:html-linechart-prepend-row!)
+(gnc:guard-html-chart gnc:html-linechart-append-column!)
+(gnc:guard-html-chart gnc:html-linechart-prepend-column!)
+(gnc:guard-html-chart gnc:html-linechart-render)
+(gnc:guard-html-chart gnc:html-linechart-set-line-width!)
+(gnc:guard-html-chart gnc:html-linechart-line-width)
diff --git a/gnucash/report/html-piechart.scm b/gnucash/report/html-piechart.scm
index b234e5ee0..169312d9f 100644
--- a/gnucash/report/html-piechart.scm
+++ b/gnucash/report/html-piechart.scm
@@ -41,6 +41,16 @@
 (define gnc:html-piechart? 
   (record-predicate <html-piechart>))
 
+(define-syntax-rule (gnc:guard-html-chart api)
+  ;; this macro applied to old html-bar/line/scatter/pie apis will
+  ;; guard a report writer from passing html-chart objects. this
+  ;; should be removed in 5.x series.
+  (let ((old-api api))
+    (set! api
+      (lambda args
+        (if (and (pair? args) (gnc:html-chart? (car args)))
+            (gnc:warn "using old-api " (procedure-name api) " on html-chart object. set options via gnc:html-chart-set! or its shortcuts gnc:html-chart-set-title! etc, and set data via gnc:html-chart-add-data-series! see sample-graphs.scm for examples.")
+            (apply old-api args))))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;  <html-piechart> class
@@ -161,3 +171,31 @@
      (else
       (gnc:warn "null-data, not rendering piechart")
       ""))))
+
+(gnc:guard-html-chart gnc:html-piechart-data)
+(gnc:guard-html-chart gnc:html-piechart-set-data!)
+(gnc:guard-html-chart gnc:html-piechart-width)
+(gnc:guard-html-chart gnc:html-piechart-set-width!)
+(gnc:guard-html-chart gnc:html-piechart-height)
+(gnc:guard-html-chart gnc:html-piechart-set-height!)
+(gnc:guard-html-chart gnc:html-piechart-labels)
+(gnc:guard-html-chart gnc:html-piechart-set-labels!)
+(gnc:guard-html-chart gnc:html-piechart-colors)
+(gnc:guard-html-chart gnc:html-piechart-set-colors!)
+(gnc:guard-html-chart gnc:html-piechart-title)
+(gnc:guard-html-chart gnc:html-piechart-set-title!)
+(gnc:guard-html-chart gnc:html-piechart-subtitle)
+(gnc:guard-html-chart gnc:html-piechart-set-subtitle!)
+(gnc:guard-html-chart gnc:html-piechart-button-1-slice-urls)
+(gnc:guard-html-chart gnc:html-piechart-set-button-1-slice-urls!)
+(gnc:guard-html-chart gnc:html-piechart-button-2-slice-urls)
+(gnc:guard-html-chart gnc:html-piechart-set-button-2-slice-urls!)
+(gnc:guard-html-chart gnc:html-piechart-button-3-slice-urls)
+(gnc:guard-html-chart gnc:html-piechart-set-button-3-slice-urls!)
+(gnc:guard-html-chart gnc:html-piechart-button-1-legend-urls)
+(gnc:guard-html-chart gnc:html-piechart-set-button-1-legend-urls!)
+(gnc:guard-html-chart gnc:html-piechart-button-2-legend-urls)
+(gnc:guard-html-chart gnc:html-piechart-set-button-2-legend-urls!)
+(gnc:guard-html-chart gnc:html-piechart-button-3-legend-urls)
+(gnc:guard-html-chart gnc:html-piechart-set-button-3-legend-urls!)
+(gnc:guard-html-chart gnc:html-piechart-render)
diff --git a/gnucash/report/html-scatter.scm b/gnucash/report/html-scatter.scm
index 4eec6a108..620d61210 100644
--- a/gnucash/report/html-scatter.scm
+++ b/gnucash/report/html-scatter.scm
@@ -44,6 +44,17 @@
                       markercolor
                       )))
 
+(define-syntax-rule (gnc:guard-html-chart api)
+  ;; this macro applied to old html-bar/line/scatter/pie apis will
+  ;; guard a report writer from passing html-chart objects. this
+  ;; should be removed in 5.x series.
+  (let ((old-api api))
+    (set! api
+      (lambda args
+        (if (and (pair? args) (gnc:html-chart? (car args)))
+            (gnc:warn "using old-api " (procedure-name api) " on html-chart object. set options via gnc:html-chart-set! or its shortcuts gnc:html-chart-set-title! etc, and set data via gnc:html-chart-add-data-series! see sample-graphs.scm for examples.")
+            (apply old-api args))))))
+
 (define gnc:html-scatter? 
   (record-predicate <html-scatter>))
 
@@ -162,3 +173,24 @@
      (else
       (gnc:warn "null-data, not rendering scatter")
       ""))))
+
+(gnc:guard-html-chart gnc:html-scatter-width)
+(gnc:guard-html-chart gnc:html-scatter-set-width!)
+(gnc:guard-html-chart gnc:html-scatter-height)
+(gnc:guard-html-chart gnc:html-scatter-set-height!)
+(gnc:guard-html-chart gnc:html-scatter-title)
+(gnc:guard-html-chart gnc:html-scatter-set-title!)
+(gnc:guard-html-chart gnc:html-scatter-subtitle)
+(gnc:guard-html-chart gnc:html-scatter-set-subtitle!)
+(gnc:guard-html-chart gnc:html-scatter-x-axis-label)
+(gnc:guard-html-chart gnc:html-scatter-set-x-axis-label!)
+(gnc:guard-html-chart gnc:html-scatter-y-axis-label)
+(gnc:guard-html-chart gnc:html-scatter-set-y-axis-label!)
+(gnc:guard-html-chart gnc:html-scatter-data)
+(gnc:guard-html-chart gnc:html-scatter-set-data!)
+(gnc:guard-html-chart gnc:html-scatter-marker)
+(gnc:guard-html-chart gnc:html-scatter-set-marker!)
+(gnc:guard-html-chart gnc:html-scatter-markercolor)
+(gnc:guard-html-chart gnc:html-scatter-set-markercolor!)
+(gnc:guard-html-chart gnc:html-scatter-add-datapoint!)
+(gnc:guard-html-chart gnc:html-scatter-render)

commit 6b74f80bc36d5564183561e92914a80d7d85856b
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Fri Jun 14 21:26:52 2019 +0800

    [html-pie/scatter/bar/linechart] defer to html-chart renderer

diff --git a/gnucash/report/html-barchart.scm b/gnucash/report/html-barchart.scm
index 4032e462d..8f0b0d843 100644
--- a/gnucash/report/html-barchart.scm
+++ b/gnucash/report/html-barchart.scm
@@ -55,6 +55,8 @@
   (record-constructor <html-barchart>))
 
 (define (gnc:make-html-barchart)
+  (issue-deprecation-warning
+   "(gnc:make-html-barchart) is deprecated. use gnc:make-html-chart instead.")
   (gnc:make-html-barchart-internal '(pixels . -1) '(pixels . -1) #f #f #f #f '() '() '() 
 				   #f #f #f '() #f #f #f #f #f #f))
 
@@ -272,308 +274,26 @@
      newcol)))
 
 (define (gnc:html-barchart-render barchart doc)
-  (define (ensure-numeric elt)
-    (cond ((number? elt)
-           (exact->inexact elt))
-          ((string? elt)
-           (with-input-from-string elt
-             (lambda ()
-               (let ((n (read)))
-                 (if (number? n) n 0.0)))))
-          (#t 
-           0.0)))
-  
-  (define (catenate-escaped-strings nlist)
-    (if (not (list? nlist))
-        ""
-        (with-output-to-string
-          (lambda ()
-            (for-each 
-             (lambda (s)
-               (let ((escaped 
-                      (regexp-substitute/global 
-                       #f " " 
-                       (regexp-substitute/global 
-                        #f "\\\\" s
-                        'pre "\\\\" 'post)
-                       'pre "\\ " 'post)))
-                 (display escaped)
-                 (display " ")))
-             nlist)))))
-
-  (let* ((retval '())
-         (push (lambda (l) (set! retval (cons l retval))))
-         (title (gnc:html-barchart-title barchart))
-         (subtitle (gnc:html-barchart-subtitle barchart))
-         (url-1
-          (catenate-escaped-strings 
-           (gnc:html-barchart-button-1-bar-urls barchart)))
-         (url-2
-          (catenate-escaped-strings 
-           (gnc:html-barchart-button-2-bar-urls barchart)))
-         (url-3
-          (catenate-escaped-strings 
-           (gnc:html-barchart-button-3-bar-urls barchart)))
-         (legend-1
-          (catenate-escaped-strings 
-           (gnc:html-barchart-button-1-legend-urls barchart)))
-         (legend-2
-          (catenate-escaped-strings 
-           (gnc:html-barchart-button-2-legend-urls barchart)))
-         (legend-3
-          (catenate-escaped-strings 
-           (gnc:html-barchart-button-3-legend-urls barchart)))
-         (x-label (gnc:html-barchart-x-axis-label barchart))
-         (y-label (gnc:html-barchart-y-axis-label barchart))
-         (data (gnc:html-barchart-data barchart))
-	 (dummy1 (gnc:debug "data " data))
-         (row-labels (catenate-escaped-strings 
-                      (gnc:html-barchart-row-labels barchart)))
-         (col-labels (catenate-escaped-strings 
-                      (gnc:html-barchart-col-labels barchart)))
-         ;; convert color list to string with valid js array of strings, example: "\"blue\", \"red\""
-         (colors-str (string-join (map (lambda (color)
-					 (string-append "\"" color "\""))
-				       (gnc:html-barchart-col-colors barchart)) ", "))
-         (series-data-start (lambda (series-index)
-                         (push "var d")
-                         (push series-index)
-                         (push " = [];\n")))
-         (series-data-add (lambda (series-index x y)
-                         (push (string-append
-                               "  d"
-                               (number->string series-index)
-                               ".push(["
-                               (number->string x)
-                               ", "
-                               (number->string y)
-                               "]);\n"))))
-         (series-data-end (lambda (series-index label)
-                         (push "data.push(d")
-                         (push series-index)
-                         (push ");\n")
-                         (push (format #f "series.push({ label: ~s });\n\n"
-                                       (gnc:html-string-sanitize label)))
-                         ))
-         ; Use a unique chart-id for each chart. This prevents chart
-         ; clashed on multi-column reports
-         (chart-id (string-append "chart-" (number->string (random 999999)))))
-    (if (and (list? data)
-             (not (null? data))
-             (gnc:not-all-zeros data))
-        (begin
-            (push (gnc:html-js-include "jqplot/jquery.min.js"))
-            (push (gnc:html-js-include "jqplot/jquery.jqplot.js"))
-            (push (gnc:html-js-include "jqplot/jqplot.barRenderer.js"))
-            (push (gnc:html-js-include "jqplot/jqplot.cursor.js"))
-            (push (gnc:html-js-include "jqplot/jqplot.categoryAxisRenderer.js"))
-            (push (gnc:html-js-include "jqplot/jqplot.highlighter.js"))
-            (push (gnc:html-js-include "jqplot/jqplot.canvasTextRenderer.js"))
-            (push (gnc:html-js-include "jqplot/jqplot.canvasAxisTickRenderer.js"))
-
-            (push (gnc:html-css-include "jqplot/jquery.jqplot.css"))
-            (push "<div id=\"")(push chart-id)(push "\" style=\"width:")
-            (push (cdr (gnc:html-barchart-width barchart)))
-            (if (eq? 'pixels (car (gnc:html-barchart-width barchart)))
-                 (push "px;height:")
-                 (push "%;height:"))
-
-            (push (cdr (gnc:html-barchart-height barchart)))
-            (if (eq? 'pixels (car (gnc:html-barchart-height barchart)))
-                 (push "px;\"></div>\n")
-                 (push "%;\"></div>\n"))
-            (push "<script id=\"source\">\n$(function () {")
-
-            (push "var data = [];")
-            (push "var series = [];\n")
-
-            (if (and data (list? data))
-              (let ((rows (length data))
-                    (cols 0))
-                (let loop ((col 0) (rowcnt 1))
-                  (series-data-start col)
-                  (if (list? (car data))
-                      (begin 
-                        (set! cols (length (car data)))))    
-                  (for-each
-                    (lambda (row)
-                      (if (<= rowcnt rows)
-                        (series-data-add col rowcnt
-                                       (ensure-numeric (list-ref-safe row col)))
-                      )
-                      (set! rowcnt (+ rowcnt 1)))
-                    data)
-                  (series-data-end col (list-ref-safe (gnc:html-barchart-col-labels barchart) col))
-                  (if (< col (- cols 1))
-                      (loop (+ 1 col) 1)))))
-
-
-            (push "var all_ticks = [")
-            (for-each
-                (lambda (val)
-                    (push "\"")
-                    (push val)
-                    (push "\","))
-                (gnc:html-barchart-row-labels barchart))
-            (push "];\n")
-            (push "var options = {
-                   shadowAlpha: 0.07,
-                   stackSeries: false,
-                   legend: {
-                        show: true,
-                        placement: \"outsideGrid\", },
-                   seriesDefaults: {
-                        renderer: $.jqplot.BarRenderer,
-                        rendererOptions: {
-                            shadowAlpha: 0.04,
-                            shadowDepth: 3,
-                        },
-                        fillToZero: true,
-                   },
-                   series: series,
-                   axesDefaults: {
-                   },
-                   grid: {
-                   },
-                   axes: {
-                       xaxis: {
-                           renderer:$.jqplot.CategoryAxisRenderer,
-                           tickRenderer: $.jqplot.CanvasAxisTickRenderer,
-                           tickOptions: {
-                               angle: -30,
-                               fontSize: '10pt',
-                           },
-                       },
-                       yaxis: {
-                           autoscale: true,
-                       },
-                   },
-                   highlighter: {
-                       tooltipContentEditor: formatTooltip,
-                   },
-                   cursor:{
-                       show: true,
-                       showTooltip: false,
-                       zoom: true,
-                   },
-                   seriesColors: false,
-                };\n")
-
-            (push "  options.stackSeries = ")
-            (push (if (gnc:html-barchart-stacked? barchart)
-                "true;\n"
-                "false;\n"))
-
-            (if title
-                (push (format #f "  options.title = ~s;\n"
-                              (gnc:html-string-sanitize title))))
-
-            (if subtitle
-                (push (format #f "  options.title += ' <br />' + ~s;\n"
-                               (gnc:html-string-sanitize subtitle))))
-
-
-            (if (and (string? x-label) (> (string-length x-label) 0))
-              (begin 
-                (push "  options.axes.xaxis.label = \"")
-                (push x-label)
-                (push "\";\n")))
-            (if (and (string? y-label) (> (string-length y-label) 0))
-              (begin 
-                (push "  options.axes.yaxis.label = \"")
-                (push y-label)
-                (push "\";\n")))
-            (push "  options.axes.xaxis.ticks = all_ticks;\n")
-            (if (not (equal? colors-str ""))
-                (begin            ; example: options.seriesColors= ["blue", "red"];
-                  (push "options.seriesColors = [")
-                  (push colors-str)
-                  (push "];\n")
-                  (push "options.negativeSeriesColors = [")
-                  (push colors-str)
-                  (push "];\n")
-                  )
-                )
-
-
-            (push "$.jqplot.config.enablePlugins = true;\n")
-            (push "$(document).ready(function() {
-var plot = $.jqplot('")(push chart-id)(push"', data, options);
-plot.axes.xaxis.ticks = getVisualTicks();
-plot.replot();
-var timer;
-var load_timer;
-
-// var win_width = $(window).width();
-// var win_height = $(window).height();
-// console.log( 'Window Width ' + win_width + ' Height ' + win_height);
-
-// var doc_width = document.body.clientWidth;
-// var doc_height = document.body.clientHeight;
-// console.log( 'Doc Width ' + doc_width + ' Height ' + doc_height);
-
-$(window).resize(function () {
-    clearTimeout(timer);
-    timer = setTimeout(function () {
-        plot.replot({resetAxes: true });
-        $.each(plot.series, function(index, series) {
-            series.barWidth = undefined;
-        });
-        plot.axes.xaxis.ticks = getVisualTicks();
-//        console.log( 'Resize Timer!' );
-        plot.replot();
-    }, 100);
-    });
-
-$(window).on('load', function () {
-    var hasVScroll = document.body.scrollHeight > document.body.clientHeight;
-    clearTimeout(load_timer);
-    load_timer = setTimeout(function () {
-//        console.log( 'Load Timer!' );
-        if(hasVScroll)
-        {
-//            console.log( 'Load Timer Replot!' );
-            plot.replot();
-        }
-    },100);
-    });
-});
-
-function formatTooltip(str, seriesIndex, pointIndex) {
-    if (options.axes.xaxis.ticks[pointIndex] !== undefined)
-        x = options.axes.xaxis.ticks[pointIndex];
-    else
-        x = pointIndex;
-    y = data[seriesIndex][pointIndex][1].toFixed(2);
-    return options.series[seriesIndex].label + '<br/>' + x + '<br/><b>' + y + '</b>';
-}
-
-function getVisualTicks() {
-    var chart_width = document.getElementById(\"")(push chart-id)(push"\").getElementsByClassName(\"jqplot-zoom-canvas\")[0].width;
-    var num_ticks = all_ticks.length;
-    var label_width = 25;
-    var num_labels = chart_width / label_width;
-    var show_every_nth_label = Math.ceil (num_ticks / num_labels);
-    var visual_ticks = [];
-
-    if (show_every_nth_label == 0)
-        show_every_nth_label = 1;
-    for (counter = 0; counter < all_ticks.length; counter++) {
-        if ((counter % show_every_nth_label) == 0)
-            visual_ticks.push (all_ticks[counter]);
-        else
-            visual_ticks.push (' ');
-    }
-//    console.log( 'getVis chart_width ' + chart_width );
-    return visual_ticks;
-}\n")
-
-            (push "});\n</script>")
-
-            (gnc:msg (string-join (reverse (map (lambda (e) (if (number? e) (number->string e) e)) retval)) ""))
- 
-        )
-        (begin 
-          (gnc:warn "barchart has no non-zero data.")
-            " "))
-    retval))
+  (let* ((chart (gnc:make-html-chart))
+         (data (gnc:html-barchart-data barchart)))
+    (cond
+     ((and (pair? data) (gnc:not-all-zeros data))
+      (gnc:html-chart-set-type! chart 'bar)
+      (gnc:html-chart-set-width! chart (gnc:html-barchart-width barchart))
+      (gnc:html-chart-set-height! chart (gnc:html-barchart-height barchart))
+      (gnc:html-chart-set-data-labels! chart (gnc:html-barchart-row-labels barchart))
+      (for-each
+       (lambda (label series color)
+         (gnc:html-chart-add-data-series! chart label series color))
+       (gnc:html-barchart-col-labels barchart)
+       data
+       (gnc:html-barchart-col-colors barchart))
+      (gnc:html-chart-set-title! chart (list
+                                        (gnc:html-barchart-title barchart)
+                                        (gnc:html-barchart-subtitle barchart)))
+      (gnc:html-chart-set-stacking?! chart (gnc:html-barchart-stacked? barchart))
+      (gnc:html-chart-render chart doc))
+
+     (else
+      (gnc:warn "null-data, not rendering barchart")
+      ""))))
diff --git a/gnucash/report/html-linechart.scm b/gnucash/report/html-linechart.scm
index 44ebd40b1..93a0d2747 100644
--- a/gnucash/report/html-linechart.scm
+++ b/gnucash/report/html-linechart.scm
@@ -62,6 +62,8 @@
   (record-constructor <html-linechart>))
 
 (define (gnc:make-html-linechart)
+  (issue-deprecation-warning
+   "(gnc:make-html-linechart) is deprecated. use gnc:make-html-chart instead.")
   (gnc:make-html-linechart-internal
     '(pixels . -1)  ;;width
     '(pixels . -1)  ;;height
@@ -327,284 +329,32 @@
      newcol)))
 
 (define (gnc:html-linechart-render linechart doc)
-  (define (ensure-numeric elt)
-    (cond ((number? elt)
-           (exact->inexact elt))
-          ((string? elt)
-           (with-input-from-string elt
-             (lambda ()
-               (let ((n (read)))
-                 (if (number? n) n 0.0)))))
-          (#t
-           0.0)))
-
-  (define (catenate-escaped-strings nlist)
-    (if (not (list? nlist))
-        ""
-        (with-output-to-string
-          (lambda ()
-            (for-each
-             (lambda (s)
-               (let ((escaped
-                      (regexp-substitute/global
-                       #f " "
-                       (regexp-substitute/global
-                        #f "\\\\" s
-                        'pre "\\\\" 'post)
-                       'pre "\\ " 'post)))
-                 (display escaped)
-                 (display " ")))
-             nlist)))))
-
-  (let* ((retval '())
-         (push (lambda (l) (set! retval (cons l retval))))
-         (title (gnc:html-linechart-title linechart))
-         (subtitle (gnc:html-linechart-subtitle linechart))
-         (url-1
-          (catenate-escaped-strings
-           (gnc:html-linechart-button-1-line-urls linechart)))
-         (url-2
-          (catenate-escaped-strings
-           (gnc:html-linechart-button-2-line-urls linechart)))
-         (url-3
-          (catenate-escaped-strings
-           (gnc:html-linechart-button-3-line-urls linechart)))
-         (legend-1
-          (catenate-escaped-strings
-           (gnc:html-linechart-button-1-legend-urls linechart)))
-         (legend-2
-          (catenate-escaped-strings
-           (gnc:html-linechart-button-2-legend-urls linechart)))
-         (legend-3
-          (catenate-escaped-strings
-           (gnc:html-linechart-button-3-legend-urls linechart)))
-         (x-label (gnc:html-linechart-x-axis-label linechart))
-         (y-label (gnc:html-linechart-y-axis-label linechart))
+  (let* ((chart (gnc:make-html-chart))
          (data (gnc:html-linechart-data linechart))
-	 (dummy1 (gnc:debug "data " data))
-         (row-labels (catenate-escaped-strings
-                      (gnc:html-linechart-row-labels linechart)))
-         (col-labels (catenate-escaped-strings
-                      (gnc:html-linechart-col-labels linechart)))
-         ;; convert color list to string with valid js array of strings, example: "\"blue\", \"red\""
-         (colors-str (string-join (map (lambda (color)
-                                         (string-append "\"" color "\""))
-                                       (gnc:html-linechart-col-colors linechart)) ", "))
          (line-width (gnc:html-linechart-line-width linechart))
-         (series-data-start (lambda (series-index)
-                         (push "var d")
-                         (push series-index)
-                         (push " = [];\n")))
-         (series-data-add (lambda (series-index date y)
-                         (push (string-append
-                               "  d"
-                               (number->string series-index)
-                               ".push(["
-                               "\"" date "\""
-                               ", "
-                               (number->string y)
-                               "]);\n"))))
-         (series-data-end (lambda (series-index label)
-                         (push "data.push(d")
-                         (push series-index)
-                         (push ");\n")
-                         (push (format #f "series.push({ label: ~s });\n\n"
-                                       (gnc:html-string-sanitize label)))))
-         ; Use a unique chart-id for each chart. This prevents chart
-         ; clashed on multi-column reports
-         (chart-id (string-append "chart-" (number->string (random 999999)))))
-    (if (and (list? data)
-             (not (null? data))
-             (gnc:not-all-zeros data))
-        (begin
-            (push (gnc:html-js-include "jqplot/jquery.min.js"))
-            (push (gnc:html-js-include "jqplot/jquery.jqplot.js"))
-            (push (gnc:html-js-include "jqplot/jqplot.cursor.js"))
-            (push (gnc:html-js-include "jqplot/jqplot.dateAxisRenderer.js"))
-            (push (gnc:html-js-include "jqplot/jqplot.highlighter.js"))
-            (push (gnc:html-js-include "jqplot/jqplot.canvasTextRenderer.js"))
-            (push (gnc:html-js-include "jqplot/jqplot.canvasAxisTickRenderer.js"))
-            (push (gnc:html-css-include "jqplot/jquery.jqplot.css"))
-
-            (push "<div id=\"")(push chart-id)(push "\" style=\"width:")
-            (push (cdr (gnc:html-linechart-width linechart)))
-            (if (eq? 'pixels (car (gnc:html-linechart-width linechart)))
-                 (push "px;height:")
-                 (push "%;height:"))
-
-            (push (cdr (gnc:html-linechart-height linechart)))
-            (if (eq? 'pixels (car (gnc:html-linechart-height linechart)))
-                 (push "px;\"></div>\n")
-                 (push "%;\"></div>\n"))
-            (push "<script id=\"source\">\n$(function () {")
-
-            (push "var data = [];")
-            (push "var series = [];\n")
-
-            (if (and data (list? data))
-              (let ((rows (length data))
-                    (cols 0))
-                (let loop ((col 0) (rowcnt 0))
-                  (series-data-start col)
-                  (if (list? (car data))
-                      (begin 
-                        (set! cols (length (car data)))))    
-                  (for-each
-                    (lambda (row)
-                      (if (< rowcnt rows)
-                        (series-data-add col
-                          (list-ref (gnc:html-linechart-row-labels linechart) rowcnt)
-                          (ensure-numeric (list-ref-safe row col))
-                        )
-                      )
-                      (set! rowcnt (+ rowcnt 1)))
-                    data)
-                  (series-data-end col (list-ref-safe (gnc:html-linechart-col-labels linechart) col))
-                  (if (< col (- cols 1))
-                      (loop (+ 1 col) 0)))))
-
-
-            (push "var options = {
-                   shadowAlpha: 0.07,
-                   legend: {
-                        show: true,
-                        placement: \"outsideGrid\", },
-                   seriesDefaults: {
-                        lineWidth: ")
-            (push (ensure-numeric line-width))
-            (push ",
-                        showMarker: true,
-                   },
-                   series: series,
-                   axesDefaults: {
-                   },        
-                   grid: {
-                   },
-                   axes: {
-                       xaxis: {
-                           renderer:$.jqplot.DateAxisRenderer,
-                           tickRenderer: $.jqplot.CanvasAxisTickRenderer,
-                           tickOptions: {
-                               angle: -30,
-                               fontSize: '10pt',
-                           },
-                       },
-                       yaxis: {
-                           autoscale: true,
-                       },
-                   },
-                   highlighter: {
-                       tooltipContentEditor: formatTooltip,
-                       tooltipLocation: 'ne',
-                   },
-                   cursor: {
-                       show: true,
-                       zoom: true
-                   },
-                   seriesColors: false,
-                };\n")
-
-            (push "  options.stackSeries = ")
-            (push (if (gnc:html-linechart-stacked? linechart)
-                "true;\n"
-                "false;\n"))
-
-            (push "  options.seriesDefaults.showMarker = ")
-            (push (if (gnc:html-linechart-markers? linechart)
-                "true;\n"
-                "false;\n"))
-
-            (push "  options.axesDefaults.drawMajorGridlines = ")
-            (push (if (gnc:html-linechart-major-grid? linechart)
-                "true;\n"
-                "false;\n"))
-
-            (push "  options.axesDefaults.drawMinorGridlines = ")
-            (push (if (gnc:html-linechart-minor-grid? linechart)
-                "true;\n"
-                "false;\n"))
-
-            (if title
-                (push (format #f "  options.title = ~s;\n"
-                              (gnc:html-string-sanitize title))))
-
-            (if subtitle
-                (push (format #f "  options.title += ' <br />' + ~s;\n"
-                              (gnc:html-string-sanitize subtitle))))
-
-            (if (and (string? x-label) (> (string-length x-label) 0))
-              (begin 
-                (push "  options.axes.xaxis.label = \"")
-                (push x-label)
-                (push "\";\n")))
-            (if (and (string? y-label) (> (string-length y-label) 0))
-              (begin 
-                (push "  options.axes.yaxis.label = \"")
-                (push y-label)
-                (push "\";\n")))
-	    (if (not (equal? colors-str ""))
-                (begin            ; example: options.seriesColors= ["blue", "red"];
-                  (push "options.seriesColors = [")
-                  (push colors-str)
-                  (push "];\n")
-                  )
-                )
-
-            ;; adjust the date string format to the one given by the preferences
-            (push "  options.axes.xaxis.tickOptions.formatString = '")
-            (push (qof-date-format-get-string (qof-date-format-get)))
-            (push "';\n")
-
-            (push "$.jqplot.config.enablePlugins = true;\n")
-            (push "$(document).ready(function() {
-var plot = $.jqplot('")(push chart-id)(push"', data, options);
-plot.replot();
-var timer;
-var load_timer;
-
-// var win_width = $(window).width();
-// var win_height = $(window).height();
-// console.log( 'Window Width ' + win_width + ' Height ' + win_height);
-
-// var doc_width = document.body.clientWidth;
-// var doc_height = document.body.clientHeight;
-// console.log( 'Doc Width ' + doc_width + ' Height ' + doc_height);
-
-$(window).resize(function () {
-    clearTimeout(timer);
-    timer = setTimeout(function () {
-//        console.log( 'Resize Timer!' );
-        plot.replot();
-    }, 100);
-    });
-
-$(window).on('load', function () {
-    var hasVScroll = document.body.scrollHeight > document.body.clientHeight;
-    clearTimeout(load_timer);
-    load_timer = setTimeout(function () {
-//        console.log( 'Load Timer!' );
-        if(hasVScroll)
-        {
-//            console.log( 'Load Timer Replot!' );
-            plot.replot();
-        }
-    },100);
-    });
-});
-
-function formatTooltip(str, seriesIndex, pointIndex) {
-    x = $.jqplot.DateTickFormatter (options.axes.xaxis.tickOptions.formatString,
-                                    data[seriesIndex][pointIndex][0]);
-    y = data[seriesIndex][pointIndex][1].toFixed(2);
-    return options.series[seriesIndex].label + ' ' + x + '<br><b>' + y + '</b>';
-}\n")
-
-            (push "});\n</script>")
-
-            (gnc:msg (string-join (reverse (map (lambda (e) (if (number? e) (number->string e) e)) retval)) ""))
-            
-        )
-        (begin
-          (gnc:warn "linechart has no non-zero data.")
-            " "))
-    retval))
+         (radius (if (gnc:html-linechart-markers? linechart) 3 0)))
+    (cond
+     ((and (pair? data) (gnc:not-all-zeros data))
+      (gnc:html-chart-set-type! chart 'line)
+      (gnc:html-chart-set-width! chart (gnc:html-linechart-width linechart))
+      (gnc:html-chart-set-height! chart (gnc:html-linechart-height linechart))
+      (gnc:html-chart-set-data-labels! chart (gnc:html-linechart-row-labels linechart))
+      (for-each
+       (lambda (label series color)
+         (gnc:html-chart-add-data-series! chart label series color
+                                          'borderWidth line-width
+                                          'pointRadius radius
+                                          'fill #f))
+       (gnc:html-linechart-col-labels linechart)
+       (apply zip data)
+       (gnc:html-linechart-col-colors linechart))
+      (gnc:html-chart-set-title! chart (list
+                                        (gnc:html-linechart-title linechart)
+                                        (gnc:html-linechart-subtitle linechart)))
+      (gnc:html-chart-set-stacking?! chart (gnc:html-linechart-stacked? linechart))
+      (gnc:html-chart-render chart doc))
+
+     (else
+      (gnc:warn "null-data, not rendering linechart")
+      ""))))
+
diff --git a/gnucash/report/html-piechart.scm b/gnucash/report/html-piechart.scm
index f30ac8e51..b234e5ee0 100644
--- a/gnucash/report/html-piechart.scm
+++ b/gnucash/report/html-piechart.scm
@@ -51,6 +51,8 @@
   (record-constructor <html-piechart>))
 
 (define (gnc:make-html-piechart)
+  (issue-deprecation-warning
+   "(gnc:make-html-piechart) is deprecated. use gnc:make-html-chart instead.")
   (gnc:make-html-piechart-internal '(pixels . -1) '(pixels . -1) #f #f #f #f #f #f #f #f #f #f #f))
 
 (define gnc:html-piechart-data
@@ -140,153 +142,22 @@
   (record-modifier <html-piechart> 'button-3-legend-urls))
 
 (define (gnc:html-piechart-render piechart doc)
-  (define (ensure-positive-numbers nlist)
-    (map
-     (lambda (elt)
-       (cond ((number? elt)
-              (exact->inexact (abs elt)))
-             ((string? elt)
-              (with-input-from-string elt
-                (lambda ()
-                  (let ((n (read)))
-                    (if (number? n) (abs n) 0.0)))))
-             (#t
-              0.0)))
-     nlist))
-  
-  (define (catenate-escaped-strings nlist)
-    (if (not (list? nlist))
-        ""
-        (with-output-to-string
-          (lambda ()
-            (for-each 
-             (lambda (s)
-               (let ((escaped 
-                      (regexp-substitute/global 
-                       #f " " 
-                       (regexp-substitute/global 
-                        #f "\\\\" s
-                        'pre "\\\\" 'post)
-                       'pre "\\ " 'post)))
-                 (display escaped)
-                 (display " ")))
-             nlist)))))
-  
-  (let* ((retval '())
-         (push (lambda (l) (set! retval (cons l retval))))
+  (let* ((chart (gnc:make-html-chart))
          (title (gnc:html-piechart-title piechart))
          (subtitle (gnc:html-piechart-subtitle piechart))
-         (url-1
-          (catenate-escaped-strings 
-           (gnc:html-piechart-button-1-slice-urls piechart)))
-         (url-2 
-          (catenate-escaped-strings 
-           (gnc:html-piechart-button-2-slice-urls piechart)))
-         (url-3
-          (catenate-escaped-strings 
-           (gnc:html-piechart-button-3-slice-urls piechart)))
-         (legend-1
-          (catenate-escaped-strings 
-           (gnc:html-piechart-button-1-legend-urls piechart)))
-         (legend-2 
-          (catenate-escaped-strings 
-           (gnc:html-piechart-button-2-legend-urls piechart)))
-         (legend-3
-          (catenate-escaped-strings 
-           (gnc:html-piechart-button-3-legend-urls piechart)))
-         (data 
-          (ensure-positive-numbers (gnc:html-piechart-data piechart)))
-         ;; convert color list to string with valid js array of strings, example: "\"blue\", \"red\""
-         (colors-str (string-join (map (lambda (color)
-                                         (string-append "\"" color "\""))
-                                       (gnc:html-piechart-colors piechart)) ", "))
-         ; Use a unique chart-id for each chart. This prevents chart
-         ; clashed on multi-column reports
-         (chart-id (string-append "chart-" (number->string (random 999999)))))
-    (if (and (list? data) 
-             (not (null? data)))
-        (begin 
-            (push (gnc:html-js-include "jqplot/jquery.min.js"))
-            (push (gnc:html-js-include "jqplot/jquery.jqplot.js"))
-            (push (gnc:html-js-include "jqplot/jqplot.pieRenderer.js"))
-            (push (gnc:html-css-include "jqplot/jquery.jqplot.css"))
-
-            (push "<div id=\"")(push chart-id)(push "\" style=\"width:")
-            (push (cdr (gnc:html-piechart-width piechart)))
-            (if (eq? 'pixels (car (gnc:html-piechart-width piechart)))
-                 (push "px;height:")
-                 (push "%;height:"))
-
-            (push (cdr (gnc:html-piechart-height piechart)))
-            (if (eq? 'pixels (car (gnc:html-piechart-height piechart)))
-                 (push "px;\"></div>\n")
-                 (push "%;\"></div>\n"))
-            (push "<script id=\"source\">\n$(function () {")
-
-            (push "var data = [];\n")
-
-            (if (and data (list? data))
-              (begin 
-                (for-each 
-                 (lambda (datum label)
-                   (push (format #f "  data.push([~s,~a]);\n"
-                                 (gnc:html-string-sanitize label)
-                                 datum)))
-                 data (gnc:html-piechart-labels piechart))))
-
-            (push "var options = {
-                    seriesDefaults: {
-                        renderer: $.jqplot.PieRenderer,
-                    },
-                    legend: {
-                         show: true,
-                         placement: \"outsideGrid\", },
-                    highlighter: {
-                         show: false },
-                    cursor: {
-                         showTooltip: false },
-                    seriesColors: false,
-                   };\n")
-
-            (if title
-                (push (format #f "  options.title = ~s;\n"
-                              (gnc:html-string-sanitize title))))
-            (if subtitle
-                (push (format #f "  options.title += ' (' + ~s + ')';\n"
-                              (gnc:html-string-sanitize subtitle))))
-
-            (if (not (equal? colors-str ""))
-                (begin            ; example: options.seriesColors= ["blue", "red"];
-                  (push "options.seriesColors = [")
-                  (push colors-str)
-                  (push "];\n")
-                  )
-                )
-
-            (push "$.jqplot.config.enablePlugins = true;\n")
-            (push "$(document).ready(function() {
-var plot = $.jqplot('")(push chart-id)(push "', [data], options);
-plot.replot();
-var timer;
-
-// var win_width = $(window).width();
-// var win_height = $(window).height();
-// console.log( 'Window Width ' + win_width + ' Height ' + win_height);
-
-// var doc_width = document.body.clientWidth;
-// var doc_height = document.body.clientHeight;
-// console.log( 'Doc Width ' + doc_width + ' Height ' + doc_height);
-
-$(window).resize(function () {
-    clearTimeout(timer);
-    timer = setTimeout(function () {
-//        console.log( 'Resize Timer!' );
-        plot.replot();
-    }, 100);
-    });
-});\n")
-
-            (push "});\n</script>"))
-        (begin (gnc:warn "null-data, not rendering piechart")
-               " "))
-    retval))
+         (data  (gnc:html-piechart-data piechart))
+         (colors (gnc:html-piechart-colors piechart)))
+    (cond
+     ((and (pair? data) (gnc:not-all-zeros data))
+      (gnc:html-chart-set-type! chart 'pie)
+      (gnc:html-chart-set-axes-display! chart #f)
+      (gnc:html-chart-set-width! chart (gnc:html-piechart-width piechart))
+      (gnc:html-chart-set-height! chart (gnc:html-piechart-height piechart))
+      (gnc:html-chart-set-data-labels! chart (gnc:html-piechart-labels piechart))
+      (gnc:html-chart-add-data-series! chart "" data colors)
+      (gnc:html-chart-set-title! chart (list title subtitle))
+      (gnc:html-chart-render chart doc))
+
+     (else
+      (gnc:warn "null-data, not rendering piechart")
+      ""))))
diff --git a/gnucash/report/html-scatter.scm b/gnucash/report/html-scatter.scm
index 8167d1951..4eec6a108 100644
--- a/gnucash/report/html-scatter.scm
+++ b/gnucash/report/html-scatter.scm
@@ -56,6 +56,8 @@
   (record-constructor <html-scatter>))
 
 (define (gnc:make-html-scatter)
+  (issue-deprecation-warning
+   "(gnc:make-html-scatter) is deprecated. use gnc:make-html-chart instead.")
   (gnc:make-html-scatter-internal '(pixels . -1) '(pixels . -1) #f #f #f #f '() #f #f))
 
 (define gnc:html-scatter-width
@@ -121,132 +123,42 @@
 
 ;; The Renderer
 (define (gnc:html-scatter-render scatter doc)
-  (define (ensure-numeric elt)
-    (cond ((number? elt)
-           (exact->inexact elt))
-          ((string? elt)
-           (with-input-from-string elt
-             (lambda ()
-               (let ((n (read)))
-                 (if (number? n) n 0.0)))))
-          (#t
-           0.0)))
-  
-  (let* ((retval '())
-         (push (lambda (l) (set! retval (cons l retval))))
-         (title (gnc:html-scatter-title scatter))
-         (subtitle (gnc:html-scatter-subtitle scatter))
-         (x-label (gnc:html-scatter-x-axis-label scatter))
-         (y-label (gnc:html-scatter-y-axis-label scatter))
-         (data (gnc:html-scatter-data scatter))
-         (marker (gnc:html-scatter-marker scatter))
-         (markercolor (string-append "#" (gnc:html-scatter-markercolor scatter)))
-         ; Use a unique chart-id for each chart. This prevents chart
-         ; clashed on multi-column reports
-         (chart-id (string-append "chart-" (number->string (random 999999)))))
-    (if (and (list? data)
-             (not (null? data)))
-        (begin
-            (push (gnc:html-js-include "jqplot/jquery.min.js"))
-            (push (gnc:html-js-include "jqplot/jquery.jqplot.js"))
-            (push (gnc:html-css-include "jqplot/jquery.jqplot.css"))
-
-            (push "<div id=\"")(push chart-id)(push "\" style=\"width:")
-            (push (cdr (gnc:html-scatter-width scatter)))
-            (if (eq? 'pixels (car (gnc:html-scatter-width scatter)))
-                 (push "px;height:")
-                 (push "%;height:"))
-
-            (push (cdr (gnc:html-scatter-height scatter)))
-            (if (eq? 'pixels (car (gnc:html-scatter-height scatter)))
-                 (push "px;\"></div>\n")
-                 (push "%;\"></div>\n"))
-            (push "<script id=\"source\">\n$(function () {")
-
-            (push "var data = [];")
-            (push "var series = [];\n")
-
-            (if (and data (list? data))
-              (let ((x-data (map-in-order car data))
-                    (y-data (map-in-order cadr data)))
-                (for-each (lambda (x y)
-                         (push "  data.push([")
-                         (push (ensure-numeric x))
-                         (push ", ")
-                         (push (ensure-numeric y))
-                         (push "]);\n"))
-                       x-data y-data)
-            ))
-
-
-            (push "var options = {
-                    legend: { show: false, },
-                    seriesDefaults: {
-                        markerOptions: {
-                            style: '")
-            (push marker)
-            (push "',
-                            color: '")
-            (push markercolor)
-            (push "', },
-                    },
-                    series: series,
-                    axesDefaults: {
-                    },        
-                    axes: {
-                        xaxis: {
-                        },
-                        yaxis: {
-                            autoscale: true,
-                        },
-                    },
-                };\n")
-
-            (if title
-                (push (format #f "  options.title = ~s;\n"
-                              (gnc:html-string-sanitize title))))
-
-            (if subtitle
-                (push (format #f "  options.title += ' (' + ~s + ')';\n"
-                              (gnc:html-string-sanitize subtitle))))
-
-            (if (and (string? x-label) (> (string-length x-label) 0))
-              (begin
-                (push "  options.axes.xaxis.label = \"")
-                (push x-label)
-                (push "\";\n")))
-            (if (and (string? y-label) (> (string-length y-label) 0))
-              (begin
-                (push "  options.axes.yaxis.label = \"")
-                (push y-label)
-                (push "\";\n")))
-
-
-            (push "$.jqplot.config.enablePlugins = true;\n")
-            (push "$(document).ready(function() {
-var plot = $.jqplot('")(push chart-id)(push "', [data], options);
-plot.replot();
-var timer;
-
-// var win_width = $(window).width();
-// var win_height = $(window).height();
-// console.log( 'Window Width ' + win_width + ' Height ' + win_height);
-
-// var doc_width = document.body.clientWidth;
-// var doc_height = document.body.clientHeight;
-// console.log( 'Doc Width ' + doc_width + ' Height ' + doc_height);
-
-$(window).resize(function () {
-    clearTimeout(timer);
-    timer = setTimeout(function () {
-//        console.log( 'Resize Timer!' );
-        plot.replot();
-    }, 100);
-    });
-});\n")
-
-            (push "});\n</script>"))
-        (begin
-          (gnc:warn "Scatter chart has no non-zero data")
-            " "))
-    retval))
+  (let* ((chart (gnc:make-html-chart))
+         (mcolor (gnc:html-scatter-markercolor scatter))
+         (data  (gnc:html-scatter-data scatter)))
+    (cond
+     ((and (pair? data) (gnc:not-all-zeros data))
+      (gnc:html-chart-set-type! chart 'scatter)
+      (gnc:html-chart-set-width! chart (gnc:html-scatter-width scatter))
+      (gnc:html-chart-set-height! chart (gnc:html-scatter-height scatter))
+      (gnc:html-chart-set-data-labels! chart (make-list (length data) #f))
+      (gnc:html-chart-add-data-series! chart "scatter"
+                                       (map
+                                        (lambda (datum)
+                                          (list
+                                           (cons 'x (car datum))
+                                           (cons 'y (cadr datum))))
+                                        data)
+                                       (make-list (length data) mcolor)
+                                       'showLine #t
+                                       'fill #f
+                                       'borderColor mcolor)
+      (gnc:html-chart-set-title! chart (list
+                                        (gnc:html-scatter-title scatter)
+                                        (gnc:html-scatter-subtitle scatter)))
+      (gnc:html-chart-set! chart
+                           '(options elements point pointStyle)
+                           (case (gnc:html-scatter-marker scatter)
+                             ((filleddiamond diamond) "rectRot")
+                             ((filledcircle circle) "circle")
+                             ((filledsquare square) "rect")
+                             ((cross) "crossRot")
+                             ((plus) "cross")
+                             ((dash) "line")
+                             (else #f)))
+      (gnc:html-chart-set! chart '(options scales xAxes (0) type) "linear")
+      (gnc:html-chart-render chart doc))
+
+     (else
+      (gnc:warn "null-data, not rendering scatter")
+      ""))))



Summary of changes:
 gnucash/report/html-barchart.scm  | 385 ++++++++------------------------------
 gnucash/report/html-linechart.scm | 371 +++++++++---------------------------
 gnucash/report/html-piechart.scm  | 205 ++++++--------------
 gnucash/report/html-scatter.scm   | 202 ++++++++------------
 4 files changed, 302 insertions(+), 861 deletions(-)



More information about the gnucash-changes mailing list