{"id":10428,"date":"2015-09-29T15:19:05","date_gmt":"2015-09-29T07:19:05","guid":{"rendered":"http:\/\/www.intmath.com\/blog\/?p=10428"},"modified":"2019-04-02T10:01:31","modified_gmt":"2019-04-02T02:01:31","slug":"svgphpgrapher-a-new-math-plotter","status":"publish","type":"post","link":"https:\/\/www.intmath.com\/blog\/computers\/svgphpgrapher-a-new-math-plotter-10428","title":{"rendered":"svgPHPGrapher - a new math plotter"},"content":{"rendered":"<p>Over the last few weeks I've been developing a new math plotter. It produces an svg image server-side using PHP. <\/p>\n<h2>The motivation<\/h2>\n<p>The graphs on IntMath were produced over a number of years using a range of different software, and were starting to look rather dated. Most of the curves were pixelated, and I'd used a motley range of clashing colors. <\/p>\n<p>For the last few years I've  been using <a href=\"http:\/\/jsxgraph.uni-bayreuth.de\/wp\/\">JSXGraph<\/a> to produce interactive graphs (see <a href=\"https:\/\/www.intmath.com\/help\/interactive-math-applications.php\">plenty of examples here<\/a>). JSXGraph gives nice SVG output and it's cross-browser. <\/p>\n<p>However, the problem with JSXGraph is  it involves a large footprint (167 kB of script, even after compression by gzip), which is a killer for mobile devices, especially if you just want to plot a simple graph on your Web page. Yes, the js file is cached by the browser, but a lot of first-time users will hit the back button rather than waiting for a large download. <\/p>\n<p>Another issue is there is already too much javascript on my pages (and on the Web generally). A typical IntMath page involves:<\/p>\n<ol>\n<li><strong> jQuery<\/strong> for a lot of interaction (92 kB compressed);<\/li>\n<li><strong>KaTeX<\/strong> (34 kB) or <strong>MathJax<\/strong> (160 kB) for displaying mathematics (I mostly use KaTeX these days);<\/li>\n<li><strong>Google ads<\/strong> pull in a whole lot more javascript (it varies on each page, but 400 kB is common).<\/li>\n<li><strong>Google Analytics  <\/strong>(for optimizing the site, about 18 kB) <\/li>\n<\/ol>\n<p>All that javascript means a <strong>lot to download<\/strong> (more than 50% of the total download for most pages) and puts a <strong>load on your device's processor<\/strong>, especially noticeable when viewed on mobile devices.  I try to have the minimum amount of javascript on the site (particularly the mobile version), to reduce page load times and processor overhead, but it's a challenge. <\/p>\n<p>Another issue is that most  of the graphs on IntMath <strong>don't need to be interactive<\/strong>. The purpose of many of the graphs is to illustrate a concept, or to show main features of a function. So there's no need for a large chunk of javascript, designed for interactivity, just to show a static graph. <\/p>\n<h2>The grapher brief<\/h2>\n<p>My aim was to produce a grapher  with the following characteristics:<\/p>\n<ul>\n<li>Small page load time<\/li>\n<li>Not javascript  based<\/li>\n<li>All the grunt work would be done on the server (not the client device) <\/li>\n<li>Produced good looking graphs<\/li>\n<li>Displays axis variables (How often did your math teach tell you to &quot;label your axes&quot;? Most graphing software does not include this feature.) <\/li>\n<li>Relatively easy to use<\/li>\n<\/ul>\n<p>Enter svgPHPGrapher... <\/p>\n<h2>svgPHPGrapher<\/h2>\n<p><em class=\"textem\">svgPHPGrapher<\/em> is based on Peter Jipsen's ASCIIsvg.js, which is a javascript-based SVG (scalable vector graphics) grapher. When he first published this script (around 2005), svg support in browsers was very rudimentary (IE didn't support it at all, of course), so it couldn't be reliably used. But now, all major browsers support svg, including those on mobile devices. <\/p>\n<p><em class=\"textem\">svgPHPGrapher<\/em> is a highly modificed PHP port of the ASCIIsvg javascript codebase. <\/p>\n<p>The idea is that some PHP code on your PHP page calls some functions, which create an svg-based image, and it's then printed out to the page. The processing &quot;work&quot; is done on the server, and immediately output. This creates a slightly larger HTML page, but there is no separate file to download, and no javascript involved.<\/p>\n<p>There is also the option to cache graphs, so if they take a lot of processing time. it needs to only happen once (by the first visitor) and subsequent visitors will see the cached svg image. <\/p>\n<h2>What is SVG?<\/h2>\n<p>SVG stands for &quot;scalable vector graphics&quot; and it's a method for producing crisp, good looking images at any resolution. Older image formats like GIF, PNG and JPEG are made up of a collection of colored pixels in fixed positions. When you zoom in on such images, you see  pixelated edges. But in the case of SVG images, the edges remain crisp. (This is desirable in this age of mobile devices with retina screens, and the requirement to produce scalable images for different screen sizes.)<\/p>\n<p>For example, here are screen shots from a zoomed-in SVG image (on the left), where you can see the fonts and curves are smooth and attractive, while the one on the right is a zoomed in PNG image of the same subject matter. You can see the shape edges are quite ugly, and the fonts are no better. <\/p>\n<p><img loading=\"lazy\" src=\"\/blog\/wp-content\/images\/2015\/09\/svg-zoom.png\" alt=\"SVG items - zoomed in\" width=\"202\" height=\"152\" \/> <img loading=\"lazy\" src=\"\/blog\/wp-content\/images\/2015\/09\/non-svg-zoom2.png\" alt=\"Non-SVG items - zoomed in\" width=\"202\" height=\"152\" \/><\/p>\n<p>SVG allows you to describe an image mathematically. For example, an ellipse is created using:<\/p>\n<p>  <code>&lt;ellipse stroke=&quot;#165a71&quot; stroke-width=&quot;3&quot; fill=&quot;#5a9fb5&quot; opacity=&quot;0.5&quot; cx = &quot;77.222&quot; cy = &quot;153&quot; rx = &quot;31&quot; ry = &quot;62&quot; &gt;&lt;\/ellipse&gt; <\/code><\/p>\n<p>The first part includes instructions for colors of edges and the inside  (fill), and the last parts describe the center of the ellipse and how far the ellipse extends in the <em>x<\/em>- and <em>y<\/em>- directions. <\/p>\n<p>By defining shapes in this way, the resulting file size is smaller than a PNG or GIF, and takes less download time.<\/p>\n<h2>Examples<\/h2>\n<p>Here are some example output graphs. They are real SVG images (not screen shots). You can zoom in on them to see the crisp edges I was talking about above.<\/p>\n<h3>Function Graphs<\/h3>\n<p>Here's a plot of the hyperbolic cosine function  <span class=\"intmath\"><em>y<\/em> =<em> <\/em>cosh (<em>x<\/em>) . <\/span> (A catenary is the shape traced out by a chain or a rope hanging from 2 fixed points.) <\/p>\n<div class=\"svgphpWrap\">\n<svg id=\"svgphp-0\" width=\"310\" height=\"250\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><\/p>\n<style type=\"text\/css\" >path.grids{shape-rendering:crispEdges} text.intmath{font-size:0.9em; stroke:none; fill:#555; font-family:KaTex_Main,'Times New Roman',Times,serif;shape-rendering:crispEdges} text.intmathItalic{stroke:none; fill:#333; font-weight:normal; font-family:KaTex_Math-italic,'Times New Roman',Times,serif}<\/style>\n<p><rect id=\"brdBG-svgphp-0\" stroke=\"none\" fill=\"#fff\" x=\"0\" y=\"0\" width=\"310\" height=\"250\" ><\/rect> <path stroke=\"#ccc\" stroke-width=\"1\" shape-rendering=\"crispEdges\" d = \" M155,0 155,250 M202,0 202,250 M248,0 248,250 M295,0 295,250 M108,0 108,250 M62,0 62,250 M15,0 15,250 M0,115 310,115 M0,15 310,15 M0,215 310,215\"><\/path> <path id=\"axes-svgphp-0\" stroke=\"#444\" stroke-width=\"1\" shape-rendering=\"crispEdges\" d = \" M155,0 155,250M0,215 310,215 M202,218 202,212 M248,218 248,212 M295,218 295,212 M155,218 155,212 M108,218 108,212 M62,218 62,212 M15,218 15,212 M158,195 152,195 M158,175 152,175 M158,155 152,155 M158,135 152,135 M158,115 152,115 M158,95 152,95 M158,75 152,75 M158,55 152,55 M158,35 152,35 M158,15 152,15 M158,235 152,235\"><\/path> <text x=\"202\" y=\"231\" class = \"intmath\" text-anchor=\"middle\">1<\/text> <text x=\"248\" y=\"231\" class = \"intmath\" text-anchor=\"middle\">2<\/text> <text x=\"295\" y=\"231\" class = \"intmath\" text-anchor=\"middle\">3<\/text> <text x=\"108\" y=\"231\" class = \"intmath\" text-anchor=\"middle\">-1<\/text> <text x=\"62\" y=\"231\" class = \"intmath\" text-anchor=\"middle\">-2<\/text> <text x=\"15\" y=\"231\" class = \"intmath\" text-anchor=\"middle\">-3<\/text> <text x=\"147\" y=\"200\" class = \"intmath\" text-anchor=\"end\">1<\/text> <text x=\"147\" y=\"180\" class = \"intmath\" text-anchor=\"end\">2<\/text> <text x=\"147\" y=\"160\" class = \"intmath\" text-anchor=\"end\">3<\/text> <text x=\"147\" y=\"140\" class = \"intmath\" text-anchor=\"end\">4<\/text> <text x=\"147\" y=\"120\" class = \"intmath\" text-anchor=\"end\">5<\/text> <text x=\"147\" y=\"100\" class = \"intmath\" text-anchor=\"end\">6<\/text> <text x=\"147\" y=\"80\" class = \"intmath\" text-anchor=\"end\">7<\/text> <text x=\"147\" y=\"60\" class = \"intmath\" text-anchor=\"end\">8<\/text> <text x=\"147\" y=\"40\" class = \"intmath\" text-anchor=\"end\">9<\/text> <text x=\"147\" y=\"20\" class = \"intmath\" text-anchor=\"end\">10<\/text> <text x=\"147\" y=\"240\" class = \"intmath\" text-anchor=\"end\">-1<\/text> <text x=\"308\" y=\"206\" class = \"intmathItalic\" text-anchor=\"end\">x<\/text> <text x=\"164\" y=\"11\" class = \"intmathItalic\" text-anchor=\"start\">y<\/text> <path stroke=\"#555\" stroke-width=\"1\" fill=\"#555\" transform = \"rotate(90 310 215)\" d = \"M 310 215 L 306 229 L 314 229 Z\"><\/path> <path stroke=\"#555\" stroke-width=\"1\" fill=\"#555\" transform = \"rotate(0 155 0)\" d = \"M 155 0 L 151 14 L 159 14 Z\"><\/path> <path stroke=\"#165a71\" stroke-width=\"1.5\" fill=\"none\" d = \"M7.8,-19.9 11.7,-1.1 15.6,16.1 19.5,31.9 23.4,46.5 27.2,59.9 31.1,72.2 35,83.5 38.9,93.9 42.8,103.4 46.7,112.2 50.6,120.3 54.5,127.7 58.4,134.5 62.3,140.7 66.2,146.4 70.1,151.7 74,156.5 77.8,160.8 81.7,164.9 85.6,168.5 89.5,171.9 93.4,174.9 97.3,177.7 101.2,180.2 105.1,182.4 109,184.5 112.9,186.3 116.8,187.9 120.7,189.3 124.6,190.6 128.5,191.7 132.3,192.6 136.2,193.4 140.1,194 144,194.4 147.9,194.8 151.8,195 155.7,195 159.6,194.9 163.5,194.7 167.4,194.3 171.3,193.8 175.2,193.1 179.1,192.3 182.9,191.3 186.8,190.2 190.7,188.8 194.6,187.3 198.5,185.7 202.4,183.8 206.3,181.6 210.2,179.3 214.1,176.7 218,173.8 221.9,170.7 225.8,167.2 229.7,163.5 233.5,159.3 237.4,154.8 241.3,149.8 245.2,144.4 249.1,138.5 253,132.1 256.9,125.1 260.8,117.5 264.7,109.1 268.6,100.1 272.5,90.2 276.4,79.5 280.3,67.9 284.2,55.2 288,41.4 291.9,26.4 295.8,10.1 299.7,-7.7 303.6,-27 \"><\/path> <\/svg>\n<\/div>\n<p> <!-- svgWrap --><\/p>\n<h3>Geometric Shapes<\/h3>\n<p>Here are some of the possible geometric shapes:<\/p>\n<div class=\"svgphpWrap\">\n<svg id=\"svgphp-1\" width=\"310\" height=\"230\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><\/p>\n<style type=\"text\/css\" >path.grids{shape-rendering:crispEdges} text.intmath{font-size:0.9em; stroke:none; fill:#555; font-family:MathJax_Main,'Times New Roman',Times,serif;shape-rendering:crispEdges} text.intmathItalic{stroke:none; fill:#333; font-weight:normal; font-family:MathJax_Math-italic,'Times New Roman',Times,serif}<\/style>\n<p><rect id=\"brdBG-svgphp-1\" stroke=\"none\" fill=\"#fff\" x=\"0\" y=\"0\" width=\"310\" height=\"230\" ><\/rect> <path id=\"axes-svgphp-1\" stroke=\"#444\" stroke-width=\"1\" shape-rendering=\"crispEdges\" d = \" M139,0 139,230M0,122 310,122 M202,126 202,118 M264,126 264,118 M139,126 139,118 M77,126 77,118 M15,126 15,118 M143,59 135,59.444444444444 M143,183.88888888889 135,184\"><\/path> <text x=\"202\" y=\"138\" class = \"intmath\" text-anchor=\"middle\">2<\/text> <text x=\"264\" y=\"138\" class = \"intmath\" text-anchor=\"middle\">4<\/text> <text x=\"77\" y=\"138\" class = \"intmath\" text-anchor=\"middle\">-2<\/text> <text x=\"15\" y=\"138\" class = \"intmath\" text-anchor=\"middle\">-4<\/text> <text x=\"131\" y=\"65\" class = \"intmath\" text-anchor=\"end\">2<\/text> <text x=\"131\" y=\"189\" class = \"intmath\" text-anchor=\"end\">-2<\/text> <text x=\"308\" y=\"113\" class = \"intmathItalic\" text-anchor=\"end\">x<\/text> <text x=\"148\" y=\"11\" class = \"intmathItalic\" text-anchor=\"start\">y<\/text> <path stroke=\"#555\" stroke-width=\"1\" fill=\"#555\" transform = \"rotate(90 310 122)\" d = \"M 310 122 L 306 136 L 314 136 Z\"><\/path> <path stroke=\"#555\" stroke-width=\"1\" fill=\"#555\" transform = \"rotate(0 139 0)\" d = \"M 139 0 L 135 14 L 143 14 Z\"><\/path> <rect stroke=\"#165a71\" stroke-width=\"3\" fill=\"#5a9fb5\" fill-opacity=\"0.1\" x=\"30.56\" y=\"28.33\" width=\"77.78\" height=\"31.11\" ><\/rect> <rect stroke=\"#165a71\" fill=\"#ff8\" stroke-width=\"1.5\" rx=\"8\" opacity=\"0.7\" x=\"170.56\" y=\"106.11\" width=\"77.78\" height=\"77.78\" ><\/rect><ellipse stroke=\"#165a71\" stroke-width=\"3\" fill=\"#5a9fb5\" opacity=\"0.5\" cx = \"77.222\" cy = \"153\" rx = \"31\" ry = \"62\" ><\/ellipse><ellipse stroke=\"#165a71\" stroke-width=\"3\" fill=\"#ff8\" opacity=\"0.5\" cx = \"232.778\" cy = \"59\" rx = \"31\" ry = \"31\" ><\/ellipse> <\/svg>\n<\/div>\n<p> <!-- svgWrap --><\/p>\n<h3>Parametric Curve <\/h3>\n<p>This is the curve  <span class=\"intmath\"><em>x<\/em> =<em> t  <\/em>cos (<em>t<\/em>)<\/span>, <span class=\"intmath\"><em>y<\/em> = <em>t<\/em> sin (<em>t<\/em>)<\/span> from <span class=\"intmath\">&minus;7&pi;\/2 &lt; <em>t<\/em> &lt; 7&pi;\/2<\/span>. <\/p>\n<div class=\"svgphpWrap\">\n<svg id=\"svgphp-24\" width=\"250\" height=\"240\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><\/p>\n<style type=\"text\/css\" >path.grids{shape-rendering:crispEdges} text.intmath{font-size:0.9em; stroke:none; fill:#555; font-family:MathJax_Main,'Times New Roman',Times,serif;shape-rendering:crispEdges} text.intmathItalic{stroke:none; fill:#333; font-weight:normal; font-family:MathJax_Math-italic,'Times New Roman',Times,serif}<\/style>\n<p><rect id=\"brdBG-svgphp-24\" stroke=\"none\" fill=\"#fff\" x=\"0\" y=\"0\" width=\"250\" height=\"240\" ><\/rect><path stroke=\"#165a71\" stroke-width=\"1.5\" fill=\"#5a9fb5\" fill-opacity=\"0.1\" d = \"M125,236 135.6,234.6 145.9,232.4 155.9,229.4 165.7,225.6 174.9,221 183.8,215.8 192.1,209.9 199.9,203.4 207,196.4 213.5,188.9 219.4,180.9 224.5,172.6 228.9,163.9 232.6,155 235.5,145.9 237.7,136.6 239.1,127.3 239.7,118 239.6,108.7 238.7,99.6 237.1,90.6 234.8,81.9 231.8,73.4 228.2,65.3 224,57.6 219.2,50.3 213.9,43.5 208.1,37.1 201.9,31.4 195.3,26.2 188.3,21.6 181.1,17.6 173.6,14.2 166,11.5 158.2,9.4 150.4,8 142.6,7.2 134.8,7.1 127.1,7.6 119.5,8.7 112.1,10.4 105,12.7 98.1,15.5 91.6,18.8 85.4,22.6 79.6,26.9 74.2,31.5 69.3,36.6 64.9,41.9 60.9,47.5 57.5,53.4 54.6,59.5 52.2,65.7 50.3,72 49,78.4 48.2,84.7 48,91.1 48.3,97.3 49,103.5 50.3,109.5 52,115.2 54.2,120.8 56.7,126.1 59.7,131.1 63,135.8 66.7,140.1 70.6,144.1 74.8,147.6 79.2,150.8 83.8,153.6 88.5,155.9 93.3,157.8 98.2,159.3 103.2,160.3 108.1,161 113,161.2 117.8,161 122.5,160.4 127.1,159.5 131.5,158.1 135.7,156.5 139.7,154.5 143.4,152.3 146.9,149.8 150.1,147.1 153,144.1 155.6,141 157.9,137.7 159.8,134.3 161.5,130.8 162.8,127.3 163.7,123.8 164.4,120.2 164.7,116.7 164.8,113.2 164.5,109.8 164,106.6 163.2,103.4 162.1,100.4 160.9,97.6 159.4,95 157.7,92.6 155.9,90.3 153.9,88.3 151.9,86.6 149.7,85.1 147.4,83.8 145.2,82.7 142.8,81.9 140.5,81.3 138.3,81 136,80.9 133.9,81 131.8,81.2 129.8,81.7 128,82.3 126.3,83.1 124.7,84.1 123.3,85.1 122.1,86.3 121,87.5 120.1,88.8 119.4,90.1 118.8,91.4 118.4,92.8 118.2,94.1 118.2,95.4 118.3,96.6 118.6,97.8 119,98.9 119.6,99.8 120.2,100.7 121,101.4 121.8,102 122.7,102.4 123.6,102.7 124.6,102.9 125.5,102.9 126.5,102.7 127.4,102.4 128.3,101.9 129.1,101.3 129.9,100.6 130.5,99.7 131,98.7 131.4,97.7 131.7,96.5 131.8,95.3 131.7,94 131.5,92.6 131.1,91.3 130.6,89.9 129.8,88.6 128.9,87.3 127.8,86.1 126.6,85 125.1,84 123.5,83 121.8,82.3 119.9,81.6 118,81.2 115.9,80.9 113.7,80.9 111.5,81 109.2,81.4 106.9,82 104.6,82.8 102.3,83.9 100.1,85.2 97.9,86.8 95.8,88.6 93.9,90.6 92.1,92.8 90.4,95.3 89,97.9 87.7,100.8 86.7,103.8 85.9,106.9 85.4,110.2 85.2,113.6 85.3,117.1 85.7,120.6 86.3,124.2 87.4,127.7 88.7,131.2 90.4,134.7 92.4,138.1 94.7,141.3 97.3,144.4 100.2,147.4 103.5,150.1 107,152.6 110.8,154.8 114.8,156.7 119,158.3 123.4,159.6 128,160.5 132.7,161 137.5,161.2 142.4,160.9 147.4,160.2 152.3,159.1 157.2,157.6 162,155.6 166.7,153.3 171.3,150.5 175.7,147.2 179.9,143.6 183.8,139.6 187.4,135.3 190.6,130.6 193.6,125.5 196.1,120.2 198.2,114.6 199.9,108.8 201.1,102.8 201.8,96.6 202,90.4 201.7,84 200.9,77.7 199.5,71.3 197.6,65 195.1,58.8 192.2,52.8 188.7,46.9 184.7,41.3 180.2,36 175.2,31 169.8,26.4 164,22.2 157.7,18.4 151.1,15.1 144.3,12.4 137.1,10.2 129.7,8.5 122.1,7.5 114.4,7.1 106.6,7.3 98.7,8.1 90.9,9.6 83.2,11.8 75.5,14.5 68.1,18 60.9,22 54,26.7 47.4,32 41.2,37.8 35.5,44.2 30.2,51.1 25.5,58.4 21.3,66.2 17.8,74.3 14.9,82.8 12.7,91.6 11.2,100.6 10.4,109.7 10.3,119 11.1,128.3 12.5,137.6 14.8,146.9 17.8,156 21.5,164.9 26,173.5 31.2,181.8 37.2,189.7 43.7,197.2 51,204.2 58.8,210.6 67.2,216.4 76.1,221.6 85.4,226 95.1,229.7 105.2,232.7 115.6,234.8 126.2,236.1 \"><\/path><\/svg>\n<\/div>\n<p> <!-- svgWrap --><\/p>\n<h2>Syntax, download and more examples  <\/h2>\n<p>You can try out <em class=\"textem\">svgPHPGrapher<\/em> yourself, if you like. You can find a <b>download<\/b> link, syntax for using the grapher, and many more examples on this page:<\/p>\n<p><a href=\"https:\/\/www.intmath.com\/cg5\/svgphpgrapher-syntax.php\">svgPHPGrapher syntax<\/a><\/p>\n<p>You'll just need a PHP-based server (on your local machine, <a href=\"http:\/\/www.easyphp.org\/\">EasyPHP<\/a> is recommended, or a real server) and a browser. Let me know how you go with it. I hope you find it useful.   <\/p>\n<p class=\"alt\">See the <a href=\"https:\/\/www.intmath.com\/blog\/computers\/svgphpgrapher-a-new-math-plotter-10428#comments\" id=\"comms\">2 Comments<\/a> below.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>  <a href=\"https:\/\/www.intmath.com\/blog\/computers\/svgphpgrapher-a-new-math-plotter-10428\"><img loading=\"lazy\" src=\"https:\/\/www.intmath.com\/blog\/wp-content\/images\/2015\/09\/svgPHPGrapher-example.png\" alt=\"svgPHPGrapher is a new PHP-bassed svg math grapher.\" title=\"\" width=\"128\" height=\"100\" class=\"imgRt\" \/><\/a><br \/>\n  <em class=\"textem\">svgPHPGrapher<\/em> produces clean math graphs with no javascript, and all the processing happens on the server.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mo_disable_npp":""},"categories":[1],"tags":[134,109,127],"_links":{"self":[{"href":"https:\/\/www.intmath.com\/blog\/wp-json\/wp\/v2\/posts\/10428"}],"collection":[{"href":"https:\/\/www.intmath.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.intmath.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.intmath.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.intmath.com\/blog\/wp-json\/wp\/v2\/comments?post=10428"}],"version-history":[{"count":5,"href":"https:\/\/www.intmath.com\/blog\/wp-json\/wp\/v2\/posts\/10428\/revisions"}],"predecessor-version":[{"id":11948,"href":"https:\/\/www.intmath.com\/blog\/wp-json\/wp\/v2\/posts\/10428\/revisions\/11948"}],"wp:attachment":[{"href":"https:\/\/www.intmath.com\/blog\/wp-json\/wp\/v2\/media?parent=10428"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.intmath.com\/blog\/wp-json\/wp\/v2\/categories?post=10428"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.intmath.com\/blog\/wp-json\/wp\/v2\/tags?post=10428"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}