Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • francesco-bariatti/pingouins
  • Samuel.Felton/pingouins
  • Lucas.Clement/pingouins
3 results
Show changes
Showing
with 0 additions and 1025 deletions
File deleted
File deleted
\documentclass[a4paper,11pt]{report}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{titlesec}
\usepackage{exptech}
\usepackage{listings}
\usepackage{hyperref}
\usepackage{color}
% Pour les figures
\usepackage{pstricks}
\usepackage{epsfig}
\usepackage[justification=centering]{caption}
\usepackage{tikz}
\setlength{\parskip}{1em}
% Random code from stackoverflow refining chapters
% See http://tex.stackexchange.com/questions/110840/how-to-remove-chapter-numbering-without-removing-it-from-tableofcontents
\titleformat{\chapter}
{\Large\bfseries} % format
{} % label
{0pt} % sep
{\huge} % before-code
%% ** Begin document ** %%
\title{Étude pratique : Amélioration de la complétion automatique de \LaTeX{}ila}
\author{Axel Caro\and François Boschet\and Maximilien Richer}
\date{2014-2015}
\begin{document}
% Configuration pour le code
\include{./lst_config}
\maketitle %affichage du titre
\tableofcontents %table des matières
\newpage
\chapter{Introduction}
\label{cha:Introduction}
Les \textit{études pratiques} sont des projets réalisés chaque année pas les élèves du département Informatique de l'INSA de Rennes qui s'étalent sur 10 mois.
Cette étude pratique en particulier se présente sous la forme d'une contribution à un logiciel dont le code source est libre, c'est à dire qu'il est mis à disposition du public qui peut s'il le souhaite proposer des améliorations.
\section{Latexila}
\label{sec:latexila}
Latexila est un projet d'éditeur LaTeX pour le projet Gnome, dont le développement a commencé en 2009\footnote{Voir \url{https://wiki.gnome.org/Apps/LaTeXila/History}} à l'initiative de Sébastien Wilmet, qui est encore à ce jour le mainteneur du projet.
Bien que commencé en C, le projet a été porté vers le langage Vala en 2010. Latexila adopte une approche centrée sur le code, ce qui lui permet d'être bien plus léger que nombre d'autres éditeurs, comme TeXMaker\footnote{\url{http://www.xm1math.net/texmaker/index_fr.html}} par exemple.
De par cette philosophie, il ne possède pas de module WYSIWYG\footnote{What You See Is What You Get - Un mode d'édition ou l'utilisateur édite directement une vue correspondant au rendu final}, ce qui le rend moins facile d'accès.
Il met cependant à la disposition de l'utilisateur des outils puissant qui en font bien plus qu'un simple éditeur de texte, comme :
\begin{itemize}
\item La compilation assistée
\item Une gestion de projet simplifiée
\item Une aide à la saisie (sous forme de complétion) des commandes \LaTeX
\end{itemize}
\chapter{Étude pratique} % (fold)
\label{cha:etude_pratique}
\section{Tâche à réaliser} % (fold)
\label{sec:tache_a_realiser}
La tâche à réaliser est l'amélioration de la complétion des commandes de référence \textbf{\textbackslash{}ref\{clef\}}. Ces commandes permettent de créer un lien cliquable vers un endroit précis du document, qui est matérialisé par un \textbf{\textbackslash{}label\{clef\}}.
Lorsque l'utilisateur souhaite réaliser une référence, la complétion doit lui proposer une liste des clefs possible.
\subsection{La complétion dans LaTeXila 2.2}
\label{sub:completion}
La version 2.2 de Latexila fournit une complétion exhaustive des éléments du langage \LaTeX{} en se basant sur un fichier XML descriptif lu au démarrage du programme.
Cette complétion est donc dite \textit{statique}, car elle n'adapte pas les propositions en utilisant le contenu entré par l'utilisateur.
Il lui est donc impossible de proposer une complétion pour \textbackslash{}ref.
\subsection{Une complétion dynamique}
\label{sub:completion_dyn}
Afin d'améliorer ce mécanisme de complétion pour qu'il prenne en charge l'argument de la commande \textbf{\textbackslash{}ref}, il convient de lui adjoindre une composante \textit{dynamique}, qui prendra en compte les éléments \textbf{\textbackslash{}label} déclarés par l'utilisateur.
% section tâche_à_réaliser (end)
\chapter{Réalisation}
La réalisation s'est faite par petits pas. Sur une base de deux semaines de travail, l'équipe se donnait un objectif à atteindre pour le point suivant avec l'encadrant.
Ces points bi-mensuels permettaient de discuter des directions à prendre pour le développement.
\section{Intégration d'une recherche au document courant}
Notre premier objectif a été de récupérer l'ensemble des labels déclarés dans le document courant.
Après avoir analysé le code, nous avons décidé d'utiliser tout d'abord un analyseur syntaxique \LaTeX{} fourni par Latexila. Il construit l'arbre représentatif de la structure du document.
Ces résultats sont ensuite intégrés au \textit{Completion Provider}, classe utilisée jusqu'alors pour gérer la complétion statique, et mis à jour lors de l'ouverture et de la sauvegarde du document.
% Le diagramme de fonctionnement du parser
\begin{figure}[h]
\label{fig:doc_opening}
\centering
\include{./draw/doc_opening}
\caption{Diagramme de séquence d'une analyse de document}
\end{figure}
\subsection{Invite de complétion}
%Le diagramme UML de la structure de completion
\begin{figure}[h!]
\label{fig:uml_completion_structure}
\centering
\include{./draw/uml_completion_structure}
\caption{Le diagramme UML de la structure de complétion.}
\end{figure}
A ce stade, la complétion est alimentée par l'analyseur syntaxique déjà éxistant qui est utilisé par l'arbre de structure du document courant.
Cela implique certaines contraintes comme de ne pas pouvoir l'appeler quand on le souhaite.
La mise à jour de la complétion se fait donc en même temps que celle de l'arbre représentant la structure du document courant.
Ainsi lors du changement de document, par exemple, la complétion n'est pas mise à jour et est donc moins pertinente.
D'autre part, on perd les précédentes données de complétion lors de l'analyse d'un autre document.
Conserver ces données éviterai des analyses redondantes et permettrait d'économiser du temps de calcul.
\section{Intégration d'une recherche à plusieurs documents}
L'étape suivante a été l'intégration de la complétion pour tous les documents ouverts dans Latexila, permettant ainsi de proposer une complétion propre à chaque document et d'éviter les propositions inappropriées.
Problèmes : comment choisir parmi les propositions celles liée au document courant ? Et comment stoker ces différents ensembles de choix de complétion de manière à pouvoir les mettre à jour ?
Ceci nous a conduit à rechercher une structure de donnée adaptée, et à l'implémenter après avoir étudié la documentation de ces structures dans le langage Vala.
Nous avons opté pour l'ajout d'une table de hachage au \textit{CompletionProvider}, qui stockera les ensemble de choix de complétion, indexés par le chemin absolu du fichier .tex auquel ils correspondent.
%Le diagramme de séquence d'une demande de complétion
\begin{figure}[h]
\label{fig:filtering_completion}
\centering
\include{./draw/filtering_completion}
\caption{Diagramme de séquence d'une demande de complétion.}
\end{figure}
Les choix de complétion proposés à l'utilisateur sont ceux du document courant.
Ceux-ci sont mis à jour lors de l'appel de l'utilisateur au gestionnaire de complétion. Ainsi, même lors du changement de document, ces choix sont filtrés pour le nouveau document.
À ce stade, la complétion est fonctionnelle pour tous les fichiers ouverts, les données ne sont pas perdues, leur mise à jour est cohérente, et la mise à jour des choix de complétion du gestionnaire de complétion est faite de façon efficace (mise à jour uniquement si nécessaire, donc si l'utilisateur change de document, ou s'il sauvegarde un document).
Cependant, il reste un problème : la complétion ne propose que les labels déclarés dans le document courant, alors que \LaTeX{} permet les références entre entre différents fichiers.
Il faut donc revoir le filtrage des choix de complétion.
Cet aspect nous conduit également à proposer des choix de complétion provenant de documents qui n'ont pas été ouverts.
\section{Intégration des fichiers non-ouverts}
Après discussion avec notre encadrant, nous avons décidé de limiter les choix de complétion pour un document à l'ensemble des labels déclarés dans les documents .tex de son répertoire.
Ce point est sujet à discussion, et nous y reviendrons durant la conclusion.
Pour ce faire, nous avons d'une part modifié notre structure de donnée pour que la clé de la table de hachage qui contient nos données de complétion soit désormais le chemin absolu du répertoire parent du document courant.
D'autre part, nous avons décidé de dissocier la complétion des labels du processus qui se charge de la structure du document, séparant ainsi ces deux aspects distincts.
%Le diagramme de séquence d'une analyse en arrière plan
\begin{figure}[h]
\label{fig:multiple_doc_completion}
\centering
\include{./draw/multiple_doc_completion}
\caption{Diagramme de séquence d'analyse en arrière plan.}
\end{figure}
À ce stade, la complétion est entièrement fonctionnelle.
Les choix proposés sont les labels déclarés dans les documents .tex du même répertoire que le document courant, l'analyse des documents est faite uniquement au besoin, et le changement de document vers un document d'un autre répertoire modifie correctement les propositions fournies.
\section{Gestion de projet} % (fold)
\subsection{Git}
\label{sub:git}
Git est le VCS\footnote{Version Control System} utilisé par la très grande majorité des projets open-source. Latexila est hébergé sur le dépôt git du projet Gnome\footnote{\url{git.gnome.org}} et un miroir est également disponible sur Github\footnote{\url{https://github.com/GNOME/latexila}}.
Pour ce projet, nous avons créé un \textit{fork} du dépôt principal sur Github et travaillé sur une branche annexe, régulièrement mise à jour à partir du dépôt principal.
Un patch entre la \textbf{branche principale} et la \textbf{branche de test} est ensuite créé avec \texttt{git patch} et posté sur le bugzilla dédié\footnote{Page de ce projet \url{https://bugzilla.gnome.org/show_bug.cgi?id=748069}}.
\chapter{Conclusion}
Le mécanisme de complétion, auparavant \textit{statique} prend désormais en charge une complétion \textit{dynamique} sur les labels déclarés par l'utilisateur.
Cependant, notre solution impose que les fichiers sources dont sont issues les labels se trouvent dans le même répertoire que le document ouvert.
Or certains utilisateurs sont susceptibles d'utiliser des sous-répertoires pour organiser leurs fichiers, et ne bénéficieraient donc pas de la complétion souhaitée.
De plus, il arrive que certains fichiers .tex ne soient que des anciennes versions de rapports, voire des fichiers de tests. Dans ce cas, notre mécanisme de complétion proposerait les labels déclarés dans ces fichiers, alors qu'ils ne sont pas souhaités.
Nous avons tout de même soumis ce patch au mainteneur du projet, monsieur Wilmet, qui nous a fait part de ses commentaires.
Après discussion avec notre encadrant et monsieur Wilmet, nous avons établi que pour palier à ces problèmes, une refonte de la notion de \textit{projet} comme ils sont organisés dans Latexila était nécessaire.
On pourrait ainsi proposer une complétion ne prenant en compte que les fichiers faisant partie du même projet, et éviter les problèmes précédemment soulevés.
\section*{\centerline{Remerciements}} % (fold)
\begin{center}
\label{sec:remerciements}
Nous remercions Arnaud Blouin, notre encadrant, pour sa disponibilité et ses conseils, ainsi que Sébastien Wilmet, développeur et mainteneur de Latexila, pour l'aide qu'il nous a apporté dans ce premier pas dans l'univers du logiciel libre.
\end{center}
\end{document}
\contentsline {chapter}{\numberline {1}Introduction}{2}{chapter.1}
\contentsline {section}{\numberline {1.1}Latexila}{2}{section.1.1}
\contentsline {chapter}{\numberline {2}\IeC {\'E}tude pratique}{3}{chapter.2}
\contentsline {section}{\numberline {2.1}T\IeC {\^a}che \IeC {\`a} r\IeC {\'e}aliser}{3}{section.2.1}
\contentsline {subsection}{\numberline {2.1.1}La compl\IeC {\'e}tion dans LaTeXila 2.2}{3}{subsection.2.1.1}
\contentsline {subsection}{\numberline {2.1.2}Une compl\IeC {\'e}tion dynamique}{3}{subsection.2.1.2}
\contentsline {chapter}{\numberline {3}R\IeC {\'e}alisation}{4}{chapter.3}
\contentsline {section}{\numberline {3.1}Int\IeC {\'e}gration d'une recherche au document courant}{4}{section.3.1}
\contentsline {subsection}{\numberline {3.1.1}Invite de compl\IeC {\'e}tion}{4}{subsection.3.1.1}
\contentsline {section}{\numberline {3.2}Int\IeC {\'e}gration d'une recherche \IeC {\`a} plusieurs documents}{5}{section.3.2}
\contentsline {section}{\numberline {3.3}Int\IeC {\'e}gration des fichiers non-ouverts}{6}{section.3.3}
\contentsline {section}{\numberline {3.4}Gestion de projet}{7}{section.3.4}
\contentsline {subsection}{\numberline {3.4.1}Git}{7}{subsection.3.4.1}
\contentsline {chapter}{\numberline {4}Conclusion}{8}{chapter.4}
\relax
\providecommand\hyper@newdestlabel[2]{}
\@setckpt{./lst_config}{
\setcounter{page}{1}
\setcounter{equation}{0}
\setcounter{enumi}{0}
\setcounter{enumii}{0}
\setcounter{enumiii}{0}
\setcounter{enumiv}{0}
\setcounter{footnote}{0}
\setcounter{mpfootnote}{0}
\setcounter{part}{0}
\setcounter{chapter}{0}
\setcounter{section}{0}
\setcounter{subsection}{0}
\setcounter{subsubsection}{0}
\setcounter{paragraph}{0}
\setcounter{subparagraph}{0}
\setcounter{figure}{0}
\setcounter{table}{0}
\setcounter{lstnumber}{1}
\setcounter{Item}{0}
\setcounter{Hfootnote}{0}
\setcounter{bookmark@seq@number}{0}
\setcounter{ContinuedFloat}{0}
\setcounter{lstlisting}{0}
\setcounter{section@level}{0}
}
\definecolor{mygreen}{rgb}{0,0.6,0}
\definecolor{mygray}{rgb}{0.5,0.5,0.5}
\definecolor{mymauve}{rgb}{0.58,0,0.82}
\lstset{ %
backgroundcolor=\color{white}, % choose the background color; you must add \usepackage{color} or \usepackage{xcolor}
basicstyle=\tt\small, % the size of the fonts that are used for the code
breakatwhitespace=false, % sets if automatic breaks should only happen at whitespace
breaklines=true, % sets automatic line breaking
captionpos=b, % sets the caption-position to bottom
commentstyle=\color{mygreen}, % comment style
deletekeywords={...}, % if you want to delete keywords from the given language
escapeinside={\%*}{*)}, % if you want to add LaTeX within your code
extendedchars=true, % lets you use non-ASCII characters; for 8-bits encodings only, does not work with UTF-8
frame=single, % adds a frame around the code
keepspaces=true, % keeps spaces in text, useful for keeping indentation of code (possibly needs columns=flexible)
keywordstyle=\color{blue}, % keyword style
language=[Sharp]C, % the language of the code
otherkeywords={*,...}, % if you want to add more keywords to the set
numbers=left, % where to put the line-numbers; possible values are (none, left, right)
numbersep=5pt, % how far the line-numbers are from the code
numberstyle=\tiny\color{mygray}, % the style that is used for the line-numbers
rulecolor=\color{black}, % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. comments (green here))
showspaces=false, % show spaces everywhere adding particular underscores; it overrides 'showstringspaces'
showstringspaces=false, % underline spaces within strings only
showtabs=false, % show tabs within strings adding particular underscores
stepnumber=2, % the step between two line-numbers. If it's 1, each line will be numbered
stringstyle=\color{mymauve}, % string literal style
tabsize=2, % sets default tabsize to 2 spaces
title=\lstname % show the filename of files included with \lstinputlisting; also try caption instead of title
}
\lstset{literate=
{é}{{\'e}}1 {à}{{\`a}}1 {è}{{\`e}}1
{â}{{\^a}}1 {ê}{{\^e}}1 {ç}{{\c c}}1
{î}{{\^i}}1 {û}{{\^u}}1
}
mktextfm ecrm1095
mktextfm ecrm1095
mktextfm ecrm1095
\chapter{Réalisation}
La réalisation s'est faite par petits pas. Sur une base de deux semaines de travail, l'équipe se donnait un objectif à atteindre pour le point suivant avec l'encadrant.
Ces points bi-mensuels permettaient de discuter des directions à prendre pour le développement.
\section{Intégration d'une recherche au document courant}
Notre premier objectif a été de récupérer l'ensemble des labels déclarés dans le document courant. Après avoir analysé le code, nous avons décidé d'utiliser tout d'abord un parseur existant, celui permettant de construire l'arbre représentatif de la structure des documents.
% Le diagramme de fonctionnement du parser
\begin{figure}[h]
\label{fig:flow_parser_call}
\centering
\include{./draw/flow_parser_call}
\caption{L'appel au parser.}
\end{figure}
Ces résultats sont ensuite intégrés au \textit{Completion Provider} (classe utilisée jusqu'alors pour gérer la complétion statique).
\subsection{Invite de complétion}
\begin{lstlisting}[frame=single]
public class CompletionProvider : GLib.Object, SourceCompletionProvider
{
// Structure de la commande
struct CompletionCommand
{
string name; // Dans notre cas, la commande \\ref
string? package;
CompletionArgument[] args; // Dans notre cas, un seul argument
}
// Structure d'argument de commande
struct CompletionArgument
{
string label;
bool optional;
CompletionChoice[] choices; // Dans notre cas, l'ensemble des labels déclarés par l'utilisateur
}
// Structure de la proposition de complétion
public struct CompletionChoice
{
string name; // Dans notre cas, l'intitulé du label
string? package;
string? insert;
string? insert_after;
}
\end{lstlisting}
%Le diagramme UML de la structure de completion
\begin{figure}[h!]
\label{fig:uml_completion_structure}
\centering
\include{./draw/uml_completion_structure}
\caption{Le diagramme UML de la structure de completion.}
\end{figure}
À ce stade, la complétion est fonctionnelle pour le document courant, mais l'utilisation du parseur déjà existant implique certaines contraintes. La mise à jour de la complétion se fait en même temps que celle de l'arbre représentant la structure du document courant, alors qu'il s'agit de deux traitement à priori indépendants. Ainsi, lors du changement de document, la complétion n'est pas mise à jour, et n'est donc pas pertinente. Enfin, on perd les précédentes données de complétion lors du parsing d'un autre document. Conserver ces données éviterai des parsing redondants.
\section{Intégration d'une recherche à plusieurs documents}
L'étape suivante a été l'intégration de la complétion pour tous les documents ouverts dans LaTeXiLa. Ceci pose plusieurs problèmes : comment proposer la complétion liée au document courant ? (problème de filtrage et de mise à jour des données) ; comment stoker ces différents ensembles de choix de complétion ?
Ceci nous a conduit à rechercher une structure de donnée adaptée, et à l'implémenter, après avoir étudié la documentation de ces structures dans le langage vala. Nous avons décidé d'utiliser un ensemble non redondant (HashSet) de choix de complétion, pour chaque document, qui est ensuite envoyé au gestionnaire de complétion. Nous avons doté celui-ci d'une table de hachage, ayant pour clef le chemin absolu d'un document, et comme valeur l'ensemble non redondant de choix de complétion associé.
Les choix de complétion proposés à l'utilisateur sont ceux du document courant, et sont obtenus grâce à une méthode parcourant la table de hachage, et retournant l'ensemble des choix de complétion à proposer. Ceux-ci sont mis à jour lors de l'appel de l'utilisateur au gestionnaire de complétion. Lors du changement de document, ces choix sont mis à jour automatiquement dans le gestionnaire de complétion.
Désormais, l'ajout d'un choix de complétion est fait dans l'attribut du document précédement mentionné, au lieu de mettre à jour directement les choix de complétion du gestionnaire de complétion. La mise à jour de la table de hachage du gestionnaire de complétion est faite lorsque le parsing du document est terminé. Celui-ci a lieu lors de la sauvegarde du document par l'utilisateur, et lors de son ouverture dans LaTeXila.
\subsection{Structure de donnée}
\begin{lstlisting}[frame=single]
public class Document : Gtk.SourceBuffer
{
// Référence vers le gestionnaire de complétion
private CompletionProvider provider = CompletionProvider.getDefault();
// Ensemble non redondant des choix de complétion associés à chaque label du document courant
private Gee.HashSet<CompletionProvider.CompletionChoice?> _label_completion_choices = new Gee.HashSet<CompletionProvider.CompletionChoice?>();
public void save(bool check_file_changed_on_disk = true; bool force = false)
{
// ...
parse();
}
}
public class CompletionProvider : GLib.Object, SourceCompletionProvider
{
// Table de hachage regroupant tous les choix de complétion de chaque document
private Gee.HashMap<string, Gee.HashSet<CompletionChoice?>> _labels_from_files = new Gee.HashMap<string, Gee.HashSet<CompletionChoice?>>();
// Représente le dernier document analysé, donc le document courant
private string _last_doc = "";
// Permet de savoir s'il faut mettre à jour les choix de complétion proposés
private bool _labels_modified = false;
// Méthode déjà présente appellée lors de l'appel de l'utilisateur au gestionnaire de complétion
public void populate (SourceCompletionContext context)
{
// ...
if(_labels_modified) // Uniquement si il faut mettre à jour les choix de complétion
update_label_completion_choices();
}
public void update_label_completion_choices()
{
if(_last_doc != "") // Uniquement si la table de hachage contient quelque chose
{
CompletionChoice[] choices = get_all_labels(_last_doc);
CompletionCommand cmd_ref = _commands["\\ref"];
cmd_ref.args[0].choices = choices;
_commands["\\ref"] = cmd_ref;
set_labels_modified(true);
}
}
public CompletionChoice[] get_all_labels(string doc)
{
CompletionChoice[] choices = {};
foreach(var entry in _labels_from_files.entries)
{
if(entry.key.has_prefix(doc))
{
foreach(CompletionChoice c in entry.value)
{
choices += c;
}
}
}
}
}
public class DocumentTab : Grid
{
private cool view_focused_in ()
{
// ...
document.load (document.location); // Chargement du document, et analyse
}
}
\end{lstlisting}
À ce stade, la complétion est fonctionnelle pour tous les fichiers ouverts, les données ne sont pas perdues, leur mise à jour est cohérente, et la mise à jour des choix de complétion du gestionnaire de complétion est faite de façon efficace. % dévelopepr ?
Cependant, il reste des problèmes : les choix de complétion ne contiennent que les labels déclarés dans le document courant, alors que le principe du langage \LaTeX{} est de permettre les références entre documents. Il faut donc revoir le filtrage des choix de complétion. Cet aspect nous conduit également à proposer des choix de complétion provenant de documents qui n'ont pas été ouverts.
\section{Intégration des fichiers non-ouverts}
Durant cette étape, nous avons répondu aux problèmes précédemment cités. Après discussion avec notre encadrant, nous avons décider de limiter les choix de complétion pour un document à l'ensemble des labels déclarés dans les documents .tex de son répertoire. Ce point est sujet à discussion, et nous y reviendrons par la suite. D'autre part, nous avons décidé de dissocier le parseur des labels du parseur de la structure du document, séparant ainsi ces deux aspects distincts.
Aussi, nous avons décidé de procéder de la façon suivante : à l'ouverture d'un document, on effectue l'analyse de ce document, puis de tous les documents .tex de son répertoire, s'ils n'ont pas déjà été analysé (cas de l'ouverture de plusieurs documents d'un même répertoire). De plus, le filtrage sur les choix de complétion à proposer est fait non plus sur le chemin absolu du document courant, mais sur celui de son répertoire parent. Nous avons approché ce problème de manière récursive, ce qui a conduit à certaines modifications.
Nous nous sommes donc intéressés à la notion de fichier en vala, et à leur manipulation.
\begin{lstlisting}[frame=single]
public class Document
{
// Désormais, lors du chargement d'un document, on spécifie si l'on veut analyser ses frères, ou seulement ce document
public void load(File location, bool parse_related)
{
// ...
if(parse_related)
{
parse_related_documents();
} else {
parse();
}
}
public void parse_related_documents()
{
File dir = location.getParent(); // Répertoire parent du document courant
try {
FileEnumerator enumerator = dir.enumerate_children(
"standard::",
FileQueryInfoFlags.NOFOLLOW_SYMLINKS,
null);
FileInfo info = null;
while (((info = enumerator.next_file(null)) != null))
{
Document doc = new Document();
File child = enumerator.get_child(info);
string file_path = child.get_parse_name();
if(file_path.has_suffix(".tex") && (!already_parsed(file_path))) // S'il s'agit d'un document .tex, et qu'il n'a pas déjà été analysé, ie il n'y a pas d'entrée correspondante dans la table de hachage du gestionnaire de complétion
{
doc.load(child, false); // On ne veut pas analyser les frères de ce document, cela est fait dans la boucle
}
}
enumerator.close();
} catch (Error e) {
warning ("%s", e.message);
}
}
}
public class CompletionProvider : GLib.Object, SourceCompletionProvider
{
// Remplace _last_doc
// Représente le répertoire parent du dernier document analysé, donc du document courant
private string _last_dir = "";
// De la même façon, on remplace le filtrage par document par le filtrage par répertoire dans les méthodes update_label_completion_choices() et get_all_labels()
}
\end{lstlisting}
À ce stade, la complétion est entièrement fonctionnelle. Les choix proposés sont les labels déclarés dans les documents .tex du même répertoire que le document courant, l'analyse des documents est faite uniquement au besoin, et le changement de document courant vers un document d'un autre répertoire est fonctionnel.
Le mécanisme de complétion, auparavant \textit{statique} prend désormais en charge une complétion \textit{dynamique} sur les labels déclarés par l'utilisateur. Cependant, notre solution est notamment criticable sur le point suivant : le filtrage des choix de complétion proposés sur le répertoire parent du document courant. En effet, certains utilisateurs sont susceptibles d'utiliser des sous-répertoires pour organiser leurs fichiers, et ne bénéficieraient donc pas de la complétion souhaitée. De plus, il arrive que certains fichiers .tex ne soient que des anciennes versions de rapports, voire des fichiers de tests. Dans ce cas, notre mécanisme de complétion proposerait les labels déclarés dans ces fichiers, alors qu'ils ne sont pas souhaités.
Nous avons donc soumis ce patch au mainteneur du projet, monsieur Wilmet, qui nous as fait part de ses commentaires.
Après discussion avec notre encadrant et monsieur Wilmet, nous avons établi que pour palier à ces problèmes, une refonte de la notion de \textit{projet} comme ils sont organisés dans LaTeXiLa était nécessaire. On pourrait ainsi proposer une complétion ne prenant en compte que les fichiers faisant partie du même projet, et éviter les points précédemment soulevés.
\chapter{Conclusion}
Cette étude pratique a été pour nous l'occasion de découvrir le fonctionnement des projets open-source.
\end{document}
% listings for Vala
% Vala definitions
%
\lst definelanguage{Vala}[Sharp]{C}%
{morekeywords={CCode,DBus,Test,cname,cheader_filename,type_id,%
marshaller_type_name,get_value_function,set_value_function,%
default_value,IntegerType,rank,type_signature,size_t,int8,int16,%
int32,uint32,uint16,uint8,int64,uint64,float,double,time_t,%
SimpleType,unichar,cprefix,has_type_id,get,set,ref_function,%
unref_function,free_function,has_target,Compact,delegate,%
destroy_function,PrintFormat,Diagnostics,FILE,LINE,METHOD,%
errordomain,array_length_type,has_array_length,is_null_terminated,%
ReturnsModifiedPointer,dup_function,weak,owned,unowned,value,var,%
connect,async},%
morecomment=[s]{"""}{"""}
}[keywords,strings]
% from https://mail.gnome.org/archives/vala-list/2009-October/msg00139.html
First approache of the code
=======================
Let's see what we can do !
Directories
----------------
Here are the directories, with comments:
data/ icons, images and templates used by latexila
docs/ reference manual
help/ reference files (and some translations?)
m4/ macro for valac
man/ manpage
po/ language files for latexila
src/ code in vala !
tests/ code coverage and test tools
vapi/ ?
Main
--------
Use of two ```main```:
- one for command line call
- one for app call
Interesting files/methods
-----------------------
- document -> parser
- document_structure -> variables and structures to describe a document
- get_markup_type
- search_markup
- get_markup_content
- handle_item
- completion -> ```CompletionProvider```
# ```Parser()``` calls
What happens when a document is save (parsing POV)
### Methods
1. File: main_window.vala | Method: save_document(Document doc, bool force_save_as)
2. File: structure.vala | Method: public void refresh ()
3. File: structure.vala | Method: private void show_document (Document? doc, bool force_parse = false)
### Summary
When a document is saved (i.e. when the method 1 is called) and if thsi document is the active one,
the doc structure is refresh via ```_main_window_structure.refresh ();``` (2)
The method called refresh (2)is a single call to the method 3 with the argument force_parse set at True. It
fullfill the condition ```if (force_parse)``` and call the method ```_document_structure.parse ();```
That's all folks!
\ No newline at end of file
HowTo build latexila
=================
*A hopefully short but deseperatly long todo-list*
Edited in **Markdown**, following [GitHub](https://help.github.com/articles/markdown-basics/)
syntax.
The downloadseption
---------------------------------
### I want data
1. install git
2. use it to clone gnome's latexila repo with
git clone git://git.gnome.org/latexila
3. now the tools : ```git clone git://git.gnome.org/gnome-common```
4. activate the source repo in source.list and refresh packet manager
5. install some packages(1) :
#### Ubuntu 14.10/Debian-testing
sudo apt-get build-dep latexila
get sources requirements, then
sudo apt-get install gtk-doc-tools gnome-devel gobject-introspection
(that's _super_ heavy !)
**Ubuntu** PPA for **valac** v0.25.4
sudo add-apt-repository ppa:vala-team
Optional ? ```sudo apt-get install gnome-core-devel gnome-platform-devel```
#### Fedora 20
Install latexila's dependencies
yum-builddep latexila
OR
Install Jhbuild.
To learn how to install Jhubuild and then compile Latexila, read the “HowtoJhbuild.md” file!
##### References
- [APT - Build dependencies of a package](http://askubuntu.com/questions/21379/how-do-i-find-the-build-dependencies-of-a-package)
- [vala-team/ppa](https://launchpad.net/~vala-team/+archive/ubuntu/ppa)
- [jhbuild for dependencies](https://wiki.gnome.org/Projects/Jhbuild/Dependencies/Fedora)
Install it
------------
### Gimme code
_Maybe this step can be skipped with appropriate packages ?_
1. Configure *gnome-commons* by using ``` ./autogen.sh ```
2. Build and install ```sudo make install```
For later - Setup a working dev-env
-------------------------------------
1. Install vim
2. Learn to use vim
3. Install vim-airline
4. Install vim-fugitive
5. Install vala.vim
6. Learn how to use git
7. ...
Jhbuild is awesome
==================
This is how Gnome describes Jhbuild:
> Jhbuild is the recommended way to build and run GNOME development code. It will download the code,
> configure and build it for you, in a way that does not interfere with or modify your existing system
Installation
------------
Follow these instructions -> [Jhbuild](https://wiki.gnome.org/HowDoI/Jhbuild) and you might need to intall this
[dependencies under Fedora](https://wiki.gnome.org/Projects/Jhbuild/Dependencies/Fedora). Mind what you're doing.
When jhbuild is installed, copy the config file relative to your project in ~/.config/jhbuildrc.
Install a software for me please
--------------------------------
To install and build latexila and (quite) all his dependencies use :
jhbuild build latexila
You may need other modules you can install with :
jhbuild buildone *module*
Run a software
-----------------
To run latexila :
jhbuild run latexila
Tips
----
If you got this : ”*configure: error: vapigen not found*”, you have to install vala :
jhbuild buildone vala
The Latexila source folder is located in **prefix_install**/jhbuild/checkout/latexila. Remember ```ln -s ```.
File deleted
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/PR-SVG-20010719/DTD/svg10.dtd">
<svg width="51cm" height="35cm" viewBox="19 381 1020 694" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g>
<rect style="fill: #ffffff" x="200" y="540" width="433.5" height="58"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="200" y="540" width="433.5" height="58"/>
<text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:monospace;font-style:normal;font-weight:normal" x="416.75" y="556">&lt;&lt;Window&gt;&gt;</text>
<text font-size="16" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:700" x="416.75" y="575">MainWindow</text>
<text font-size="11.2" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="416.75" y="590.5">Manage main window and documents</text>
<rect style="fill: #ffffff" x="200" y="598" width="433.5" height="164"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="200" y="598" width="433.5" height="164"/>
<text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:monospace;font-style:normal;font-weight:normal" x="203" y="612">-_action_entries: Gtk.ActionEntry[]</text>
<text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:monospace;font-style:normal;font-weight:normal" x="203" y="628">-_toggle_action_entries: ToggleActionEntry[]</text>
<text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:monospace;font-style:normal;font-weight:normal" x="203" y="644">+default_location: string = Environment.get_home_dir ()</text>
<text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:monospace;font-style:normal;font-weight:normal" x="203" y="660">-_statusbar: CustomStatusbar</text>
<text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:monospace;font-style:normal;font-weight:normal" x="203" y="676">-_ui_manager: UIManager</text>
<text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:monospace;font-style:normal;font-weight:normal" x="203" y="692">-_action_group: Gtk.ActionGroup</text>
<text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:monospace;font-style:normal;font-weight:normal" x="203" y="708">-_latex_action_group: Gtk.ActionGroup</text>
<text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:monospace;font-style:normal;font-weight:normal" x="203" y="724">-_main_window_file: MainWindowFile</text>
<text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:monospace;font-style:normal;font-weight:normal" x="203" y="740">+_main_window_edit: MainWindowEdit</text>
<text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:monospace;font-style:normal;font-weight:normal" x="203" y="756">+</text>
<rect style="fill: #ffffff" x="200" y="762" width="433.5" height="8"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="200" y="762" width="433.5" height="8"/>
</g>
<g>
<rect style="fill: #ffffff" x="140" y="800" width="194.8" height="44"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="140" y="800" width="194.8" height="44"/>
<text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:monospace;font-style:normal;font-weight:normal" x="237.4" y="816">&lt;&lt;Notebook&gt;&gt;</text>
<text font-size="16" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:700" x="237.4" y="835">DocumentsPanel</text>
<rect style="fill: #ffffff" x="140" y="844" width="194.8" height="20"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="140" y="844" width="194.8" height="20"/>
<text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:monospace;font-style:normal;font-weight:normal" x="143" y="858">+active_tab: DocumentTab</text>
<rect style="fill: #ffffff" x="140" y="864" width="194.8" height="8"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="140" y="864" width="194.8" height="8"/>
</g>
<g>
<polyline style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="416.75,795.172 416.75,836 335.806,836 "/>
<polygon style="fill: #ffffff" points="416.75,770 421.55,784 416.75,798 411.95,784 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="416.75,770 421.55,784 416.75,798 411.95,784 "/>
</g>
<g>
<rect style="fill: #ffffff" x="820" y="740" width="158.2" height="28"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="820" y="740" width="158.2" height="28"/>
<text font-size="16" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:700" x="899.1" y="759">MainWindowFile</text>
<rect style="fill: #ffffff" x="820" y="768" width="158.2" height="8"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="820" y="768" width="158.2" height="8"/>
<rect style="fill: #ffffff" x="820" y="776" width="158.2" height="8"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="820" y="776" width="158.2" height="8"/>
</g>
<g>
<rect style="fill: #ffffff" x="820" y="660" width="160.95" height="28"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="820" y="660" width="160.95" height="28"/>
<text font-size="16" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:700" x="900.475" y="679">MainWindowEdit</text>
<rect style="fill: #ffffff" x="820" y="688" width="160.95" height="8"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="820" y="688" width="160.95" height="8"/>
<rect style="fill: #ffffff" x="820" y="696" width="160.95" height="8"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="820" y="696" width="160.95" height="8"/>
</g>
<g>
<rect style="fill: #ffffff" x="820" y="560" width="217.15" height="28"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="820" y="560" width="217.15" height="28"/>
<text font-size="16" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:700" x="928.575" y="579">MainWindowDocument</text>
<rect style="fill: #ffffff" x="820" y="588" width="217.15" height="8"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="820" y="588" width="217.15" height="8"/>
<rect style="fill: #ffffff" x="820" y="596" width="217.15" height="8"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="820" y="596" width="217.15" height="8"/>
</g>
<g>
<polyline style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="659.678,655 733.748,655 733.748,682 818.99,682 "/>
<polygon style="fill: #ffffff" points="634.507,655 648.507,650.2 662.507,655 648.507,659.8 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="634.507,655 648.507,650.2 662.507,655 648.507,659.8 "/>
</g>
<g>
<polyline style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="659.678,655 733.748,655 733.748,762 818.99,762 "/>
<polygon style="fill: #ffffff" points="634.507,655 648.507,650.2 662.507,655 648.507,659.8 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="634.507,655 648.507,650.2 662.507,655 648.507,659.8 "/>
</g>
<g>
<polyline style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="659.678,655 733.75,655 733.75,582 818.993,582 "/>
<polygon style="fill: #ffffff" points="634.507,655 648.507,650.2 662.507,655 648.507,659.8 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="634.507,655 648.507,650.2 662.507,655 648.507,659.8 "/>
</g>
<g>
<rect style="fill: #ffffff" x="520" y="800" width="219.35" height="28"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="520" y="800" width="219.35" height="28"/>
<text font-size="16" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:700" x="629.675" y="819">MainWindowBuildTools</text>
<rect style="fill: #ffffff" x="520" y="828" width="219.35" height="8"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="520" y="828" width="219.35" height="8"/>
<rect style="fill: #ffffff" x="520" y="836" width="219.35" height="8"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="520" y="836" width="219.35" height="8"/>
</g>
<g>
<polyline style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="416.75,796.179 416.75,822 518.993,822 "/>
<polygon style="fill: #ffffff" points="416.75,771.007 421.55,785.007 416.75,799.007 411.95,785.007 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="416.75,771.007 421.55,785.007 416.75,799.007 411.95,785.007 "/>
</g>
<g>
<rect style="fill: #ffffff" x="180" y="920" width="166.6" height="44"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="180" y="920" width="166.6" height="44"/>
<text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:monospace;font-style:normal;font-weight:normal" x="263.3" y="936">&lt;&lt;Statusbar&gt;&gt;</text>
<text font-size="16" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:700" x="263.3" y="955">CustomStatusbar</text>
<rect style="fill: #ffffff" x="180" y="964" width="166.6" height="8"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="180" y="964" width="166.6" height="8"/>
<rect style="fill: #ffffff" x="180" y="972" width="166.6" height="8"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="180" y="972" width="166.6" height="8"/>
</g>
<g>
<rect style="fill: #ffffff" x="20" y="400" width="96.7" height="44"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="20" y="400" width="96.7" height="44"/>
<rect style="fill: #ffffff" x="20" y="382" width="30" height="18"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="20" y="382" width="30" height="18"/>
<text font-size="12.7998" style="fill: #000000;text-anchor:start;font-family:monospace;font-style:normal;font-weight:normal" x="26" y="433.9">
<tspan x="26" y="433.9">Glib</tspan>
</text>
<text font-size="12.7998" style="fill: #000000;text-anchor:start;font-family:monospace;font-style:normal;font-weight:normal" x="26" y="417.9">&lt;&lt;Library&gt;&gt;</text>
</g>
<g>
<rect style="fill: #ffffff" x="520" y="880" width="219.15" height="56"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="520" y="880" width="219.15" height="56"/>
<text font-size="16" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:700" x="629.575" y="899">MainWindowStructure</text>
<text font-size="11.2" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="629.575" y="914.5">stuff for the structure (the list of</text>
<text font-size="11.2" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="629.575" y="928.5">chapters, sections, ... of a document)</text>
<rect style="fill: #ffffff" x="520" y="936" width="219.15" height="8"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="520" y="936" width="219.15" height="8"/>
<rect style="fill: #ffffff" x="520" y="944" width="219.15" height="8"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="520" y="944" width="219.15" height="8"/>
</g>
<g>
<rect style="fill: #ffffff" x="140" y="1000" width="206.3" height="58"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="140" y="1000" width="206.3" height="58"/>
<text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:monospace;font-style:normal;font-weight:normal" x="243.15" y="1016">&lt;&lt;Namespace&gt;&gt;</text>
<text font-size="16" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:700" x="243.15" y="1035">Utils</text>
<text font-size="11.2" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="243.15" y="1050.5">Utilities for String, URI, Path and UI</text>
<rect style="fill: #ffffff" x="140" y="1058" width="206.3" height="8"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="140" y="1058" width="206.3" height="8"/>
<rect style="fill: #ffffff" x="140" y="1066" width="206.3" height="8"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="140" y="1066" width="206.3" height="8"/>
</g>
<g>
<polyline style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="416.75,796.167 416.75,900 263.3,900 263.3,919.019 "/>
<polygon style="fill: #ffffff" points="416.75,770.995 421.55,784.995 416.75,798.995 411.95,784.995 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="416.75,770.995 421.55,784.995 416.75,798.995 411.95,784.995 "/>
</g>
<g>
<polyline style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="416.75,796.135 416.75,860 629.575,860 629.575,878.997 "/>
<polygon style="fill: #ffffff" points="416.75,770.963 421.55,784.963 416.75,798.963 411.95,784.963 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="416.75,770.963 421.55,784.963 416.75,798.963 411.95,784.963 "/>
</g>
<g>
<rect style="fill: #ffffff" x="349.297" y="385.73" width="133.4" height="58"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="349.297" y="385.73" width="133.4" height="58"/>
<text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:monospace;font-style:normal;font-weight:normal" x="415.997" y="401.73">&lt;&lt;Application&gt;&gt;</text>
<text font-size="16" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:700" x="415.997" y="420.73">LatexilaApp</text>
<text font-size="11.2" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="415.997" y="436.23">Set application theme</text>
<rect style="fill: #ffffff" x="349.297" y="443.73" width="133.4" height="8"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="349.297" y="443.73" width="133.4" height="8"/>
<rect style="fill: #ffffff" x="349.297" y="451.73" width="133.4" height="8"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="349.297" y="451.73" width="133.4" height="8"/>
</g>
<g>
<polyline style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="415.997,485.91 415.997,506.866 416.75,506.866 416.75,538.993 "/>
<polygon style="fill: #ffffff" points="415.997,460.739 420.797,474.739 415.997,488.739 411.197,474.739 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="415.997,460.739 420.797,474.739 415.997,488.739 411.197,474.739 "/>
</g>
<g>
<polyline style="fill: none; fill-opacity:0; stroke-width: 2; stroke-dasharray: 8; stroke: #000000" points="348.289,422.73 236.997,422.73 236.997,422 124.411,422 "/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="137.059,417 121.059,422 137.059,427 "/>
</g>
<g>
<polyline style="fill: none; fill-opacity:0; stroke-width: 2; stroke-dasharray: 8; stroke: #000000" points="200,656 200,660 68.35,660 68.35,451.599 "/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="73.35,464.246 68.35,448.246 63.35,464.246 "/>
</g>
</svg>
# Where the method "parse" from DocumentStructure is called
```VALA
public DocumentStructure get_structure ()
{
if (_structure == null)
{
_structure = new DocumentStructure (this);
_structure.parse ();
}
return _structure;
}
```
There is a parser for projects.
# Prototypes from interesting methods
## In file document_structure.vala
Methods
```VALA
private StructType? get_markup_type (string markup_name)
private bool search_markup (string line, int after_backslash_index, out StructType? type, out string? contents, out int? end_match_index)
private string? get_markup_contents (string line, int begin_contents_index, out int? end_match_index)
private void handle_item (StructType type, string? contents, TextIter iter)
private bool search_low_level_item (string line, int start_index, out StructType? type, out string? contents, out int? start_match_index, out int? end_match_index)
```
Variables
```VALA
public bool parsing_done { get; private set; default = false; }
```
## In file structure_model.vala
```VALA
private Gee.ArrayList<unowned Node<StructData?>>? get_list (StructType type)
```
I: Deleting .la file: u'/opt/gnome/_jhbuild/root-gdk-pixbuf/opt/gnome/lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-jpeg.la'
I: Deleting .la file: u'/opt/gnome/_jhbuild/root-gdk-pixbuf/opt/gnome/lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-qtif.la'
I: Deleting .la file: u'/opt/gnome/_jhbuild/root-gdk-pixbuf/opt/gnome/lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-ico.la'
I: Deleting .la file: u'/opt/gnome/_jhbuild/root-gdk-pixbuf/opt/gnome/lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-pnm.la'
I: Deleting .la file: u'/opt/gnome/_jhbuild/root-gdk-pixbuf/opt/gnome/lib/libgdk_pixbuf-2.0.la'
I: Déplacement du DESTDIR u'/opt/gnome/_jhbuild/root-gdk-pixbuf' temporaire dans le préfixe de construction
I: 0 files remaining from previous build
I: Installation terminée : 214 fichiers copiés
I: Lancement du script de déclenchement après l'installation : 'gdk-pixbuf'
/bin/sh /home/maximilien/INSA/jhbuild/triggers/gdk-pixbuf.trigger
*** Extraction de at-spi2-core *** [13/24]
git remote set-url origin git://git.gnome.org/at-spi2-core
git remote update origin
Récupération de origin
git rebase origin/master
La branche courante master est à jour.
*** Construction de at-spi2-core *** [13/24]
make -j 5
CDPATH="${ZSH_VERSION+.}:" && cd . && /bin/sh /home/maximilien/INSA/gnome/at-spi2-core/config/missing aclocal-1.13 -I m4
/home/maximilien/INSA/gnome/at-spi2-core/config/missing: ligne 81: aclocal-1.13 : commande introuvable
WARNING: 'aclocal-1.13' is missing on your system.
You should only need it if you modified 'acinclude.m4' or
'configure.ac' or m4 files included by 'configure.ac'.
The 'aclocal' program is part of the GNU Automake package:
<http://www.gnu.org/software/automake>
It also requires GNU Autoconf, GNU m4 and Perl in order to run:
<http://www.gnu.org/software/autoconf>
<http://www.gnu.org/software/m4/>
<http://www.perl.org/>
Makefile:481: recipe for target 'aclocal.m4' failed
make: *** [aclocal.m4] Error 127
*** Erreur durant l'étape « build » de at-spi2-core: ########## Erreur lors de l'exécution de make -j 5 *** [13/24]
[1] Relancer l'étape build
[2] Ignorer l'erreur et continuer à l'étape install
[3] Abandonner ce module
[4] Démarrer un shell
[5] Recharger la configuration
[6] Aller à l'étape « effacer le répertoire et recommencer »
[7] Aller à l'étape « configure »
[8] Aller à l'étape « clean »
[9] Aller à l'étape « distclean »
choix :
149 app_settings.vala
59 bottom_panel.vala
678 build_tool_dialog.vala
509 build_tools_preferences.vala
341 clean_build_files.vala
949 completion.vala
47 custom_statusbar.vala
185 dialogs.vala
93 documents_panel.vala
1141 document_structure.vala
352 document_tab.vala
598 document.vala
288 document_view.vala
105 encodings.vala
72 error_entry.vala
0 evince
602 file_browser.vala
0 gedit
282 latexila_app.vala
740 latexila.gresource.xml
1585 latex_menu.vala
0 liblatexila
137 main.vala
477 main_window_build_tools.vala
291 main_window_documents.vala
278 main_window_edit.vala
224 main_window_file.vala
184 main_window_structure.vala
1254 main_window.vala
95 Makefile.am
30 menu_in_toolbar.vala
243 most_used_symbols.vala
414 preferences_dialog.vala
358 project_dialogs.vala
279 projects.vala
540 search.vala
130 side_panel.vala
92 stock_icons.vala
859 structure_model.vala
794 structure.vala
325 symbols.vala
163 symbols_view.vala
91 tab_info_bar.vala
291 templates_dialogs.vala
452 templates.vala
0 ui
347 utils.vala
17123 total
\documentclass{article}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% PACKAGES
\usepackage{graphicx} %images
\usepackage[hidelinks]{hyperref}
\usepackage[utf8]{inputenc}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\title{\textbf{Jeu des pingouins: documentation technique}}
\author{Francesco Bariatti \and Adrien Gasté \and Mikaël Le \and Romain Lebouc}
\date{2015-2016}
\begin{document}
\pagenumbering{gobble}
\maketitle
\newpage
\tableofcontents
\newpage
\pagenumbering{arabic}
\section{Introduction}
mcts en c++, javafx.
Interface mcts donnée par Pascal, nous on a fait le penguin.hpp et cpp et tout ce qu'il y a dans le dossier gui.
Le jeu doit implementer une interface \textit{game}
Le jeu donne l'état en json après chaque coup, l'interface graphique ne fait que lancer le jeu et lire sa sortie std.
Le mcts attends un numero de coup (entre 0 et le nombre de coups -1), donc conversion.
Au début le mcts attends un état json qui est utilisé pour changer son état de depart (il ne change que ce qui est specifié: un json \{\} va lancer l'état par defaut)
\section{Interface game}
Comment implementer un jeu (fonction par fonction). regarder dans les fichiers texte dans le dossier doc, il y a un markdown qui explique.
\section{L'implementation du jeu des pingouins}
bitboards, pingouins sur 32 bits, calculs de +8 -8 selon la direction ...
\section{L'interface graphique}
Modele MVC. Le controlleur fait tout. Le modele stocke juste des données. La view a un lien vers le modele et se mets à jour quand le controller le dit.
\end{document}
\ No newline at end of file