Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#26 Le 21/11/2016, à 00:45

Arbiel

Re : Enregistrement en local d'une intervention

Bonsoir

erresse a écrit :

je l'ai copié dans les lancements rapides du tableau de bord

Comment fait-on ?
Pour ma part, j'ai ajouté l'appel de ton script dans le lanceur firefox.

J'ai bien retrouvé le message dans le répertoire créé.

Arbiel

Dernière modification par Arbiel (Le 21/11/2016, à 00:53)


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#27 Le 21/11/2016, à 13:17

erresse

Re : Enregistrement en local d'une intervention

Salut Arbiel,

J'ai d'abord créé un lanceur sur le bureau (dans mon environnement "Ubuntu-Mate", j'ai un vrai bureau sur lequel on peut poser des choses), puis je l'ai copié dans la barre d'outils du tableau de bord par un simple cliquer / déplacer à la souris...

Je ne sais pas comment on fait avec Unity, par exemple, ni pour créer un lanceur sur le bureau, ni pour copier ce lanceur dans le dash, je n'ai jamais expérimenté cette interface.

Je vois que tu as une autre approche en incluant l'appel du script "dans le lanceur firefox".
Ma foi, le tout est de pouvoir lancer le script lorsque le navigateur occupe tout l'écran sans devoir le minimiser, donc avec une icône qui demeure toujours visible.

Il semble que celui-ci a fonctionné correctement, en créant un fichier pour le message et un fichier index permettant de retrouver ce message ultérieurement. Merci de ton retour. smile
Pour ma part, je vais continuer à suivre cette conversation et l'évolution de ton projet, beaucoup plus ambitieux et généraliste...


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#28 Le 21/11/2016, à 16:08

Arbiel

Re : Enregistrement en local d'une intervention

Bonjour

Je pense changer mon fusil d'épaule. J'ai de trop grandes difficultés pour créer comme je l'envisageais initialement un fichier disponible en local.

J'ai rencontré deux problèmes majeurs :
- feuilles de style : la section "head" d'une page du forum est compatible xml (elle est bien formée), ce qui me permet de la traiter par un parser xml. Comme, par ailleurs, je ne sais pas si cette section est identique pour toutes les pages, j'ai envisagé de l'introduire dans le fichier créé et de télécharger à la demande les feuilles de style qui ne l'auraient pas été lors d'exécutions précédentes du script. le parser xml que je connais un peu, xmlstarlet, permet d'extraire assez facilement l'url de ces feuilles pour les lélécharger. Je modifie en conséquence les feuilles "link" qui les références.
Mais l'une d'entre elles contient des ordres d'insertion d'autres feuilles

@import url('init.css');
@import url('page.css');
@import url('header.css');
@import url('navigation.css');
@import url('forum-general.css');

Il devient irréaliste d'analyser le contenu des feuilles de style pour aller en chercher d'autres, et de modifier le contenu de ces feuilles pour prendre en compte les feuilles téléchargées au lieu des feuilles localisées sur le forum
- les scripts : ces lignes, lorsqu'elles sont "simples" sont codées ainsi

<script type="text/javascript" src="https://www-static.ubuntu-fr.org/theme2010/js/common.js"></script>

Le parser les transforme en

<script type="text/javascript" src="https://www-static.ubuntu-fr.org/theme2010/js/common.js"/>

ce qui ne devrait pas poser de problème. Mais le contenu des pages ne s'affiche plus. Je n'ai qu'une grande barre de titre qui prend toute la page, sans aucun texte.
Je n'ose pas croire que firefox ne sache traiter les lignes produites par le parser, mais les tests que j'ai effectués ne m'ont pas permis d'aboutir à une conclusion définitive.

Par ailleurs, moko m'a judicieusement fait remarquer qu'un résultat comparable, avec, certes, une présentation moins agréable, pouvait être obtenu par l'impression dans un fichier, j'ai abandonné l'idée de créer ces fichiers disponibles hors ligne. Et le script de MicP que tu as modifié pour en faire une sorte de bibliothèque apporte également des éléments de réponse.

Devant me rabattre sur une solution en ligne, je vais simplifier mon script pour créer un lanceur dans le répertoire au choix de l'utilisateur. C'est en quelque sorte redondant avec la fonction "Marquer cette page" du navigateur, mais, d'une part je constate que ma pratique personnelle est de les enregistre là où je sais les retrouver logiquement (par exemple le répertoire dans lequel j'enregistre les aides à la programmation), et d'autre part, un changement de navigateur ne les oblitère pas.

Je publierai ce petit script prochainement.

Arbiel

P.S. C'est bien la transformation des lignes de script qui empêche l'affichage des pages. C'est à peine croyable !!

Dernière modification par Arbiel (Le 22/11/2016, à 01:42)


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#29 Le 29/11/2016, à 21:29

MicP

Re : Enregistrement en local d'une intervention

Mais l'une d'entre elles contient des ordres d'insertion d'autres feuilles

@import url('init.css');
@import url('page.css');
@import url('header.css');
@import url('navigation.css');
@import url('forum-general.css');

Ces fichiers sont récupérables en utilisant les lignes de commandes suivantes :

wget https://www-static.ubuntu-fr.org/theme2010/css/forum.css
wget https://www-static.ubuntu-fr.org/theme2010/css/init.css
wget https://www-static.ubuntu-fr.org/theme2010/css/page.css
wget https://www-static.ubuntu-fr.org/theme2010/css/header.css
wget https://www-static.ubuntu-fr.org/theme2010/css/navigation.css
wget https://www-static.ubuntu-fr.org/theme2010/css/forum-general.css

=======
Pour ubuntuforums.org les pages sont encodées en ISO-8859-1, mais avec iconv on peut convertir ses pages en UTF-8.
Il reste que les feuilles de styles de différents forums risquent par finir d'utiliser les mêmes noms de classes avec des valeurs différentes et ça risque de vraiment compliquer le travail.

J'ai pensé faire un script JS pour accéder à ces pages par le DOM pour en récupérer les informations (données et règles CSS) , mais il restera encore à voir comment (accès au disque et organisation des fichiers) sauvegarder les informations extraites.

Il y a aussi les images des avatars à sauvegarder…et tout ce que j'oublie.

Dernière modification par MicP (Le 29/11/2016, à 21:30)

Hors ligne

#30 Le 03/12/2016, à 12:28

Arbiel

Re : Enregistrement en local d'une intervention

Bonjour

@MicP

Je n'ai pas encore pris une décision définitive sur le téléchargement des éléments référencés dans une page, surtout que tous ne sont pas indispensables pour que la visualisation de la page ou de la section (message dans le cas du forum) soit plaisante à l'œil.
Rechercher dans les éléments téléchargés de nouveaux éléments à télécharger pour télécharger tout ce qui est référencé, à quelque niveau que ce soit, est une opération trop complexe à réaliser pour que je m'y attelle, d'autant plus que les langages concernés (html et les langages de scripts) ont évolué avec le temps.

Si aucun élément n'est téléchargé, la visualisation de la page présente néanmoins le contenu, parfois difficile à lire, mais c'est un moindre mal. Par contre, des problèmes surviennent du fait de la présence d'adresses relatives. J'ai essayé de résoudre le problème avec l'option "e" de la commande de substitution de sed, en écrivant un script pour traiter les divers cas de figure, l'ordre sed se présentant comme ceci

sed -r "s/recherche des éléments significatifs tels que href ou src/script \n \m etc…/e"

Je n'ai pas abouti.

Arbiel

P.S. Je me suis finalement plongé dans les balises html pour y découvrir la balise "base" qui fait le travail. Il suffit donc d'insérer une ligne
<base…></base> pour résoudre le problème, ce que j'ai fait, en fin de section <head>…</head>. Je vais voir ce que cela donne. En conséquence, je vais peut-être réintroduire le code que j'ai écrit pour télécharger les feuilles de style et les scripts référencés par des adresses absolues. Pour éviter d'éventuels conflits entre des éléments de même nom téléchargés depuis des sites différents, je définis dans le répertoire cible des téléchargements un sous-répertoire par site, ce qui simplifie aussi la transformation des références concernées, dont il suffit de modifier "http(s):/" en "file:///répertoire".

Dernière modification par Arbiel (Le 03/12/2016, à 12:28)


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#31 Le 09/12/2016, à 15:56

Arbiel

Re : Enregistrement en local d'une intervention

Bonjour

J'ai finalement opté pour le seul téléchargement de la page ou de la section de page (message dans le cas du forum) sans téléchargement des feuilles de style ni des scripts. Le téléchargement de ces éléments est effectué par la commande "Enregistrer sous…" des navigateurs internet, et il n'y a pas lieu de refaire ce que ces navigateurs font; et, de plus, le font-ils mieux.

Après enregistrement dans un répertoire sous le nom "forum", la commande

<répertoire>/forum

donne toutes les informations nécessaires à sa mise en place et à son utilisation, sous réserve de la disponibilité de yad dans la configuration.

Arbiel

Version 1.2 : ajout d'un lien vers la page source en tête de la page enregistrée avec, en libellé, le nom du fichier enregistré et la date d'enregistrement.

#!/bin/bash
##########################################################################
#? script forum V1.2, le 10/12/2016 19:00
#? Les notices ci-dessous, reconnaissables par la présence en début de ligne du caractère "#" suivi d'un chiffre, constituent la documentation, consultable en cours d'utilisation. La première ligne de chaque notice en est le titre. 
#############################################################################################################
#############################################################################################################
#9 Utilisation
#9 
#9 Le script ne nécessite aucune installation particulière. Il convient de lui donner la propriété "Autoriser l'exécution du fichier comme un programme" et de l'enregistrer dans un partition montée avec l'option "exec".
#9 
#9 Dans un système mono-utilisateur, un emplacement de choix est ~/bin et dans un système multi-utilisateurs, il y a tout intérêt à l'enregistrer dans un répertoire énumére dans ${PATH}, de sorte que dans les deux cas il puisse être lancé par la commande :
#9 
#9 nom_du_script [fic]
#9 
#9 Si le mot clé "fic" est absent, le script présente les notices explicatives. Le seul mot clé permis est "fic".
#9 
#9 Avec Unity, il est possible, voire recommander, de lancer le script par un clic droit sur l'emblème du navigateur de la barre de lanceurs. Dans le lanceur en question, il faut ajouter une action, par exemple :
#9 
#9 [Desktop Action Forum]
#9 Name=Enregistrement message forum
#9 Exec=forum fic
#9 
#9 et modifier la ligne "Actions" en conséquence. Par exemple, pour le lanceur firefox d'Ubuntu :
#9 
#9 Actions=NewWindow;NewPrivateWindow;Forum;
#9 
######################################################################################################################
#8 Dépendances
#8 
#8 sed,
#8 yad,
#8 tempfile,
#8 wget, 
#8 notify-send
#8 recode
#8 
#8 doivent avoir été préalablement chargés.
#8 
#####################################################################################################################$
################################################
# initialisations générales
################################################
	function initialisation () {
		shopt -s extglob;
		Gbl_rep="${FRM_DIR:-/home/${USER}/forum}"; 	# répertoire par défaut pour l'enregistrement de la page
		Gbl_url="$(xclip -o 2>/dev/null)";		# url de la page à traiter, contenue dans le presse-papier
		Gbl_section="";				# section dans la page cible
		Gbl_script="${0}";			# nom du script
		Gbl_tempo_msg=500; 			# temporisation d'affichage des messages pas notify-send
		Gbl_ext_html="html";		# «extension» des fichiers
	}
################################################
# gestion des codes de retour
################################################	
	function cr? () {
		local c="${?}";
		[ $((${c})) -gt $((${cr})) ] &&  cr="${c}";
		[ -n "${1}" ] && echo "${1}" 1>>/dev/stderr;
		return $((${c}));
	}
###############################################
# aide, extraite du présent script
###############################################
	function notice () {
		local i j com liste_tab f_txt f_aide
		com="$(cat "${Gbl_script}" | sed -n -r "\+^#[[:digit:]][[:space:]]+p")";
		code="$(dd if=/dev/urandom bs=2 count=1 | hexdump -v -e '/2 "%02u"' 2>/dev/null)"
		for i in 1 5 8 9; do
			j=$((j+1));
			f_aide="$(tempfile -p forum -s .aide)";
			f_txt="$(tempfile -p forum -s .txt)";
			echo "${com}" | sed -n -r "/^#${i}[[:space:]]/{s/#${i}[[:space:]]*//;p}" 1>"${f_aide}";
# avec remplacement des espaces du titre de section par un espace insécable, car yad supprime les "soulignés"
			titre_tab="$(head -1 ${f_aide} | sed -r 's/^(.*)[[:space:]]*$/\1/' | sed -r 's/[[:space:]]+//g')";
			yad --plug=${code} --tabnum=$((${j})) --text-info --wrap --filename="${f_aide}" &>/"${f_txt}" &
			liste_tab="${liste_tab} --tab=${titre_tab}";
			done
		yad --notebook --key=${code} --title="Forum" --center --width=950 --sticky --height=450 ${liste_tab};
		return 0;
	}
#####################################################################################################################
#3 Page et section de page
#3 
#3 Une section de page est déterminée par la présence du caractère "#" au delà du dernier "/" de l'url. Le nom de la section est la chaîne de caractères qui suit ce caractère "#".
#3 
#3 La page ou la section de page peut être lue en ligne (internet) ou hors ligne (en local].
#3 
#3 En ligne, elle est visualisée avec la même présentation que la page cible, par le biais des feuilles de style et des scripts du site, alors accessibles, et la navigation vers les autres sites est opérationnelle.
#3 
#3 Hors ligne, les feuilles de style et les scripts étant inaccessibles contrairement à la manière dont procèdent les navigateurs qui téléchargent ces éléments, seul le contenu de la page est affiché. 
#3 
####################################################################################################################

################################################
# téléchargement de la page à traiter
################################################
	function lire_page () {
		local nb;
		set -o pipefail;
		Gbl_section="$(echo "${Gbl_url}" | grep "#" |  sed -r 's/^(.+)#$/\1/' | sed -r 's/^.*#([^#]+)$/\1/')";
		set +o pipefail;
		np=${#Gbl_section}
		[ $((${np})) -gt 0 ] && Gbl_page="${Gbl_url:0:$((${#Gbl_url}-${np}-1))}" || Gbl_page="${Gbl_url}";
		wget -O "${f_html:="$(tempfile -p forum -s .html)"}" "${Gbl_url}" || { cr? "la référence \"${Gbl_url}\" est inaccessible" ; return $((${?})); }
#		Gbl_titre="$(cat "${f_html}" | sed -n -r '/<title>/{s|^.*<title>([^</(]*).*$|\1|;s|(.*) +$|\1|;s|\[[^]*]||g;p}' | tr -d "\"<>?" | recode -f HTML..LATIN9)";
		Gbl_titre="$(cat "${f_html}" | sed -n -r '/<title>/{s|^.*<title>([^</(]*).*$|\1|;s|(.*) +$|\1|;s|\[.*][[:space:]]*||g;p}')";
	}

#####################################################
# création de la page html
####################################################
	function html () {
		local fichOut msg;
		Gbl_titre="$(basename "${Gbl_fichier}" .${Gbl_ext_html})";
		[ "$(basename "${Gbl_fichier}" .${Gbl_ext_html})" = "${Gbl_titre}" ] && eval "$(echo "${Gbl_titre}" | sed -r "s/^([^.]+)\.([[:alnum:]]+)$/Gbl_titre=\"\1\";ext=\"\2\";/")" 2>/dev/null || ext="${Gbl_ext_html}";
		fichOut="${Gbl_titre}.${ext}";
# extraction de la section si l'url se termine sur "#section", sinon extraction du corps de la page, sans les balises "body"
		if [ -n "${Gbl_section}" ]; then
			Gbl_div="$(sed  -n '/<div id="'${Gbl_section}'"/,/^<\/div>/p' "${f_html}")"  || { cr? "erreur extraction section" ; return $((${?})); } ;
		else
			Gbl_div="$(sed -n "/<body[ >]/,\+</body>+p" "${f_html}" | sed -e "{1d;\+</body>+d}")" || { cr? "erreur extraction corps de la page" ; return $((${?})); };
		fi;
		Gbl_head="$(sed  -ne "\|<head|,\|</head>|{s|<title>.*</title>|<title>${Gbl_titre}</title>|;s|</head>|<base href=\"${Gbl_url}\"/></head>|;p}" "${f_html}")";
		echo -e "${Gbl_entete}\n${Gbl_head}\n<body><div><a href=\"${Gbl_url}\">${Gbl_titre} (enregistré le $(date "+%A %d %B %G"))</a></div>\n${Gbl_div}\n</body></html>"  1> "${Gbl_rep}/${fichOut}" || { cr? "erreur création du fichier \"${fichOut}\"" ; return $((${?})); };
		msg="Le fichier \"${fichOut}\" a été enregistré dans le répertoire \"${Gbl_rep}\"";
		notify-send -u normal -t "${Gbl_tempo_msg}" -i firefox "Forum" "${msg}";
	}
##########################################################################################
#5 Dialogue utilisateur
#5  
#5 Le dialogue présente un contrôle de navigation dans les fichiers et trois boutons de fermeture.
#5  
#5 Le contrôle de navigation est initialisé avec le contenu de la variable d'environnement "FRM_DIR", ou à défaut le répertoire "forum" du répertoire personnel de l'utilisateur ("/home/${USER}/forum") pour ce qui concerne le répertoire, et avec le titre de la page cible pour ce qui concerne le nom du fichier.
#5 
#5 La navigation dans les fichiers efface le nom du fichier, qu'il est donc nécessaire de saisir à nouveau, ou de recopier. L'extension ".html" est automatiquement ajoutée aux noms de fichiers sans extension, sachant qu'est considérée comme extension la chaîne de caractères alphanumériques qui suit le dernier "." présent dans le nom du fichier.
#5 
#5 La fermeture du dialogue est provoquée par l'un des trois boutons "Valider", pour la création du fichier, "Aide" pour la présentation à l'écran de la documentation et "Annuler".
#5
############################################################################################################
#############################################
# dialogue utilisateur
##############################################
	function lecture_param () {
		local titre cr fini msg param;
		titre="Enregistrement de";
		[ -n "${Gbl_section}" ] && titre="${titre} la section \"${Gbl_section}\" de";
		titre="${titre} la page \"${Gbl_page}\".\n";
		fini=false;
		until ${fini}; do
			param="$(yad --form --title="Forum" --button="gtk-ok:0" --button="Aide:6"  --button="Annuler:9" \
			--width=800 \
				--text="${titre}" --always-print-result --sticky --center \
				--field="Fichier :SFL" \
				--field=":LBL" \
				 "${Gbl_rep}/${Gbl_titre}" )";
			cr="${?}";
			[[ $((${cr})) -eq 6 ]] && notice || fini=true;
			[[ $((${cr})) -lt 9 ]] && {
				Gbl_fichier="$(echo ${param} | cut -d "|" -f 1)";
				Gbl_titre="$(basename "${Gbl_fichier}")";
				Gbl_rep="$(dirname "${Gbl_fichier}")";
				! [ -d "${Gbl_rep}" ] && mkdir -p "${Gbl_rep}";
				}
				
			done;
		return $((${cr}));
	}



##########################################
# procédure principale
#########################################
	function fic () {
		local fini=false;
		if [ -z "${Gbl_url}" ]; then
				notice ;
				fini=true;
			else
				lire_page || fini=true;
			fi;
		until ${fini}; do
			lecture_param;
			ret="${?}";
			case "${ret}" in
				"0") 	html; fini=true;;
				"6") 	notice; lecture_param;;
				"*")	fini=true;;
				esac;
			done
		return;
	}
################################################################################################################
#1 Généralités
#1 
#1 Le script enregistre, dans un fichier au choix de l'utilisateur, une page "html" ou une section de page dont l'adresse, l'url, doit avoir été préalablement chargée dans le presse-papier, par exemple avec la commande  "Copier l'adresse du lien" du navigateur internet. Une section de page est déterminée par la présence du caractère "#" au delà du dernier "/" de l'url.
#1 
#1 Lorsqu'accédée en ligne (connexion internet), la page est visualisée avec la même présentation que la page cible, par le biais des feuilles de style et des scripts du site, alors accessibles, et la navigation vers les autres sites est opérationnelle.
#1 
#1 Hors ligne, les feuilles de style et les scripts étant inaccessibles contrairement à la manière dont procèdent les navigateurs qui téléchargent ces éléments, seul le contenu de la page est affiché. 
#1 
#1 Pour de plus amples détails, voir les notices présentées dans les autres onglets :
#1 
#1 Dialogue utilisateur
#1 Dépendances
#1 Utilisation
#1 
################################################################################################################
	initialisation;
# "source forum" ou ". forum" se traduisent par une commande "bash …" et ne doivent pas provoquer l'exécution du script
	! echo "${Gbl_script}" | grep bash 1>/dev/null && \
	{
		f_log="$(tempfile -p forum -s .log)";
		if [ -z "${*}" ]; then
			notice 2>"${f_log}";
		else
			${@} 2>"${f_log}";
		fi;
		[ $((${cr})) -gt 0 ] && yad --text-info --width=1200 --sticky --height=300 --wrap --filename="${f_log}" &>/dev/null;
#		rm /tmp/forum* ;
	}

Dernière modification par Arbiel (Le 10/12/2016, à 20:03)


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne