@@ -36,6 +36,7 @@ import { ElementType } from '../enums/element-type';
3636import { GenericShape } from '../shapes/generic' ;
3737import { XmlSlideHelper } from '../helper/xml-slide-helper' ;
3838import { OLEObject } from '../shapes/ole' ;
39+ import { Hyperlink } from '../shapes/hyperlink' ;
3940
4041export default class HasShapes {
4142 /**
@@ -420,6 +421,21 @@ export default class HasShapes {
420421 info . mode
421422 ] ( this . targetTemplate , this . targetNumber , this . targetType ) ;
422423 break ;
424+ case ElementType . Hyperlink :
425+ // For hyperlinks, we need to handle them differently
426+ if ( info . target ) {
427+ await new Hyperlink (
428+ info ,
429+ this . targetType ,
430+ this . sourceArchive ,
431+ info . target . isExternal ? 'external' : 'internal' ,
432+ info . target . file
433+ ) [ info . mode ] (
434+ this . targetTemplate ,
435+ this . targetNumber
436+ ) ;
437+ }
438+ break ;
423439 default :
424440 break ;
425441 }
@@ -787,7 +803,7 @@ export default class HasShapes {
787803 sourceArchive : this . sourceArchive ,
788804 sourceSlideNumber : this . sourceNumber ,
789805 } ,
790- this . targetType ,
806+ this . targetType
791807 ) . modifyOnAddedSlide ( this . targetTemplate , this . targetNumber ) ;
792808 }
793809
@@ -800,14 +816,11 @@ export default class HasShapes {
800816 sourceArchive : this . sourceArchive ,
801817 sourceSlideNumber : this . sourceNumber ,
802818 } ,
803- this . targetType ,
819+ this . targetType
804820 ) . modifyOnAddedSlide ( this . targetTemplate , this . targetNumber ) ;
805821 }
806822
807- const oleObjects = await OLEObject . getAllOnSlide (
808- this . sourceArchive ,
809- this . relsPath ,
810- ) ;
823+ const oleObjects = await OLEObject . getAllOnSlide ( this . sourceArchive , this . relsPath ) ;
811824 for ( const oleObject of oleObjects ) {
812825 await new OLEObject (
813826 {
@@ -817,9 +830,33 @@ export default class HasShapes {
817830 sourceSlideNumber : this . sourceNumber ,
818831 } ,
819832 this . targetType ,
820- this . sourceArchive ,
833+ this . sourceArchive
821834 ) . modifyOnAddedSlide ( this . targetTemplate , this . targetNumber , oleObjects ) ;
822835 }
836+
837+ // Copy hyperlinks
838+ const hyperlinks = await Hyperlink . getAllOnSlide ( this . sourceArchive , this . relsPath ) ;
839+ for ( const hyperlink of hyperlinks ) {
840+ // Create a new hyperlink with the correct target information
841+ const hyperlinkInstance = new Hyperlink (
842+ {
843+ mode : 'append' ,
844+ target : hyperlink ,
845+ sourceArchive : this . sourceArchive ,
846+ sourceSlideNumber : this . sourceNumber ,
847+ } ,
848+ this . targetType ,
849+ this . sourceArchive ,
850+ hyperlink . isExternal ? 'external' : 'internal' ,
851+ hyperlink . file
852+ ) ;
853+
854+ // Ensure the target property is properly set
855+ hyperlinkInstance . target = hyperlink ;
856+
857+ // Process the hyperlink
858+ await hyperlinkInstance . modifyOnAddedSlide ( this . targetTemplate , this . targetNumber , hyperlinks ) ;
859+ }
823860 }
824861
825862 /**
@@ -894,11 +931,53 @@ export default class HasShapes {
894931 } as AnalyzedElementType ;
895932 }
896933
934+ // Check for hyperlinks in text runs
935+ const hasHyperlink = this . findHyperlinkInElement ( sourceElement ) ;
936+ if ( hasHyperlink ) {
937+ try {
938+ const target = await XmlHelper . getTargetByRelId (
939+ sourceArchive ,
940+ relsPath ,
941+ sourceElement ,
942+ 'hyperlink' ,
943+ ) ;
944+
945+ return {
946+ type : ElementType . Hyperlink ,
947+ target : target ,
948+ element : sourceElement ,
949+ } as AnalyzedElementType ;
950+ } catch ( error ) {
951+ console . warn ( 'Error finding hyperlink target:' , error ) ;
952+ }
953+ }
954+
897955 return {
898956 type : ElementType . Shape ,
899957 } as AnalyzedElementType ;
900958 }
901959
960+ // Helper method to find hyperlinks in an element
961+ private findHyperlinkInElement ( element : XmlElement ) : boolean {
962+ // Check for direct hyperlinks
963+ const directHyperlinks = element . getElementsByTagName ( 'a:hlinkClick' ) ;
964+ if ( directHyperlinks . length > 0 ) {
965+ return true ;
966+ }
967+
968+ // Check for hyperlinks in text runs
969+ const textRuns = element . getElementsByTagName ( 'a:r' ) ;
970+ for ( let i = 0 ; i < textRuns . length ; i ++ ) {
971+ const run = textRuns [ i ] ;
972+ const rPr = run . getElementsByTagName ( 'a:rPr' ) [ 0 ] ;
973+ if ( rPr && rPr . getElementsByTagName ( 'a:hlinkClick' ) . length > 0 ) {
974+ return true ;
975+ }
976+ }
977+
978+ return false ;
979+ }
980+
902981 /**
903982 * Applys modifications
904983 * @internal
0 commit comments