WebView XML et feuille de style CSS
Arachante
Membre
Bonjour à tous.
En quelques mots, voilà mon objectif :
Afficher une WebView contenant des données XML associées à une feuille de style CSS. Cela fonctionne très bien si les données XML sont fournies par un fichier .xml.
Ce que je désire c'est de générer le contenu XML de la vue sans passer par l'écriture puis la lecture d'un fichier externe. Cela semble aussi bien fonctionner, mais je n'arrive pas activer la feuille de style, le texte s'affiche brut, sans les balises XML mais aussi sans style. à‰videmment j'utilise la même chaine de caractère dans les deux cas, en direct ou via le fichier. Où est ma bêtise ? Comment associer le fichier .css à une WebView ? Mon appli est écrite en AppleScript-Obj-C mais le problème doit être identique en Objective-C ...
_______ Le code (extrait)_______________________________
on applicationWillFinishLaunching_(aNotification)
-- Definir l'acces à ma feuille de style .CSS
set CSSURL to current application's NSBundle's mainBundle()'s URLForResource_withExtension_("one", "css")
set ChaineURLCSS to CSSURL's absoluteString()
log "acces ressources de style :"
log ChaineURLCSS
-- Générer des données XML
set fluxXML to ""
my ajouterFlux (fluxXML, "?xml-stylesheet href=\"" & "one.css" & "\" type=\"text/css\"?")
my ajouterFlux (fluxXML, "racine")
my ajouterFlux (fluxXML, "vue")
my ajouterTagFlux (fluxXML, tager("titre" , "Loà¯c"))
my ajouterTagFlux (fluxXML, tager("legende" , "garçon"))
my ajouterTagFlux (fluxXML, tager("date" , "20/03/2012"))
my ajouterTagFlux (fluxXML, tager("description", "Le petit qui me dépasse d'une tête."))
my ajouterFlux (fluxXML, "/vue")
my ajouterFlux (fluxXML, "/racine")
tell current application's NSString to set ChaineXML to stringWithString_(fluxXML)
-- | Méthode 1 (pas géniale, oblige de passer par un fichier temporaire)
-- | Ecrire un fichier .XML avec ces données
tell ChaineXML to writeToFile_atomically_encoding_error_("/tmp/truc.xml", true, current application's NSUTF8StringEncoding, missing value) -- ou NSMacOSRomanStringEncoding
log "•"
URLForResource_withExtension_("legende", "xml")
-- | Definir l'acces à la feuille de style, stockée en tant que ressource du Bundle
log "acces ressources :"
set accesRessources to current application's NSBundle's mainBundle's resourcePath
log accesRessources
log "acces bundle :"
set accesBundle to current application's NSBundle's mainBundle's bundlePath
log accesBundle
log return
log class of (ArachVueWeb's mainFrame) --> WebFrame
set URLRessources to current application's NSURL's URLWithString_(accesRessources)
log URLRessources
log "•"
-- | Methode 2 (celle que je desire retenir)
-- | Utiliser la même chaine de caractere que pour la 1ere methode afin de charger la mainFrame de ma WebVieu
tell ArachVueWeb's mainFrame to loadHTMLString_baseURL_(ChaineXML, URLRessources ) -- ou missing value) ?
log "•"
tell ArachVueWeb
setDrawsBackground_(false)
log "document mainFrame :"
log mainFrameDocument() --'s outerHTML
-- -- -- setMainFrameURL_( URLlegendeXML's absoluteString() )
log "¨¨¨"
-- -- -- log mainFrame's DOMDocument()
end tell
log "DOM document de la mainFrame :"
log ArachVueWeb's mainFrame --> WebFrame
tell ArachVueWeb's mainFrame
log DOMDocument()'s outerHTML
log dataSource()'s |data| --> WebDataSource
end tell
end applicationWillFinishLaunching_
En quelques mots, voilà mon objectif :
Afficher une WebView contenant des données XML associées à une feuille de style CSS. Cela fonctionne très bien si les données XML sont fournies par un fichier .xml.
Ce que je désire c'est de générer le contenu XML de la vue sans passer par l'écriture puis la lecture d'un fichier externe. Cela semble aussi bien fonctionner, mais je n'arrive pas activer la feuille de style, le texte s'affiche brut, sans les balises XML mais aussi sans style. à‰videmment j'utilise la même chaine de caractère dans les deux cas, en direct ou via le fichier. Où est ma bêtise ? Comment associer le fichier .css à une WebView ? Mon appli est écrite en AppleScript-Obj-C mais le problème doit être identique en Objective-C ...
_______ Le code (extrait)_______________________________
on applicationWillFinishLaunching_(aNotification)
-- Definir l'acces à ma feuille de style .CSS
set CSSURL to current application's NSBundle's mainBundle()'s URLForResource_withExtension_("one", "css")
set ChaineURLCSS to CSSURL's absoluteString()
log "acces ressources de style :"
log ChaineURLCSS
-- Générer des données XML
set fluxXML to ""
my ajouterFlux (fluxXML, "?xml-stylesheet href=\"" & "one.css" & "\" type=\"text/css\"?")
my ajouterFlux (fluxXML, "racine")
my ajouterFlux (fluxXML, "vue")
my ajouterTagFlux (fluxXML, tager("titre" , "Loà¯c"))
my ajouterTagFlux (fluxXML, tager("legende" , "garçon"))
my ajouterTagFlux (fluxXML, tager("date" , "20/03/2012"))
my ajouterTagFlux (fluxXML, tager("description", "Le petit qui me dépasse d'une tête."))
my ajouterFlux (fluxXML, "/vue")
my ajouterFlux (fluxXML, "/racine")
tell current application's NSString to set ChaineXML to stringWithString_(fluxXML)
-- | Méthode 1 (pas géniale, oblige de passer par un fichier temporaire)
-- | Ecrire un fichier .XML avec ces données
tell ChaineXML to writeToFile_atomically_encoding_error_("/tmp/truc.xml", true, current application's NSUTF8StringEncoding, missing value) -- ou NSMacOSRomanStringEncoding
log "•"
URLForResource_withExtension_("legende", "xml")
-- | Definir l'acces à la feuille de style, stockée en tant que ressource du Bundle
log "acces ressources :"
set accesRessources to current application's NSBundle's mainBundle's resourcePath
log accesRessources
log "acces bundle :"
set accesBundle to current application's NSBundle's mainBundle's bundlePath
log accesBundle
log return
log class of (ArachVueWeb's mainFrame) --> WebFrame
set URLRessources to current application's NSURL's URLWithString_(accesRessources)
log URLRessources
log "•"
-- | Methode 2 (celle que je desire retenir)
-- | Utiliser la même chaine de caractere que pour la 1ere methode afin de charger la mainFrame de ma WebVieu
tell ArachVueWeb's mainFrame to loadHTMLString_baseURL_(ChaineXML, URLRessources ) -- ou missing value) ?
log "•"
tell ArachVueWeb
setDrawsBackground_(false)
log "document mainFrame :"
log mainFrameDocument() --'s outerHTML
-- -- -- setMainFrameURL_( URLlegendeXML's absoluteString() )
log "¨¨¨"
-- -- -- log mainFrame's DOMDocument()
end tell
log "DOM document de la mainFrame :"
log ArachVueWeb's mainFrame --> WebFrame
tell ArachVueWeb's mainFrame
log DOMDocument()'s outerHTML
log dataSource()'s |data| --> WebDataSource
end tell
end applicationWillFinishLaunching_
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Mais la question nest pas liée au langage, c'est bien de l'utilisation des classes Cocoa dont il est question ici ...
my ajouterFlux (fluxXML, "?xml-stylesheet href=\"" & "one.css" & "\" type=\"text/css\"?")
Mais tu ne semble pas y utiliser ChaineURLCSS
Après la syntaxe de l'AppleScript je suis pas super familier. Même si c'est le même framework derrière, c'est pas la même chose à lire.
[font=arial,helvetica,sans-serif]Le fichier c'est "[font=courier new,courier,monospace]one.css[/font]" son path est donné par la variable "[font=courier new,courier,monospace]URLRessources[/font]" en fait c'est le répertoire "[font=courier new,courier,monospace]Ressources[/font]" à l'intérieur du Bundle.[/font]
[font=arial,helvetica,sans-serif]C'est le deuxième argument de la méthode "[font=courier new,courier,monospace]loadHTMLString_baseURL_[/font]" ([font=courier new,courier,monospace]loadHTMLString:baseURL: [/font]en Objective-C) qui est ‘[font=georgia,serif]used to resolve relative URLs within the document.[/font]' d'apres la documentation Apple.[/font]
[font=arial,helvetica,sans-serif]De plus, la connexion avec la feuille de style ne semble fonctionner qu'avec des données HTML et non XML, après tout la méthode s'appelle : "[font=courier new,courier,monospace]loadHTMLString_baseURL_[/font]"[/font]
[font=arial,helvetica,sans-serif]Au final l'extrait suivant fonctionne ...[/font]
-- Generer des données HTML
set fluxHTML to "<!DOCTYPE html>
<html><head><link rel='stylesheet' href='style.css' /></head>
<body>
<div class='vue'>
<span class='titre'>Loà¯c</span>
<span class='legende'>garçon</span>
</div>
<script>document.write(document.location.pathname)</script>
</body>
</html>"
log fluxHTML ----
-- Generer les données XML
set fluxXML to "<?xml verion=\"1.0\" encoding=\"utf-8\" ?>
<?xml-stylesheet href=\"style.css\" type=\"text/css\"?>
<racine>
<vue>
<titre>Loà¯c</titre>
<legende>garçon</legende>
</vue>
</racine>"
log fluxXML ----
tell current application's NSString to set ChaineXML to stringWithString_(fluxXML)
tell current application's NSString to set ChaineHTML to stringWithString_(fluxHTML)
-- | Methode 1 (pas géniale, mais ca marche, oblige de passer par un fichier temporaire)
-- | Ecrire un fichier .XML avec ces données
tell ChaineXML to writeToFile_atomically_encoding_error_("/tmp/truc.xml", true, current application's NSUTF8StringEncoding, missing value) -- ou NSMacOSRomanStringEncoding
-- -- -- set URLlegendeXML to current application's NSBundle's mainBundle()'s URLForResource_withExtension_("legende", "xml")
-- | Definir l'acces à la feuille de style, stockée en tant que ressource du Bundle
log "acces ressources :"
set accesRessources to current application's NSBundle's mainBundle's resourcePath
log accesRessources
-- | CORRECTIONS, (Un Bug ??) : doubler les '/' remplacer les 'blancs' par '%20'
set accesRessources to accesRessources's stringByReplacingOccurrencesOfString_withString_("/" , "//")
set accesRessources to accesRessources's stringByReplacingOccurrencesOfString_withString_(" " , "%20")
log "accesRessources corrigé :"
log accesRessources
set URLRessources to current application's NSURL's URLWithString_( current application's NSString's stringWithFormat_("file:/%@/",accesRessources) )
log "URL d'acces aux ressources :"
log URLRessources
-- | Methode 2 (celle que je desire retenir)
-- | Utiliser la même chaine de caracteres que pour la 1ere methode afin de charger directement en interne la mainFrame de ma WebView
-- | Ne semble fonctionner qu'avec des données HTML (pas XML ...)
tell ArachVueWeb's mainFrame to loadHTMLString_baseURL_(ChaineHTML, URLRessources ) -- missing value --> /