Now parse a file

missing: fix url, use a pointer to static data
This commit is contained in:
Romain de Laage 2021-02-13 18:38:47 +01:00
parent 221ec20578
commit 11b54d9cb5
Signed by: rdelaage
GPG Key ID: 534845FADDF0C329
5 changed files with 200 additions and 166 deletions

13
include/gemgui.h Normal file
View File

@ -0,0 +1,13 @@
#ifndef _GEMGUI_H
#define _GEMGUI_H
void addH1 (GtkWidget *root, char *line);
void addH2 (GtkWidget *root, char *line);
void addH3 (GtkWidget *root, char *line);
void addLink (GtkWidget *root, char *url, char *text);
void addCode (GtkWidget *root, char *code, char *meta);
void addQuote (GtkWidget *root, char *quote);
void addUList (GtkWidget *root, char *text);
void addText (GtkWidget *root, char *text);
#endif

6
include/gemparse.h Normal file
View File

@ -0,0 +1,6 @@
#ifndef _GEMPARSE_H
#define _GEMPARSE_H
int parseFile (char *path);
#endif

133
src/gemgui.c Normal file
View File

@ -0,0 +1,133 @@
#include <gtk/gtk.h>
#include "../include/gemgui.h"
void linkAction (GtkWidget *widget, gpointer data);
void
addH1 (GtkWidget *root,
char *line)
{
gchar *markup = g_markup_printf_escaped ("<span weight=\"bold\" size=\"xx-large\">%s</span>", line);
GtkWidget *label = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label), markup);
g_free (markup);
gtk_widget_set_margin_start (label, 10);
gtk_widget_set_margin_end (label, 10);
gtk_widget_set_halign (label, GTK_ALIGN_START);
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
gtk_container_add (GTK_CONTAINER (root), label);
}
void
addH2 (GtkWidget *root,
char *line)
{
gchar *markup = g_markup_printf_escaped ("<span weight=\"bold\" size=\"x-large\">%s</span>", line);
GtkWidget *label = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label), markup);
g_free (markup);
gtk_widget_set_margin_start (label, 10);
gtk_widget_set_margin_end (label, 10);
gtk_widget_set_halign (label, GTK_ALIGN_START);
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
gtk_container_add (GTK_CONTAINER (root), label);
}
void
addH3 (GtkWidget *root,
char *line)
{
gchar *markup = g_markup_printf_escaped ("<span weight=\"bold\" size=\"large\">%s</span>", line);
GtkWidget *label = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label), markup);
g_free (markup);
gtk_widget_set_margin_start (label, 10);
gtk_widget_set_margin_end (label, 10);
gtk_widget_set_halign (label, GTK_ALIGN_START);
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
gtk_container_add (GTK_CONTAINER (root), label);
}
void
addLink (GtkWidget *root,
char *url,
char *text)
{
GtkWidget *linkBox = gtk_button_new ();
gchar *markup = g_markup_printf_escaped ("<span foreground=\"#0000FF\" underline=\"single\">%s</span>", text);
GtkWidget *label = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label), markup);
g_free (markup);
gtk_widget_set_margin_start (linkBox, 10);
gtk_widget_set_margin_end (linkBox, 10);
gtk_button_set_relief (GTK_BUTTON (linkBox), GTK_RELIEF_NONE);
g_signal_connect (linkBox, "clicked", G_CALLBACK (linkAction), url);
gtk_widget_set_halign (label, GTK_ALIGN_START);
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
gtk_container_add (GTK_CONTAINER (linkBox), label);
gtk_container_add (GTK_CONTAINER (root), linkBox);
}
void
addCode (GtkWidget *root,
char *code,
char *meta)
{
gchar *markup = g_markup_printf_escaped ("<span font_family=\"monospace\">%s</span>", code);
GtkWidget *label = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label), markup);
g_free (markup);
gtk_widget_set_margin_start (label, 10);
gtk_widget_set_margin_end (label, 10);
gtk_widget_set_halign (label, GTK_ALIGN_START);
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
gtk_container_add (GTK_CONTAINER (root), label);
}
void
addUList (GtkWidget *root,
char *text)
{
GtkWidget *label = gtk_label_new (text);
gtk_widget_set_margin_start (label, 20);
gtk_widget_set_margin_end (label, 10);
gtk_widget_set_halign (label, GTK_ALIGN_START);
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
gtk_container_add (GTK_CONTAINER (root), label);
//gtk_label_set_selectable (GTK_LABEL (label), TRUE);
}
void
addQuote (GtkWidget *root,
char *quote)
{
gchar *markup = g_markup_printf_escaped ("<span foreground=\"#707070\">%s</span>", quote);
GtkWidget *label = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label), markup);
g_free (markup);
gtk_widget_set_margin_start (label, 20);
gtk_widget_set_margin_end (label, 10);
gtk_widget_set_halign (label, GTK_ALIGN_START);
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
gtk_container_add (GTK_CONTAINER (root), label);
}
void
addText (GtkWidget *root,
char *text)
{
GtkWidget *label = gtk_label_new (text);
gtk_widget_set_margin_start (label, 10);
gtk_widget_set_margin_end (label, 10);
gtk_widget_set_halign (label, GTK_ALIGN_START);
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
gtk_container_add (GTK_CONTAINER (root), label);
}

View File

@ -1,5 +1,7 @@
#include <stdio.h>
#include <string.h>
#include <gtk/gtk.h>
#include "../include/gemgui.h"
#ifdef TESTGEMPARSE
@ -17,6 +19,10 @@ void addUList (const char *text);
int parseFile (char *path);
#else
extern GtkWidget *render;
#endif
int
@ -43,7 +49,11 @@ parseFile (char *path)
//Remove tailing '\n'
line[size - 1] = '\0';
#ifdef TESTGEMPARSE
addH3 (line + i);
#else
addH3 (render, line + i);
#endif
}
else if (size > 2 && line[0] == '#' && line [1] == '#')
{
@ -56,7 +66,11 @@ parseFile (char *path)
//Remove tailing '\n'
line[size - 1] = '\0';
#ifdef TESTGEMPARSE
addH2 (line + i);
#else
addH2 (render, line + i);
#endif
}
else if (size > 1 && line[0] == '#')
{
@ -69,7 +83,11 @@ parseFile (char *path)
//Remove tailing '\n'
line[size - 1] = '\0';
#ifdef TESTGEMPARSE
addH1 (line + i);
#else
addH1 (render, line + i);
#endif
}
else if (size > 2 && line[0] == '=' && line[1] == '>')
{
@ -98,13 +116,21 @@ parseFile (char *path)
//If not text, text = url
if (beginText == size)
#ifdef TESTGEMPARSE
addLink (line + beginUrl, line + beginUrl);
#else
addLink (render, line + beginUrl, line + beginUrl);
#endif
else
{
//Remove tailing '\n'
line[size - 1] = '\0';
#ifdef TESTGEMPARSE
addLink (line + beginUrl, line + beginText);
#else
addLink (render, line + beginUrl, line + beginText);
#endif
}
}
else if (size > 3 && line[0] == '`' && line[1] == '`' && line[2] == '`')
@ -129,7 +155,11 @@ parseFile (char *path)
size = strlen (code);
code[size - 1] = '\0';
#ifdef TESTGEMPARSE
addCode (line + 3, code);
#else
addCode (render, code, line + 3);
#endif
}
else if (size > 1 && line[0] == '*')
{
@ -176,7 +206,11 @@ parseFile (char *path)
size = strlen(text);
text[size - 1] = '\0';
#ifdef TESTGEMPARSE
addUList (text);
#else
addUList (render, text);
#endif
}
else if (size > 1 && line[0] == '>')
{
@ -189,10 +223,18 @@ parseFile (char *path)
//Remove tailing '\n'
line[size - 1] = '\0';
#ifdef TESTGEMPARSE
addQuote (line + i);
#else
addQuote (render, line + i);
#endif
}
else
#ifdef TESTGEMPARSE
printf ("%s", line);
#else
addText (render, line);
#endif
}
fclose (fileToParse);

View File

@ -1,4 +1,6 @@
#include <gtk/gtk.h>
#include "../include/gemgui.h"
#include "../include/gemparse.h"
GtkEntryBuffer *pathBarContent = NULL;
GtkWidget *render = NULL;
@ -10,7 +12,7 @@ loadPage (const char *link)
printf("Loading page : %s\n", link);
}
static void
void
linkAction (GtkWidget *widget,
gpointer data)
{
@ -24,184 +26,22 @@ goAction (GtkWidget *widget,
loadPage ((const char*)gtk_entry_buffer_get_text (pathBarContent));
}
static void
addText (GtkWidget *root,
gchar *text)
{
GtkWidget *label = gtk_label_new (text);
gtk_widget_set_margin_start (label, 10);
gtk_widget_set_margin_end (label, 10);
gtk_widget_set_halign (label, GTK_ALIGN_START);
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
gtk_container_add (GTK_CONTAINER (root), label);
//gtk_label_set_selectable (GTK_LABEL (label), TRUE);
}
static void
addTitle1 (GtkWidget *root,
gchar *text)
{
gchar *markup = g_markup_printf_escaped ("<span weight=\"bold\" size=\"xx-large\">%s</span>", text);
GtkWidget *label = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label), markup);
g_free (markup);
gtk_widget_set_margin_start (label, 10);
gtk_widget_set_margin_end (label, 10);
gtk_widget_set_halign (label, GTK_ALIGN_START);
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
gtk_container_add (GTK_CONTAINER (root), label);
//gtk_label_set_selectable (GTK_LABEL (label), TRUE);
}
static void
addTitle2 (GtkWidget *root,
gchar *text)
{
gchar *markup = g_markup_printf_escaped ("<span weight=\"bold\" size=\"x-large\">%s</span>", text);
GtkWidget *label = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label), markup);
g_free (markup);
gtk_widget_set_margin_start (label, 10);
gtk_widget_set_margin_end (label, 10);
gtk_widget_set_halign (label, GTK_ALIGN_START);
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
gtk_container_add (GTK_CONTAINER (root), label);
//gtk_label_set_selectable (GTK_LABEL (label), TRUE);
}
static void
addTitle3 (GtkWidget *root,
gchar *text)
{
gchar *markup = g_markup_printf_escaped ("<span weight=\"bold\" size=\"large\">%s</span>", text);
GtkWidget *label = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label), markup);
g_free (markup);
gtk_widget_set_margin_start (label, 10);
gtk_widget_set_margin_end (label, 10);
gtk_widget_set_halign (label, GTK_ALIGN_START);
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
gtk_container_add (GTK_CONTAINER (root), label);
//gtk_label_set_selectable (GTK_LABEL (label), TRUE);
}
static void
addTitle4 (GtkWidget *root,
gchar *text)
{
gchar *markup = g_markup_printf_escaped ("<span weight=\"bold\" size=\"medium\">%s</span>", text);
GtkWidget *label = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label), markup);
g_free (markup);
gtk_widget_set_margin_start (label, 10);
gtk_widget_set_margin_end (label, 10);
gtk_widget_set_halign (label, GTK_ALIGN_START);
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
gtk_container_add (GTK_CONTAINER (root), label);
//gtk_label_set_selectable (GTK_LABEL (label), TRUE);
}
static void
addTitle5 (GtkWidget *root,
gchar *text)
{
gchar *markup = g_markup_printf_escaped ("<span weight=\"bold\" size=\"small\">%s</span>", text);
GtkWidget *label = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label), markup);
g_free (markup);
gtk_widget_set_margin_start (label, 10);
gtk_widget_set_margin_end (label, 10);
gtk_widget_set_halign (label, GTK_ALIGN_START);
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
gtk_container_add (GTK_CONTAINER (root), label);
//gtk_label_set_selectable (GTK_LABEL (label), TRUE);
}
static void
addTitle6 (GtkWidget *root,
gchar *text)
{
gchar *markup = g_markup_printf_escaped ("<span weight=\"bold\" size=\"x-small\">%s</span>", text);
GtkWidget *label = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label), markup);
g_free (markup);
gtk_widget_set_margin_start (label, 10);
gtk_widget_set_margin_end (label, 10);
gtk_widget_set_halign (label, GTK_ALIGN_START);
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
gtk_container_add (GTK_CONTAINER (root), label);
//gtk_label_set_selectable (GTK_LABEL (label), TRUE);
}
static void
addLink (GtkWidget *root,
gchar *text)
{
GtkWidget *linkBox = gtk_button_new ();
gchar *markup = g_markup_printf_escaped ("<span foreground=\"#0000FF\" underline=\"single\">%s</span>", text);
GtkWidget *label = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label), markup);
g_free (markup);
gtk_widget_set_margin_start (linkBox, 10);
gtk_widget_set_margin_end (linkBox, 10);
gtk_button_set_relief (GTK_BUTTON (linkBox), GTK_RELIEF_NONE);
g_signal_connect (linkBox, "clicked", G_CALLBACK (linkAction), "un lien");
gtk_widget_set_halign (label, GTK_ALIGN_START);
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
gtk_container_add (GTK_CONTAINER (linkBox), label);
gtk_container_add (GTK_CONTAINER (root), linkBox);
//gtk_label_set_selectable (GTK_LABEL (label), TRUE);
}
static void
addCode (GtkWidget *root,
gchar *text)
{
gchar *markup = g_markup_printf_escaped ("<span font_family=\"monospace\">%s</span>", text);
GtkWidget *label = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label), markup);
g_free (markup);
gtk_widget_set_margin_start (label, 10);
gtk_widget_set_margin_end (label, 10);
gtk_widget_set_halign (label, GTK_ALIGN_START);
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
gtk_container_add (GTK_CONTAINER (root), label);
//gtk_label_set_selectable (GTK_LABEL (label), TRUE);
}
static void
makeRender (void)
{
if (render != NULL)
gtk_widget_destroy (render);
render = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
render = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
addTitle1 (render, "Titre de test");
addTitle2 (render, "Titre de test");
addTitle3 (render, "Titre de test");
addTitle4 (render, "Titre de test");
addTitle5 (render, "Titre de test");
addTitle6 (render, "Titre de test");
addText (render, "Bonjour, ceci est un test.\nFonctionne-t-il ?");
addLink(render, "lien test");
addCode(render, " .~.\n /V\\\n // \\\\\n/( )\\\n ^`~'^");
parseFile ("test.gmi");
gtk_container_add (GTK_CONTAINER (window), render);
}
/* This function's goal is to build the main interface */
static void
build_interface ()
build_interface (void)
{
GtkWidget *pathBar;
GtkWidget *headerBar;