1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
| import Foundation
extension String.Index {
func move(_ quantité: Int, of texte: String) -> String.Index {
let min_index = texte.startIndex
let max_index = texte.endIndex
var index = self
if max_index > min_index {
var quantité = quantité
if quantité > 0 {
if self < max_index {
index = texte.index(after: self)
for _ in 1..<quantité {
if index < max_index {
index = texte.index(after: index)
} else {
break
}
}
}
}
if quantité < 0 {
quantité = -quantité
if self > min_index {
index = texte.index(before: self)
for _ in 1..<quantité {
if index > min_index {
index = texte.index(before: index)
} else {
break
}
}
}
}
}
return index
}
}
extension String {
init(_ range: Range<String.Index>?,of texte: String) {
self.init()
if let range = range {
self = texte.substring(with: range)
} else {
self = ""
}
}
func offset(of texte: String) -> String.Index? {
if let offSet = self.localizedStandardRange(of: texte) {
// offset pour être compatible avec AppleScript il faut prendre l'index d'après.
// sinon : return offSet.lowerBound
return self.index(after: offSet.lowerBound)
} else {
return nil
}
}
}
/* AppleScript
set T_MediaId to "media id="
set T_Name to "name="
set La_Ligne to "AppleScript, <media id=@essai@ name= la suite du texte..."
if La_Ligne contains T_Name then set P_MediaId to text ((offset of T_MediaId in La_Ligne) + 10) thru ((offset of T_Name in La_Ligne) - 3) of La_Ligne
log "P_MediaId : " & P_MediaId
set A to (offset of T_MediaId in La_Ligne) + 10
set B to (offset of T_Name in La_Ligne) - 3
if La_Ligne contains T_Name then set P_MediaId to text A thru B of La_Ligne
log "P_MediaId : " & P_MediaId
Note : Attention offset of donne l'offset suivant et non le premier offset du texte trouvé
*/
// Traduction en swift
// set La_Ligne to "AppleScript, <media id=@essai@ name= la suite..."
var La_Ligne = "AppleScript, <media id=@essai@ name= la suite du texte..."
// set T_MediaId to "media id="
var T_MediaId = "<media id="
// set T_Name to "name="
var T_Name = "name="
// if La_Ligne contains "<media id=" then
if La_Ligne.contains(T_MediaId) && La_Ligne.contains(T_Name) {
// set P_MediaId to text ((offset of T_MediaId in La_Ligne) + 10) thru ((offset of T_Name in La_Ligne) - 3) of La_Ligne
var P_MediaId = String(La_Ligne.offset(of: T_MediaId)!.move(10, of: La_Ligne)..<La_Ligne.offset(of: T_Name)!.move(-3, of: La_Ligne),of: La_Ligne)
// log P_MediaId
print ("P_MediaId ~> \(P_MediaId)")
/* La même chose en décomposant le code AppleScript en plus lisible dans le corps du if
set A to ((offset of T_MediaId in La_Ligne) + 10)
set B to ((offset of T_Name in La_Ligne) - 3)
set P_MediaId to text A thru B of La_Ligne
log "P_MediaId : " & P_MediaId
*/
// set A to ((offset of T_MediaId in La_Ligne) + 10)
let A = La_Ligne.offset(of: T_MediaId)!.move(10, of: La_Ligne)
// set B to ((offset of T_Name in La_Ligne) - 3)
let B = La_Ligne.offset(of: T_Name)!.move(-3, of: La_Ligne)
// **************************************************************
// set P_MediaId to text A thru B of La_Ligne
P_MediaId = String(A..<B, of :La_Ligne)
// thru de l'AppleScript similaire à ..< du swift
// **************************************************************
// log "P_MediaId : " & P_MediaId -- > (*P_MediaId : essai*)
print ("P_MediaId ~> \(P_MediaId)")
}
// Réponse complémentaire
typealias Offset = String.CharacterView.Index
print()
print("Trouver l'offset de \"est\" dans la phrase \"le cheval est plan\"")
var offset: Offset?
offset = "le cheval est plan".offset(of: "est")
print("offset ~> \(offset!)")
print()
print("Fin du programme et sortie avec code: 0")
// Console :
/*
P_MediaId ~> essai
P_MediaId ~> essai
Trouver l'offset de "est" dans la phrase "le cheval est plan"
offset ~> Index(_base: Swift.String.UnicodeScalarView.Index(_position: 11), _countUTF16: 1)
Fin du programme et sortie avec code: 0
Program ended with exit code: 0
*/
// Merci pour m'avoir lu. |
Partager