Advertisement
Giovy27072

Recurring notes Obsidian

Oct 29th, 2022 (edited)
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.29 KB | Source Code | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5. #include <time.h>
  6.  
  7. const char *weekday[] = {"sunday",  "monday",  "tuesday", "wednesday", "thursday", "friday", "saturday"};
  8. //char * searchWeekDay(char *);
  9. char * searchWeekDay(char *, char *);
  10. bool controllaRicorrenti(char *,char *);
  11. void getDate(char*,bool);
  12. bool checkDay(char *);
  13. void ThreeLetterToFull(char *);
  14.  
  15.  
  16. int main()
  17. {
  18.     char today[130];
  19.  
  20.     getDate(today,true); // nome del file
  21.  
  22.     char toDoList[] = {"../../../Produttività 🎯/To-Do List 📝.md"}; //PATH TO-DO LIST
  23.  
  24.     char *buffer = (char *) malloc(sizeof(char)*100); // Buffer per contenere le righe estratte dal file
  25.  
  26.     char ricorrenza[15] = {""}; // Variabile in cui salvare la ricorrenza delle task
  27.  
  28.     bool taskListPart = false; //Variabile per segnalare che una task ricorrente è stata trovata e quindi le prossime righe fanno parte di essa e quindi devono essere salvate sul file
  29.  
  30.     size_t lunghezza;
  31.  
  32.     FILE *fp; //file sorgente
  33.     FILE *log; // log file
  34.     FILE *fileWT; //file destinazione
  35.  
  36.  
  37.     if((log = fopen("log.txt","w")) == NULL) //controllo file log
  38.     {
  39.         exit(-1);
  40.     }
  41.  
  42.     if((fp = fopen(toDoList,"r")) == NULL) //controllo file sorgente
  43.     {
  44.         fprintf(log,"file problem! (error opening log file)");
  45.         fclose(fp);
  46.         fclose(log);
  47.         exit(-1);
  48.     }
  49.  
  50.     if((fileWT = fopen(today,"w")) == NULL) //controllo file destinazione
  51.     {
  52.         fprintf(log,"file problem! (error opening destination file) %s",today);
  53.         fclose(fp);
  54.         fclose(log);
  55.         exit(-1);
  56.     }
  57.  
  58.  
  59.     getline(&buffer,&lunghezza,fp); //Prendo la prima stringa dal file
  60.    
  61.     do
  62.     {
  63.         if(taskListPart == true || controllaRicorrenti(buffer,ricorrenza)) // controlla che la task sia ricorrente o continua a scrivere sul file se questa riga fa parte di una task ricorrente
  64.         {
  65.             if (strlen(buffer) < 2) // se la riga è vuota allora è finita la task ricorrente e quindi devi controllare se ce ne sono altre
  66.             {
  67.                 taskListPart = false;
  68.                 taskListPart2 = false;
  69.  
  70.             }else if (taskListPart == true) // se questa è una riga che fa parte di una task ricorrente allora scrivila sul file
  71.             {
  72.                 fputs(buffer,fileWT);
  73.  
  74.             }else if (checkDay(ricorrenza)) // se la riga non fa parte di una task ricorrente allora cerca se oggi è un giorno in cui deve essere fatta la task
  75.             {
  76.                 fputs(buffer,fileWT);
  77.                 taskListPart = true;
  78.             }
  79.             else
  80.             {
  81.                 taskListPart2 = true;
  82.             }
  83.         }
  84.         else if (taskListPart2 == false)        
  85.         {
  86.             fputs(buffer,fileWT);
  87.         }
  88.        
  89.     }while(getline(&buffer,&lunghezza,fp) > -1); //continua finchè non hai letto tutte le righe del file
  90.  
  91.     fclose(fp);
  92.     fclose(log);
  93.     fclose(fileWT);
  94.  
  95.     free(buffer);
  96.  
  97.     return 0;
  98. }
  99.  
  100. bool controllaRicorrenti(char * buffer, char * ricorrenza) // controlla se una task è ricorrente
  101. {
  102.     strcpy(ricorrenza," ");
  103.     char *tmp = buffer; // utilizziamo la variabile tmp per le varie operazioni così da non contaminare la variabile buffer che ci servirà inalterata
  104.     char exclude[15] = {""};
  105.     char tmp2[10] = {""};
  106.     if(strstr(tmp,"- [ ]") != NULL) // Se trovi una task allora controlla che sia ricorrente
  107.     {
  108.         //tmp = buffer; // tmp è stata modificata da strstr quindi la riportiamo di nuovo allo stati iniziale
  109.  
  110.         if(tmp=strstr(tmp,"(ricorrente:")) // Se è ricorrente allora verifica ogni quanto si verifica
  111.         {        
  112.             //tmp = buffer; // tmp è stata modificata da strstr quindi la riportiamo di nuovo allo stati iniziale
  113.  
  114.             if(strstr(tmp,"_to_")) //controlla se è ricorrente per più giorni consecutivi
  115.             {
  116.                 strcpy(exclude,searchWeekDay(buffer," ")); // trova il giorno di inizio del periodo in cui deve essere ripetuta la task e copialo in exclude
  117.                 strcpy(tmp2,exclude);
  118.                 strcpy(ricorrenza,strcat(tmp2,"_to_")); // salva in ricorrenza la concatenazione del contenuto di exclude (giorno inzio ripetizione task) con "_to_" (es. mon_to_)
  119.                 strcat(ricorrenza,searchWeekDay(buffer,exclude)); // ottieni la ricorrenza della task nella forma giornoInizio_to_giornoFine
  120.             }
  121.             else
  122.             {
  123.                 strcpy(ricorrenza,searchWeekDay(buffer," "));
  124.             }
  125.  
  126.             return true; // se è ricorrente restituisci true
  127.         }
  128.         else
  129.         {
  130.             return false; // se non è ricorrente restituisci false
  131.         }
  132.     }
  133. }
  134.  
  135. char * searchWeekDay(char * buffer, char * exclude) // cerca se c'è un giorno della settimana nella stringa (scritto nella forma a 3 lettere) e esclude dalla ricerca un giorno passato come parametro
  136. {
  137.  
  138.     if(strcmp("mon", exclude) != 0 && strstr(buffer,"mon") != NULL)
  139.     {
  140.         return "mon";
  141.     }
  142.     else if(strcmp("tue", exclude) != 0 && strstr(buffer,"tue") != NULL)
  143.     {
  144.         return "tue";
  145.     }
  146.     else if(strcmp("wed", exclude) != 0 && strstr(buffer,"wed") != NULL)
  147.     {
  148.         return "wed";
  149.     }
  150.     else if(strcmp("thu", exclude) != 0 && strstr(buffer,"thu") != NULL)
  151.     {
  152.         return "thu";
  153.     }
  154.     else if(strcmp("fri", exclude) != 0 && strstr(buffer,"fri") != NULL)
  155.     {
  156.         return "fri";
  157.     }
  158.     else if(strcmp("sat", exclude) != 0 && strstr(buffer,"sat") != NULL)
  159.     {
  160.         return "sat";
  161.        
  162.     }
  163.     else if(strcmp("sun", exclude) != 0 && strstr(buffer,"sun") != NULL)
  164.     {
  165.         return "sun";  
  166.     }
  167. }
  168.  
  169. void getDate(char * today, bool nomeFile) { // restuisce il nome del file nella forma: "percorsoFileDestinazione + dataAttuale" se nomeFile è true altrimenti restituisce la data attuale
  170.  
  171.     time_t t = time(NULL);
  172.     struct tm tm = *localtime(&t);
  173.  
  174.     if (nomeFile == true)
  175.     {
  176.         sprintf(today,"/home/giovanni/Studio/Obsidian/Vault/Produttività 🎯/Pianificazione giornata/%s - %02d-%02d-%04d.md", weekday[tm.tm_wday], tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900);
  177.     }
  178.     else
  179.     {
  180.         sprintf(today,"%s - %02d-%02d-%04d", weekday[tm.tm_wday], tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900);
  181.     }
  182.    
  183. }
  184.  
  185. bool checkDay(char *ricorrenza)
  186. {
  187.     char * tmp = ricorrenza;
  188.     char day1[10];
  189.     char day2[10];
  190.     char day3[10];
  191.     char today[30];
  192.  
  193.    
  194.     int day1Position;
  195.     int day2Position;
  196.  
  197.     if(strstr(tmp,"_to_")); //controlla se è ricorrente per più giorni consecutivi, se lo è allora cerca in quali giorni
  198.     {
  199.         strcpy(day1,searchWeekDay(ricorrenza,""));
  200.         strcpy(day2,searchWeekDay(ricorrenza,day1));
  201.  
  202.         getDate(today,false);
  203.        
  204.         ThreeLetterToFull(day1);
  205.         ThreeLetterToFull(day2);
  206.  
  207.         for(int i = 0; i < 7 ; i++)
  208.         {
  209.             if(strcmp(weekday[i],day1) == 0)
  210.             {
  211.                 day1Position = i;
  212.                 break;
  213.             }
  214.         }
  215.  
  216.         for(int i = 0; i < 7 ; i++)
  217.         {
  218.             if(strcmp(weekday[i],day2) == 0)
  219.             {
  220.                 day2Position = i;
  221.                 break;
  222.             }
  223.         }
  224.  
  225.         if(strstr(today,day1) != NULL)
  226.         {
  227.             return true;
  228.         }
  229.         else if(strstr(today,day2) != NULL)
  230.         {
  231.             return true;
  232.         }
  233.         else
  234.         {
  235.             for (int i = day1Position; i != day2Position; i++)
  236.             {
  237.                 if (strstr(today,weekday[i]) != NULL)
  238.                 {
  239.                     return true;
  240.                 }
  241.             }
  242.             return false;
  243.         }
  244.     }
  245. }
  246.  
  247. void ThreeLetterToFull(char *day) // cerca un giorno della settimana all'interno della stringa
  248. {
  249.     if (strstr(day,"mon"))
  250.     {
  251.         strcpy(day,"monday");
  252.     }else if (strstr(day,"tue"))
  253.     {
  254.         strcpy(day,"tuesday");
  255.     }else if (strstr(day,"wed"))
  256.     {
  257.         strcpy(day,"wednesday");
  258.     }else if (strstr(day,"thu"))
  259.     {
  260.         strcpy(day,"thursday");
  261.     }else if (strstr(day,"fri"))
  262.     {
  263.         strcpy(day,"friday");
  264.     }else if (strstr(day,"sat"))
  265.     {
  266.         strcpy(day,"saturday");
  267.     }else if (strstr(day,"sun"))
  268.     {
  269.         strcpy(day,"sunday");
  270.     }
  271. }
Tags: Obsidian
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement