@@ -610,6 +610,38 @@ proto.slice = function (start, end, forceCopy) {
610
610
return new jBinary ( this . view . slice ( start , end , forceCopy ) , this . typeSet ) ;
611
611
} ;
612
612
613
+ jBinary . load = function ( source , typeSet , callback ) {
614
+ function withTypeSet ( typeSet ) {
615
+ jBinary . loadData ( source , function ( err , data ) {
616
+ err ? callback ( err ) : callback ( null , new jBinary ( data , typeSet ) ) ;
617
+ } ) ;
618
+ }
619
+
620
+ if ( arguments . length < 3 ) {
621
+ callback = typeSet ;
622
+ var srcInfo ;
623
+
624
+ if ( 'Blob' in global && source instanceof Blob ) {
625
+ srcInfo = { mimeType : source . type } ;
626
+ if ( source instanceof File ) {
627
+ srcInfo . fileName = source . name ;
628
+ }
629
+ } else
630
+ if ( typeof source === 'string' ) {
631
+ var dataParts = source . match ( / ^ d a t a : ( .+ ?) ( ; b a s e 6 4 ) ? , / ) ;
632
+ srcInfo = dataParts ? { mimeType : dataParts [ 1 ] } : { fileName : source } ;
633
+ }
634
+
635
+ if ( srcInfo ) {
636
+ repo . getAssociation ( srcInfo , withTypeSet ) ;
637
+ } else {
638
+ withTypeSet ( ) ;
639
+ }
640
+ } else {
641
+ typeof typeSet === 'string' ? repo ( typeSet , withTypeSet ) : withTypeSet ( typeSet ) ;
642
+ }
643
+ } ;
644
+
613
645
jBinary . loadData = function ( source , callback ) {
614
646
if ( 'Blob' in global && source instanceof Blob ) {
615
647
var reader = new FileReader ( ) ;
@@ -635,7 +667,7 @@ jBinary.loadData = function (source, callback) {
635
667
636
668
var dataParts = source . match ( / ^ d a t a : ( .+ ?) ( ; b a s e 6 4 ) ? , ( .* ) $ / ) ;
637
669
if ( dataParts ) {
638
- var isBase64 = dataParts [ 2 ] !== undefined ,
670
+ var isBase64 = dataParts [ 2 ] ,
639
671
content = dataParts [ 3 ] ;
640
672
641
673
try {
@@ -723,17 +755,20 @@ var getScript = (function () {
723
755
script . defer = true ;
724
756
725
757
if ( callback ) {
726
- if ( ! ( 'onload ' in script ) ) {
758
+ if ( 'onreadystatechange ' in script ) {
727
759
script . onreadystatechange = function ( ) {
728
- console . log ( this . src , ' ' , this . readyState ) ;
729
760
if ( this . readyState === 'loaded' || this . readyState === 'complete' ) {
730
761
this . onreadystatechange = null ;
731
- this . onload ( ) ;
762
+
763
+ // delay to wait until script is executed
764
+ setTimeout ( function ( ) { callback . call ( script ) } , 0 ) ;
732
765
}
733
766
} ;
734
- }
735
767
736
- script . onload = script . onerror = callback ;
768
+ script . onreadystatechange ( ) ;
769
+ } else {
770
+ script . onload = script . onerror = callback ;
771
+ }
737
772
}
738
773
739
774
head . appendChild ( script ) ;
@@ -807,14 +842,19 @@ repo.getAssociation = function (source, _callback) {
807
842
808
843
repo . getAssociations ( function ( assoc ) {
809
844
if ( source . fileName ) {
810
- var fileParts = source . fileName . toLowerCase ( ) . split ( '.' ) . slice ( 1 ) ;
811
- // trying everything from longest possible extension to shortest one
812
- for ( var i = 0 , length = fileParts . length ; i < length ; i ++ ) {
813
- var extension = fileParts . slice ( i ) . join ( '.' ) ,
814
- typeSetName = assoc . extensions [ extension ] ;
815
-
816
- if ( typeSetName ) {
817
- return callback ( typeSetName ) ;
845
+ // extracting only longest extension part
846
+ var longExtension = source . fileName . match ( / ^ ( .* \/ ) ? .* ?( \. | $ ) ( .* ) $ / ) [ 3 ] . toLowerCase ( ) ;
847
+
848
+ if ( longExtension ) {
849
+ var fileParts = longExtension . split ( '.' ) ;
850
+ // trying everything from longest possible extension to shortest one
851
+ for ( var i = 0 , length = fileParts . length ; i < length ; i ++ ) {
852
+ var extension = fileParts . slice ( i ) . join ( '.' ) ,
853
+ typeSetName = assoc . extensions [ extension ] ;
854
+
855
+ if ( typeSetName ) {
856
+ return callback ( typeSetName ) ;
857
+ }
818
858
}
819
859
}
820
860
}
0 commit comments