WebView XML et feuille de style CSS

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_
Mots clés:

Réponses

  • yoannyoann Membre
    Ah ouais, en AppleScript ? Même pas peur ?
  • Ben OUI ... Je commence à  avoir (un peu) peur. image/huh.gif' class='bbc_emoticon' alt='???' />

    Mais la question nest pas liée au langage, c'est bien de l'utilisation des classes Cocoa dont il est question ici ...
  • yoannyoann Membre
    Je ne vois pas à  quel moment tu donne le path réel de ton CSS à  ton fichier. Tu as



    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.
  • Si je comprends bien ... mais justement il doit y avoir un truc qui m'échappe.



    [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]En fouillant plus a fond sur le Web, j'ai pu lire qu'il fallait dans la chaine de caractères représentant l'URL, doubler les[font=courier new,courier,monospace] ‘/' [/font]et remplacer les blancs par [font=courier new,courier,monospace]‘%20'[/font].[/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 --> /
Connectez-vous ou Inscrivez-vous pour répondre.