§
    „Øj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¦  «         dS dS )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               ód   — t          ¦   «         }||_        ||_        |                     | ¦  «        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       ú�/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/vexflow/toMusic21j.pyr   r      s0   € õZ ÑÔ€DØ€D„IØ€D„MØ�?Š?˜:Ñ&Ô&Ð&ó    c                  ó\   — 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dS )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>zêrequire(['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	| _        d S )
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   s;   € à4ØDØSð1ð MØ[ð
ð 
ˆŒð ˆŒ	ØˆŒˆˆr   Nc                óª   — |€| j         }|j        du r)t          j        ¦   «         }|                     |¦  «         n|}|                      ||¬¦  «        S )NF)r   )r   ÚisStreamr   ÚStreamÚappendÚ
fromStream)r    r   r   Ú	retStreams       r   r   zVexflowPickler.fromObjectz   sY   € Øˆ<Ø”9ˆDØÔ %Ð'Ð'Ýœ™œˆIØ×Ò˜ZÑ(Ô(Ð(Ð(à"ˆIØ�Š˜y¨tˆÑ4Ô4Ð4r   én   c                ó¾   — g }t          dt          |¦  «        |¦  «        D ](}|                     d||||z   …         z   dz   ¦  «         Œ)d                     |¦  «        S )Nr   ú'z + 
    )ÚrangeÚlenr%   Újoin)r    Ú
jsonStringÚ	chunkSizeÚallJSONListÚis        r   ÚsplitLongJSONzVexflowPickler.splitLongJSON„   sl   € ØˆÝ�q�#˜j™/œ/¨9Ñ5Ô5ð 	Hð 	HˆAØ×Ò˜s Z°°!°i±-°Ô%@Ñ@À3ÑFÑGÔGÐGÐGØ×Ò Ñ,Ô,Ð,r   c                óÌ   — |€| j         }| j        du r)| j                             |d         |d         ¬¦  «        }n(| 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>"
        NFr   r   )r   r   r   r   )r   r   ÚloadM21TemplateÚformat)r    ÚurlsÚloadM21formatteds      r   ÚgetLoadTemplatezVexflowPickler.getLoadTemplateŠ   sˆ   € ð ˆ<Ø”=ˆDØŒ=˜EÐ!Ð!Ø#Ô3×:Ò:À$ÀxÄ.ØFJÈ<ÔFXð  ;ñ  [ô  [ÐÐð  $Ô3×:Ò:À$À}ÔBUØFJÐK\ÔF]ð  ;ñ  `ô  `Ðð  Ðr   c                óz   — |€| 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>
        N)ÚjsBody)r   Ú	getJSBodyÚjsBodyScriptr5   )r    Ú	dataSplitr   r:   r<   s        r   ÚgetJSBodyScriptzVexflowPickler.getJSBodyScript£   sC   € ð  ÐØ”}ˆHØ—’ 	¨8Ñ4Ô4ˆØÔ(×/Ò/°vÐ/Ñ>Ô>ˆØÐr   c                ób   — |€| j         }n|}| 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();
                });
        Nr   )r   r   )r   r:   r5   )r    r=   r   Údr:   s        r   r;   zVexflowPickler.getJSBody¹   sB   € ð ÐØ”ˆAˆAàˆAØ”×#Ò#°Ø-.¨z¬]ð $ñ <ô <ˆàˆr   c                ó®   — |€| j         }n|}|                      |¦  «        }|                      ||¦  «        }| 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>
        N)Útitler4   r<   )r   r8   r>   ÚtemplateHtmlr5   )r    r=   rB   r   r@   ÚloadM21Formattedr<   Ú	formatteds           r   ÚgetHTMLzVexflowPickler.getHTMLÏ   sp   € ð< ÐØ”ˆAˆAàˆAØ×/Ò/°Ñ2Ô2ÐØ×+Ò+¨I°qÑ9Ô9ˆØÔ%×,Ò,°5Ø=MØ:Fð -ñ Hô Hˆ	ð Ðr   c                óÆ  — |€| j         }|j        �|j        j        dk    r|j        j        }nd}t          j        |¦  «        }|                     d¬¦  «        }|                      |¦  «        }|dk    r|S |dk    r|S |dk    r|                      |¦  «        S |dk    r|                      |¦  «        S |d	k    r|  	                    ||¦  «        S t          d
|›�¦  «        ‚)NÚ zMusic21 FragmentÚ
jsonpickle)Úfmtr
   Ú	jsonSplitr   r	   r   zCannot deal with mode: )r   ÚmetadatarB   r   ÚStreamFreezerÚwriteStrr2   r;   r>   rF   ÚVexflowToM21JException)r    Ú
thisStreamr   rB   ÚsfÚdatar=   s          r   r&   zVexflowPickler.fromStreamø   s   € Øˆ<Ø”9ˆDàÔÐ*¨zÔ/BÔ/HÈBÒ/NÐ/NØÔ'Ô-ˆEˆEà&ˆEÝÔ% jÑ1Ô1ˆð �{Š{˜|ˆ{Ñ,Ô,ˆØ×&Ò& tÑ,Ô,ˆ	Ø�6Š>ˆ>ØˆKØ�[Ò Ð ØÐØ�XÒÐØ—>’> )Ñ,Ô,Ð,Ø�^Ò#Ð#Ø×'Ò'¨	Ñ2Ô2Ð2Ø�VŠ^ˆ^Ø—<’< 	¨5Ñ1Ô1Ð1å(Ð)KÀ4Ð)KÐ)KÑLÔLÐLr   )N)r(   )NN)Ú__name__Ú
__module__Ú__qualname__rC   r<   r:   r4   r!   r   r2   r8   r>   r;   rF   r&   © r   r   r   r   Q   sÓ   € € € € € ð€Lð 7€Lð€Fð V€Oðð ð ð 5ð 5ð 5ð 5ð-ð -ð -ð -ð ð  ð  ð  ð2ð ð ð ð,ð ð ð ð,'ð 'ð 'ð 'ðRMð Mð Mð Mð Mð Mr   r   c                  ó   — e Zd ZdS )rO   N©rS   rT   rU   rV   r   r   rO   rO     ó   € € € € € Ø€Dr   rO   c                  ó   — e Zd ZdS )ÚTestNrX   rV   r   r   r[   r[     rY   r   r[   c                  ó   — e Zd Zd„ ZdS )ÚTestCuthbertc                ó°  — ddl m} ddl m} |                     ¦   «         }|                     d¦  «                             dd¦  «        }t          ¦   «         }d|j        d<   d	|j        d
<   |                     |¦  «        }| 	                    d¦  «        }t          |dd¬¦  «        5 }|                     |¦  «         ddd¦  «         dS # 1 swxY w Y   dS )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ÚvfprR   ÚfpÚfs	            r   ÚtestCuthbertLocalzTestCuthbert.testCuthbertLocal  s(  € ð 	#Ð"Ð"Ð"Ð"Ð"Ø'Ð'Ð'Ð'Ð'Ð'Ø"×.Ò.Ñ0Ô0ˆà�LŠL˜Ñ'Ô'×0Ò0°°BÑ7Ô7ˆõ ÑÔˆØ!RˆŒ�XÑØ%aˆŒ�\Ñ"Ø�~Š~˜aÑ Ô ˆØ×%Ò% gÑ.Ô.ˆÝ�"�c GÐ,Ñ,Ô,ð 	°Ø�GŠG�D‰MŒMˆMð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   Â(CÃCÃC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   rO   ÚTestCaser[   r]   rS   ÚmainTestrV   r   r   ú<module>rz      sŠ  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€à 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð Ð ð $*°ð 0'ð 0'ð 0'ð 0'ð 0'ðf@Mð @Mð @Mð @Mð @Mñ @Mô @Mð @MðF	ð 	ð 	ð 	ð 	Ð-ñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	ˆ8Ôñ 	ô 	ð 	ðð ð ð ð �8Ô$ñ ô ð ð. ˆzÒÐØ€N€N€NØ€GÔ�TÑÔÐÐÐð Ðr   