Discussion should now rather take place on the ticket page. Please ask for 
a trac account (this may take some time).

I am not sure that this json is sent to jmol at all. We also have a 
jmol_repr method. But maybe it is used in some three.js interfaces or in 
sagemathcloud.

Now looking at other doctests.

Le mercredi 25 janvier 2017 11:38:20 UTC+1, mjs...@gmail.com a écrit :
>
> Thanks for taking care of this. I see that you fixed the doctests too. 
>
> However, doctests will also fail in the description of `json_repr` in file 
> `base.pyx`, in a few instances.
>
> More importantly, you absolutely should verify that you can send the 
> corrected json to jmol and have it work.
>
>
>
> El miércoles, 25 de enero de 2017, 11:14:56 (UTC+1), Frédéric Chapoton 
> escribió:
>>
>> 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