
    3j0                       d Z ddlmZ ddlZddlmZ ddlmZ ddlmZ g dZ	dd	d
dZ
 G d d      Z G d de      Z G d dej                        Z G d dej                        Zedk(  rddlZ ej"                  e       yy)zT
Convert a music21 object into JSON and send it to the browser for music21j to use.
    )annotationsN)Music21Exception)
freezeThaw)stream)htmljsbodyjsbodyScriptjsonr   F)modelocalc               T    t               }||_        ||_        |j                  |       S )a  
    returns a string of data for a given Music21Object such as a Score, Note, etc. that
    can be displayed in a browser using the music21j package.  Called by .show('vexflow').

    >>> n = note.Note('C#4')
    >>> #_DOCS_SHOW print(vexflow.toMusic21j.fromObject(n))
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
        <!-- for MSIE 10 on Windows 8 -->
        <meta http-equiv="X-UA-Compatible" content="requiresActiveX=true"/>
        <title>Music21 Fragment</title>
        <script data-main='https://www.music21.org/music21j/src/music21'
                src='https://www.music21.org/music21j/ext/require/require.js'></script>
        <script>
            require(['music21'], function() {
                var pickleIn = '{"m21Version": {"py/tuple": [1, 9, 2]}, "stream":
    {"_mutable": true, "_activeSite": null, "' +
    '_priority": 0, "_elements": [], "_cache": {}, "definesExplicitPageBreaks":
    false, "_unlinkedDuration": null, "' +
    'id": ..., "_duration": null, "py/object": "music21.stream.Stream",
    "streamStatus": {"py/object": "music' +
    '21.stream.streamStatus.StreamStatus", "_enharmonics": null,
    "_dirty": null, "_concertPitch": null, "_accidentals"' +
    ': null, "_ties": null, "_rests": null, "_ornaments": null,
    "_client": null, "_beams": null, "_measures": nu' +
    ...
    'd": null}, "definesExplicitSystemBreaks": false, ...}}';
                var jpc = new music21.fromPython.Converter();
                streamObj = jpc.run(pickleIn);
                streamObj.renderOptions.events.resize = "reflow";
                streamObj.appendNewCanvas();
            });
        </script>
    <BLANKLINE>
    </head>
    <body>
    </body>
    </html>

    * Changed in v8: mode and useLocal are keyword only.
    )VexflowPicklerr   useLocal
fromObject)
thisObjectr   r   convs       G/DATA/.local/lib/python3.12/site-packages/music21/vexflow/toMusic21j.pyr   r      s*    Z DDIDM??:&&    c                  Z    e Zd ZdZdZdZdZd ZddZddZ	dd	Z
dd
ZddZddZddZy)r   a  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
        <!-- for MSIE 10 on Windows 8 -->
        <meta http-equiv="X-UA-Compatible" content="requiresActiveX=true"/>
        <title>{title}</title>
        {loadM21Template}
        {jsBodyScript}
    </head>
    <body>
    </body>
    </html>
    z<script>
{jsBody}
</script>zrequire(['music21'], function() {{
                var pickleIn = {pickleOutput};
                var jpc = new music21.fromPython.Converter();
                streamObj = jpc.run(pickleIn);
                {callback}
            }});z9<script data-main='{m21URI}' src='{requireURI}'></script>c                <    ddddddd| _         d| _        d	| _        y )
Nz{"py/object": "hello"}z,https://www.music21.org/music21j/src/music21z7https://www.music21.org/music21j/ext/require/require.jszPstreamObj.renderOptions.events.resize = "reflow";
		streamObj.appendNewCanvas();/file:///Users/Cuthbert/git/music21j/src/music21:file:///Users/Cuthbert/git/music21j/ext/require/require.js)pickleOutputm21URI
requireURIcallbackm21URIlocalrequireURIlocalr   F)defaultsr   r   )selfs    r   __init__zVexflowPickler.__init__j   s2    4DS1 M[
 	r   Nc                    || j                   }|j                  du r&t        j                         }|j	                  |       n|}| j                  ||      S )NF)r   )r   isStreamr   Streamappend
fromStream)r    r   r   	retStreams       r   r   zVexflowPickler.fromObjectz   sO    <99D%'IZ("Iyt44r   c                    g }t        dt        |      |      D ]  }|j                  d||||z    z   dz          ! dj                  |      S )Nr   'z + 
    )rangelenr%   join)r    
jsonString	chunkSizeallJSONListis        r   splitLongJSONzVexflowPickler.splitLongJSON   sR    q#j/95AsZ!i-%@@3FG 6,,r   c                    || j                   }| j                  du r%| j                  j                  |d   |d         }|S | j                  j                  |d   |d         }|S )a,  
        Gets the <script> tag for loading music21 from require.js

        >>> vfp = vexflow.toMusic21j.VexflowPickler()
        >>> vfp.getLoadTemplate()
        "<script data-main='https://www.music21.org/music21j/src/music21'
            src='https://www.music21.org/music21j/ext/require/require.js'></script>"

        >>> d = {'m21URI': 'file:///tmp/music21', 'requireURI': 'http://requirejs.com/require.js'}
        >>> vfp.getLoadTemplate(d)
        "<script data-main='file:///tmp/music21' src='http://requirejs.com/require.js'></script>"
        Fr   r   )r   r   r   r   )r   r   loadM21Templateformat)r    urlsloadM21formatteds      r   getLoadTemplatezVexflowPickler.getLoadTemplate   s     <==D==E!#33::$x.FJ<FX  ;  [    $33::$}BUFJK\F]  ;  `  r   c                ~    || j                   }| j                  ||      }| j                  j                  |      }|S )aB  
        Get the <script>...</script> tag to render the JSON

        >>> vfp = vexflow.toMusic21j.VexflowPickler()
        >>> print(vfp.getJSBodyScript('{"hi": "hello"}'))
           <script>
                require(['music21'], function() {
                    var pickleIn = {"hi": "hello"};
                    var jpc = new music21.fromPython.Converter();
                    streamObj = jpc.run(pickleIn);
                    streamObj.renderOptions.events.resize = "reflow";
                streamObj.appendNewCanvas();
                });
            </script>
        )jsBody)r   	getJSBodyjsBodyScriptr4   )r    	dataSplitr   r9   r;   s        r   getJSBodyScriptzVexflowPickler.getJSBodyScript   sB      }}H	84((//v/>r   c                h    || j                   }n|}| j                  j                  ||d         }|S )a#  
        Get the javascript code without the <script> tags to render the JSON

        >>> vfp = vexflow.toMusic21j.VexflowPickler()
        >>> print(vfp.getJSBody('{"hi": "hello"}'))
                require(['music21'], function() {
                    var pickleIn = {"hi": "hello"};
                    var jpc = new music21.fromPython.Converter();
                    streamObj = jpc.run(pickleIn);
                    streamObj.renderOptions.events.resize = "reflow";
                streamObj.appendNewCanvas();
                });
        r   )r   r   )r   r9   r4   )r    r<   r   dr9   s        r   r:   zVexflowPickler.getJSBody   s?     AA##-.z] $ <r   c                    || j                   }n|}| j                  |      }| j                  ||      }| j                  j	                  |||      }|S )aH  
        Get the complete HTML page to pass to the browser:

        >>> vfp = vexflow.toMusic21j.VexflowPickler()
        >>> print(vfp.getHTML('{"hi": "hello"}', 'myPiece'))
           <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
                    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
                <html xmlns="http://www.w3.org/1999/xhtml">
                <head>
            <meta http-equiv="content-type" content="text/html; charset=utf-8" />
            <!-- for MSIE 10 on Windows 8 -->
            <meta http-equiv="X-UA-Compatible" content="requiresActiveX=true"/>
            <title>myPiece</title>
            <script data-main='https://www.music21.org/music21j/src/music21'
                    src='https://www.music21.org/music21j/ext/require/require.js'></script>
            <script>
            require(['music21'], function() {
                            var pickleIn = {"hi": "hello"};
                            var jpc = new music21.fromPython.Converter();
                            streamObj = jpc.run(pickleIn);
                            streamObj.renderOptions.events.resize = "reflow";
                        streamObj.appendNewCanvas();
                        });
            </script>
            </head>
            <body>
            </body>
            </html>
        )titler3   r;   )r   r7   r=   templateHtmlr4   )r    r<   rA   r   r?   loadM21Formattedr;   	formatteds           r   getHTMLzVexflowPickler.getHTML   sg    < AA//2++Iq9%%,,5=M:F - H	 r   c                   || j                   }|j                  0|j                  j                  dk7  r|j                  j                  }nd}t        j                  |      }|j                  d      }| j                  |      }|dk(  r|S |dk(  r|S |dk(  r| j                  |      S |dk(  r| j                  |      S |d	k(  r| j                  ||      S t        d
|      )N zMusic21 Fragment
jsonpickle)fmtr
   	jsonSplitr   r	   r   zCannot deal with mode: )r   metadatarA   r   StreamFreezerwriteStrr1   r:   r=   rE   VexflowToM21JException)r    
thisStreamr   rA   sfdatar<   s          r   r&   zVexflowPickler.fromStream   s    <99D*z/B/B/H/HB/N''--E&E%%j1 {{|{,&&t,	6>K[ X>>),,^#''	22V^<<	511(+B4()KLLr   )N)n   )NN)__name__
__module____qualname__rB   r;   r9   r3   r!   r   r1   r7   r=   r:   rE   r&    r   r   r   r   Q   sI    L 7LF VO 5- 2,,'RMr   r   c                      e Zd Zy)rN   NrS   rT   rU   rV   r   r   rN   rN         r   rN   c                      e Zd Zy)TestNrX   rV   r   r   r[   r[     rY   r   r[   c                      e Zd Zd Zy)TestCuthbertc                z   ddl m} ddl m} |j                         }|j	                  d      j                  dd      }t               }d|j                  d<   d	|j                  d
<   |j                  |      }|j                  d      }t        |dd      5 }|j                  |       ddd       y# 1 sw Y   yxY w)z3
        test a local version of this mess
        r   )corpus)environmentzluca/gloria      r   r   r   r   z.htmlwzutf-8)encodingN)music21r_   r`   Environmentparsemeasuresr   r   r   getTempFileopenwrite)	r    r_   r`   environLocalsvfprQ   fpfs	            r   testCuthbertLocalzTestCuthbert.testCuthbertLocal  s     	#'"..0LL'00B7 !RX%a\"~~a %%g."cG,GGDM -,,s   B11B:N)rS   rT   rU   rq   rV   r   r   r]   r]     s    r   r]   __main__)__doc__
__future__r   unittestmusic21.exceptions21r   re   r   r   supportedDisplayModesr   r   rN   TestCaser[   r]   rS   mainTestrV   r   r   <module>rz      s    #  1    $* 0'f@M @MF	- 		8 	8$$ . zGT r   