allow quote / reply date & time format to be set using %D{format}.
[claws.git] / src / quote_fmt_parse.y
index 66ee7f5bee04610da640d7fe8014030c4e972e90..2f3ec9a4305e760058b3a49c36ebab3806b529c2 100644 (file)
@@ -127,54 +127,83 @@ static int isseparator(char ch)
 
 %union {
        char chr;
+       char str[256];
 }
 
 %token SHOW_NEWSGROUPS
-%token SHOW_DATE SHOW_FROM SHOW_FULLNAME SHOW_FIRST_NAME
+%token SHOW_DATE SHOW_FROM SHOW_FULLNAME SHOW_FIRST_NAME SHOW_LAST_NAME
 %token SHOW_SENDER_INITIAL SHOW_SUBJECT SHOW_TO SHOW_MESSAGEID
 %token SHOW_PERCENT SHOW_CC SHOW_REFERENCES SHOW_MESSAGE
 %token SHOW_QUOTED_MESSAGE SHOW_BACKSLASH SHOW_TAB
 %token SHOW_QUOTED_MESSAGE_NO_SIGNATURE SHOW_MESSAGE_NO_SIGNATURE
-%token SHOW_EOL SHOW_QUESTION_MARK SHOW_OPARENT SHOW_CPARENT
+%token SHOW_EOL SHOW_QUESTION_MARK SHOW_PIPE SHOW_OPARENT SHOW_CPARENT
 %token QUERY_DATE QUERY_FROM
 %token QUERY_FULLNAME QUERY_SUBJECT QUERY_TO QUERY_NEWSGROUPS
 %token QUERY_MESSAGEID QUERY_CC QUERY_REFERENCES
+%token INSERT_FILE INSERT_PROGRAMOUTPUT
 %token OPARENT CPARENT
 %token CHARACTER
+%token SHOW_DATE_EXPR
 
 %start quote_fmt
 
 %token <chr> CHARACTER
 %type <chr> character
+%type <str> string
 
 %%
 
 quote_fmt:
-       character_or_special_or_query_list;
+       character_or_special_or_insert_or_query_list;
 
-character_or_special_or_query_list:
-       character_or_special_or_query character_or_special_or_query_list
-       | character_or_special_or_query ;
+character_or_special_or_insert_or_query_list:
+       character_or_special_or_insert_or_query character_or_special_or_insert_or_query_list
+       | character_or_special_or_insert_or_query ;
 
-character_or_special_or_query:
-       special ;
+character_or_special_or_insert_or_query:
+       special
        | character
        {
                INSERT_CHARACTER($1);
        }
        | query ;
-
+       | insert ;
 
 character:
        CHARACTER
        ;
 
+string:
+       CHARACTER
+       {
+               $$[0] = $1;
+               $$[1] = '\0';
+       }
+       | string CHARACTER
+       {
+               strcpy($$, $1);
+               $$[strlen($$) + 1] = '\0';
+               $$[strlen($$)] = $2;
+       };
+
 special:
        SHOW_NEWSGROUPS
        {
                if (msginfo->newsgroups)
                        INSERT(msginfo->newsgroups);
        }
+       | SHOW_DATE_EXPR OPARENT string CPARENT
+       {
+               if (msginfo->date_t) {
+                       char timef[128];
+                       struct tm *lt;
+
+                       if (NULL != (lt = localtime(&msginfo->date_t))) {
+                               strftime(timef, sizeof timef, $3, lt);
+                               INSERT(timef);
+                       }
+               }
+       }
        | SHOW_DATE
        {
                if (msginfo->date)
@@ -206,6 +235,37 @@ special:
                        }
                }
        }
+       | SHOW_LAST_NAME
+        {
+                /* This probably won't work together very well with Middle
+                 names and the like - thth */
+               if (msginfo->fromname) {
+                       gchar *p;
+                       gchar *str;
+
+                       str = alloca(strlen(msginfo->fromname) + 1);
+                       if (str != NULL) {
+                               strcpy(str, msginfo->fromname);
+                                p = str;
+                                while (*p && !isspace(*p)) p++;
+                                if (*p) {
+                                   /* We found a space. Get first none-space char and
+                                    insert rest of string from there. */
+                                   while (*p && isspace(*p)) p++;
+                                    if (*p) {
+                                       INSERT(p);
+                                   } else {
+                                       /* If there is no none-space char, just insert
+                                        whole fromname. */
+                                       INSERT(str);
+                                   }
+                               } else {
+                                   /* If there is no space, just insert whole fromname. */
+                                   INSERT(str);
+                               }
+                       }
+               }
+       }
        | SHOW_SENDER_INITIAL
        {
 #define MAX_SENDER_INITIAL 20
@@ -374,6 +434,10 @@ special:
        {
                INSERT("?");
        }
+       | SHOW_PIPE
+       {
+               INSERT("|");
+       }
        | SHOW_OPARENT
        {
                INSERT("{");
@@ -456,3 +520,33 @@ query:
        {
                remove_visibility();
        };
+
+insert:
+       INSERT_FILE OPARENT string CPARENT
+       {
+               {
+                       FILE *file;
+                       char buffer[256];
+                       
+                       if(file = fopen($3, "rb")) {
+                               while(fgets(buffer, sizeof(buffer), file)) {
+                                       INSERT(buffer);
+                               }
+                               fclose(file);
+                       }
+               }
+       }
+       | INSERT_PROGRAMOUTPUT OPARENT string CPARENT
+       {
+               {
+                       FILE *file;
+                       char buffer[256];
+
+                       if(file = popen($3, "r")) {
+                               while(fgets(buffer, sizeof(buffer), file)) {
+                                       INSERT(buffer);
+                               }
+                               fclose(file);
+                       }
+               }
+       };