I have created a ticket on trac 
(https://trac.sagemath.org/ticket/22253#ticket)

we do not use github and pulls, but trac tickets.

I am going to post a branch there soon.

Frederic

Le mercredi 25 janvier 2017 11:12:11 UTC+1, mjs...@gmail.com a écrit :
>
> Markdown below: 
>
> Bug report: Incorrect json representation for graphics.
>
>
> ## Extended description 
>
> The json representation for graphics (which I believe is intended for 
> Jmol), 
> is **not** correct json. To wit:
>
>     sage: G = cube((0,0,0),1)
>     sage: obj_list = 
> sage.plot.plot3d.base.flatten_list(G.flatten().json_repr(G.default_render_params()))
>     sage: j = obj_list[0]
>     sage: print j # json
>
>     
> {vertices:[{x:0.5,y:0.5,z:0.5},{x:-0.5,y:0.5,z:0.5},{x:-0.5,y:-0.5,z:0.5},{x:0.5,y:-0.5,z:0.5},{x:0.5,y:0.5,z:-0.5},{x:-0.5,y:0.5,z:-0.5},{x:0.5,y:-0.5,z:-0.5},{x:-0.5,y:-0.5,z:-0.5}],faces:[[0,1,2,3],[0,4,5,1],[0,3,6,4],[5,4,6,7],[6,3,2,7],[2,1,5,7]],color:'#6666ff'}
>
>     sage: import json
>     sage: json.loads(j) # Throws value error
>     
>     
> ## Sage Version: 
>
>     sage: version()    
>     'SageMath Version 7.1, Release Date: 2016-03-20'
>     
> ## Operating System:
>
>     macOS Sierra Version 10.12.2 
>     
> The bug is reproducible in other OSs, though.    
>
>
> ## Solution
>
> I've traced down the problem, but I don't know if I should submit a pull 
> request on Github 
> or what. Advice on what to do is welcome.
>
> The problem lies in the file `src/sage/plot/plot3d/index_face_set.pyx`, 
> where the json is generated. There are two problems with the generated json:
>
> 1. The quote signs used in the file are `'` and not `"` as per [Json spec](
> http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
> ).
> 2. Every dictionary key is unquoted, which is incorrect. Thus, a point 
>     
>         {x:0,y:0,z:0}
>         
>     should really be
>
>         {"x":0,"y":0,"z":0}
>         
>     as per Json spec.
>     
>
> In particular, the function `cdef inline format_json_vertex(point_c P):` 
> should read:
>
>     cdef inline format_json_vertex(point_c P):
>         cdef char ss[100]
>         cdef Py_ssize_t r = sprintf_3d(ss, '{"x":%g,"y":%g,"z":%g}', P.x, 
> P.y, P.z)
>         return PyString_FromStringAndSize(ss, r)
>
> and lines 871 through 882 should read:
>
>         if self.global_texture:
>             color_str = '"#{}"'.format(self.texture.hex_rgb())
>             return ['{"vertices":%s,"faces":%s,"color":%s}' %
>                     (vertices_str, faces_str, color_str)]
>         else:
>             color_str = "[{}]".format(",".join(['"{}"'.format(
>                     Color(self._faces[i].color.r,
>                           self._faces[i].color.g,
>                           self._faces[i].color.b).html_color())
>                                             for i from 0 <= i < 
> self.fcount]))
>             return ['{"vertices":%s,"faces":%s,"face_colors":%s}' %
>                     (vertices_str, faces_str, color_str)]
>
> This will affect doctest output, btw.
>
> ## Workaround for existing installations:
>
> The silver lining is that even though the Json is incorrect, since it is 
> very simple, it can be easly corrected inline: 
>
>     import re
>     def correct_json(s):
>         """
>         Correct the json returned by `Graphics3d.json_repr()`, which 
> contains the following
>         errors:
>         1. it uses ' instead of " for strings.
>         2. dictionary keys are not quoted.
>     
>         """
>         j = re.sub(r"{\s*(\w+)\s*:\s*", r'{"\1":', s)
>         j = re.sub(r",\s*(\w+)\s*:\s*", r',"\1":', j)
>         j = re.sub(r"'", r'"', j)
>         return j
>
> Note that this `correct_json` does **not** work for general json, just for 
> the particularly simple json produced by the graphics3d module.
>
>
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sage-devel+unsubscr...@googlegroups.com.
To post to this group, send email to sage-devel@googlegroups.com.
Visit this group at https://groups.google.com/group/sage-devel.
For more options, visit https://groups.google.com/d/optout.

Reply via email to