Version 21.64.1: Nov 28, 2021 Code refactoring in link insertion.

This commit is contained in:
acanas 2021-11-28 01:13:30 +01:00
parent c4ab84c2c7
commit d2988d8895
2 changed files with 46 additions and 52 deletions

View File

@ -64,12 +64,7 @@ struct ALn_Link
{ {
ALn_LinkType_t Type; ALn_LinkType_t Type;
struct ALn_Substring URLorNick; struct ALn_Substring URLorNick;
struct struct ALn_Substring NickAnchor[3];
{
struct ALn_Substring Anchor1;
struct ALn_Substring Anchor2;
struct ALn_Substring Anchor3;
} Nick;
size_t AddedLengthUntilHere; // Total length of extra HTML code added until this link (included) size_t AddedLengthUntilHere; // Total length of extra HTML code added until this link (included)
struct ALn_Link *Prev; struct ALn_Link *Prev;
struct ALn_Link *Next; struct ALn_Link *Next;
@ -104,28 +99,28 @@ static void ALn_CopySubstring (const struct ALn_Substring *PtrSrc,char **PtrDst)
/*****************************************************************************/ /*****************************************************************************/
// For URLs the length of anchor is fixed, so it can be calculated once // For URLs the length of anchor is fixed, so it can be calculated once
#define ALn_URL_ANCHOR_1 "<a href=\"" #define ALn_URL_ANCHOR_0 "<a href=\""
#define ALn_URL_ANCHOR_2 "\" target=\"_blank\">" #define ALn_URL_ANCHOR_1 "\" target=\"_blank\">"
#define ALn_URL_ANCHOR_3 "</a>" #define ALn_URL_ANCHOR_2 "</a>"
#define ALn_URL_ANCHOR_0_LENGTH (sizeof (ALn_URL_ANCHOR_0) - 1)
#define ALn_URL_ANCHOR_1_LENGTH (sizeof (ALn_URL_ANCHOR_1) - 1) #define ALn_URL_ANCHOR_1_LENGTH (sizeof (ALn_URL_ANCHOR_1) - 1)
#define ALn_URL_ANCHOR_2_LENGTH (sizeof (ALn_URL_ANCHOR_2) - 1) #define ALn_URL_ANCHOR_2_LENGTH (sizeof (ALn_URL_ANCHOR_2) - 1)
#define ALn_URL_ANCHOR_3_LENGTH (sizeof (ALn_URL_ANCHOR_3) - 1) #define ALn_URL_ANCHOR_TOTAL_LENGTH (ALn_URL_ANCHOR_0_LENGTH + ALn_URL_ANCHOR_1_LENGTH + ALn_URL_ANCHOR_2_LENGTH)
#define ALn_URL_ANCHOR_TOTAL_LENGTH (ALn_URL_ANCHOR_1_LENGTH + ALn_URL_ANCHOR_2_LENGTH + ALn_URL_ANCHOR_3_LENGTH)
static const struct ALn_Substring URLAnchor1 = static const struct ALn_Substring URLAnchor[3] =
{ {
.Str = ALn_URL_ANCHOR_1, [0] = {
.Len = ALn_URL_ANCHOR_1_LENGTH, .Str = ALn_URL_ANCHOR_0,
}; .Len = ALn_URL_ANCHOR_0_LENGTH,
static const struct ALn_Substring URLAnchor2 = },
{ [1] = {
.Str = ALn_URL_ANCHOR_2, .Str = ALn_URL_ANCHOR_1,
.Len = ALn_URL_ANCHOR_2_LENGTH, .Len = ALn_URL_ANCHOR_1_LENGTH,
}; },
static const struct ALn_Substring URLAnchor3 = [2] = {
{ .Str = ALn_URL_ANCHOR_2,
.Str = ALn_URL_ANCHOR_3, .Len = ALn_URL_ANCHOR_2_LENGTH,
.Len = ALn_URL_ANCHOR_3_LENGTH, },
}; };
/*****************************************************************************/ /*****************************************************************************/
@ -161,9 +156,7 @@ void ALn_InsertLinks (char *Txt,unsigned long MaxLength,size_t MaxCharsURLOnScre
size_t Length; size_t Length;
size_t i; size_t i;
struct ALn_Substring Limited; // URL displayed on screen (may be shorter than actual length) struct ALn_Substring Limited; // URL displayed on screen (may be shorter than actual length)
const struct ALn_Substring *Anchor1; const struct ALn_Substring *Anchor[3];
const struct ALn_Substring *Anchor2;
const struct ALn_Substring *Anchor3;
/**************************************************************/ /**************************************************************/
/***** Find starts and ends of links (URLs and nicknames) *****/ /***** Find starts and ends of links (URLs and nicknames) *****/
@ -202,14 +195,14 @@ void ALn_InsertLinks (char *Txt,unsigned long MaxLength,size_t MaxCharsURLOnScre
switch (Link->Type) switch (Link->Type)
{ {
case ALn_LINK_URL: case ALn_LINK_URL:
Anchor1 = &URLAnchor1; Anchor[0] = &URLAnchor[0];
Anchor2 = &URLAnchor2; Anchor[1] = &URLAnchor[1];
Anchor3 = &URLAnchor3; Anchor[2] = &URLAnchor[2];
break; break;
case ALn_LINK_NICK: case ALn_LINK_NICK:
Anchor1 = &Link->Nick.Anchor1; Anchor[0] = &Link->NickAnchor[0];
Anchor2 = &Link->Nick.Anchor2; Anchor[1] = &Link->NickAnchor[1];
Anchor3 = &Link->Nick.Anchor3; Anchor[2] = &Link->NickAnchor[2];
break; break;
default: default:
continue; continue;
@ -228,7 +221,7 @@ void ALn_InsertLinks (char *Txt,unsigned long MaxLength,size_t MaxCharsURLOnScre
*PtrDst-- = *PtrSrc--; *PtrDst-- = *PtrSrc--;
/***** Step 2: Copy third part of anchor *****/ /***** Step 2: Copy third part of anchor *****/
ALn_CopySubstring (Anchor3,&PtrDst); ALn_CopySubstring (Anchor[2],&PtrDst);
/***** Step 3: Move forward the link (URL or nickname) /***** Step 3: Move forward the link (URL or nickname)
to be shown on screen *****/ to be shown on screen *****/
@ -257,7 +250,7 @@ void ALn_InsertLinks (char *Txt,unsigned long MaxLength,size_t MaxCharsURLOnScre
} }
/***** Step 4: Copy second part of anchor *****/ /***** Step 4: Copy second part of anchor *****/
ALn_CopySubstring (Anchor2,&PtrDst); ALn_CopySubstring (Anchor[1],&PtrDst);
/***** Step 5: Copy link into directive A /***** Step 5: Copy link into directive A
(it's mandatory to do the copy in reverse order (it's mandatory to do the copy in reverse order
@ -265,7 +258,7 @@ void ALn_InsertLinks (char *Txt,unsigned long MaxLength,size_t MaxCharsURLOnScre
ALn_CopySubstring (&Link->URLorNick,&PtrDst); ALn_CopySubstring (&Link->URLorNick,&PtrDst);
/***** Step 6: Copy first part of anchor *****/ /***** Step 6: Copy first part of anchor *****/
ALn_CopySubstring (Anchor1,&PtrDst); ALn_CopySubstring (Anchor[0],&PtrDst);
} }
} }
@ -327,9 +320,9 @@ static void ALn_FreeLinks (struct ALn_Link *LastLink)
PrevLink = Link->Prev; PrevLink = Link->Prev;
if (Link->Type == ALn_LINK_NICK) if (Link->Type == ALn_LINK_NICK)
{ {
if (Link->Nick.Anchor3.Str) free (Link->Nick.Anchor3.Str); if (Link->NickAnchor[2].Str) free (Link->NickAnchor[2].Str);
if (Link->Nick.Anchor2.Str) free (Link->Nick.Anchor2.Str); if (Link->NickAnchor[1].Str) free (Link->NickAnchor[1].Str);
if (Link->Nick.Anchor1.Str) free (Link->Nick.Anchor1.Str); if (Link->NickAnchor[0].Str) free (Link->NickAnchor[0].Str);
} }
free (Link); free (Link);
} }
@ -497,9 +490,9 @@ static ALn_LinkType_t ALn_CheckNickname (char **PtrSrc,char PrevCh,
if (Type == ALn_LINK_NICK) if (Type == ALn_LINK_NICK)
{ {
/***** Reset anchors (checked on freeing) *****/ /***** Reset anchors (checked on freeing) *****/
(*Link)->Nick.Anchor1.Str = (*Link)->NickAnchor[0].Str =
(*Link)->Nick.Anchor2.Str = (*Link)->NickAnchor[1].Str =
(*Link)->Nick.Anchor3.Str = NULL; (*Link)->NickAnchor[2].Str = NULL;
/***** Create id for this form *****/ /***** Create id for this form *****/
Gbl.Form.Num++; Gbl.Form.Num++;
@ -512,7 +505,7 @@ static ALn_LinkType_t ALn_CheckNickname (char **PtrSrc,char PrevCh,
/***** Store first part of anchor *****/ /***** Store first part of anchor *****/
Frm_SetParamsForm (ParamsStr,ActSeeOthPubPrf,true); Frm_SetParamsForm (ParamsStr,ActSeeOthPubPrf,true);
if (asprintf (&(*Link)->Nick.Anchor1.Str, if (asprintf (&(*Link)->NickAnchor[0].Str,
"<form method=\"post\" action=\"%s/%s\" id=\"%s\">" "<form method=\"post\" action=\"%s/%s\" id=\"%s\">"
"%s" // Parameters "%s" // Parameters
"<input type=\"hidden\" name=\"usr\" value=\"", "<input type=\"hidden\" name=\"usr\" value=\"",
@ -522,17 +515,17 @@ static ALn_LinkType_t ALn_CheckNickname (char **PtrSrc,char PrevCh,
Gbl.Form.Id, Gbl.Form.Id,
ParamsStr) < 0) ParamsStr) < 0)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
(*Link)->Nick.Anchor1.Len = strlen ((*Link)->Nick.Anchor1.Str); (*Link)->NickAnchor[0].Len = strlen ((*Link)->NickAnchor[0].Str);
/***** Store second part of anchor *****/ /***** Store second part of anchor *****/
if (asprintf (&(*Link)->Nick.Anchor2.Str, if (asprintf (&(*Link)->NickAnchor[1].Str,
"\">" "\">"
"<a href=\"\"" "<a href=\"\""
" onclick=\"document.getElementById('%s').submit();return false;\">", " onclick=\"document.getElementById('%s').submit();return false;\">",
Gbl.Usrs.Me.Logged ? Gbl.Form.UniqueId : Gbl.Usrs.Me.Logged ? Gbl.Form.UniqueId :
Gbl.Form.Id) < 0) Gbl.Form.Id) < 0)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
(*Link)->Nick.Anchor2.Len = strlen ((*Link)->Nick.Anchor2.Str); (*Link)->NickAnchor[1].Len = strlen ((*Link)->NickAnchor[1].Str);
/***** Store third part of anchor *****/ /***** Store third part of anchor *****/
ShowPhoto = Pho_ShowingUsrPhotoIsAllowed (&UsrDat,PhotoURL); ShowPhoto = Pho_ShowingUsrPhotoIsAllowed (&UsrDat,PhotoURL);
@ -541,14 +534,14 @@ static ALn_LinkType_t ALn_CheckNickname (char **PtrSrc,char PrevCh,
"PHOTO12x16",Pho_ZOOM, "PHOTO12x16",Pho_ZOOM,
&CaptionStr, &CaptionStr,
&ImgStr); &ImgStr);
if (asprintf (&(*Link)->Nick.Anchor3.Str, if (asprintf (&(*Link)->NickAnchor[2].Str,
"</a></form>%s%s", "</a></form>%s%s",
CaptionStr, CaptionStr,
ImgStr) < 0) ImgStr) < 0)
Err_NotEnoughMemoryExit (); Err_NotEnoughMemoryExit ();
free (ImgStr); free (ImgStr);
free (CaptionStr); free (CaptionStr);
(*Link)->Nick.Anchor3.Len = strlen ((*Link)->Nick.Anchor3.Str); (*Link)->NickAnchor[2].Len = strlen ((*Link)->NickAnchor[2].Str);
/***** Free memory used for user's data *****/ /***** Free memory used for user's data *****/
Usr_UsrDataDestructor (&UsrDat); Usr_UsrDataDestructor (&UsrDat);
@ -556,10 +549,10 @@ static ALn_LinkType_t ALn_CheckNickname (char **PtrSrc,char PrevCh,
/***** Compute number of bytes added until here *****/ /***** Compute number of bytes added until here *****/
(*Link)->AddedLengthUntilHere = (*Link)->Prev ? (*Link)->Prev->AddedLengthUntilHere : (*Link)->AddedLengthUntilHere = (*Link)->Prev ? (*Link)->Prev->AddedLengthUntilHere :
0; 0;
(*Link)->AddedLengthUntilHere += (*Link)->Nick.Anchor1.Len + (*Link)->AddedLengthUntilHere += (*Link)->NickAnchor[0].Len +
(*Link)->URLorNick.Len + (*Link)->URLorNick.Len +
(*Link)->Nick.Anchor2.Len + (*Link)->NickAnchor[1].Len +
(*Link)->Nick.Anchor3.Len; (*Link)->NickAnchor[2].Len;
/***** Create next link *****/ /***** Create next link *****/
ALn_CreateNextLink (Link,LastLink); ALn_CreateNextLink (Link,LastLink);

View File

@ -602,13 +602,14 @@ TODO: FIX BUG, URGENT! En las fechas como par
TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo. TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo.
*/ */
#define Log_PLATFORM_VERSION "SWAD 21.64 (2021-11-28)" #define Log_PLATFORM_VERSION "SWAD 21.64.1 (2021-11-28)"
#define CSS_FILE "swad21.59.css" #define CSS_FILE "swad21.59.css"
#define JS_FILE "swad21.59.js" #define JS_FILE "swad21.59.js"
/* /*
TODO: Rename CENTRE to CENTER in help wiki. TODO: Rename CENTRE to CENTER in help wiki.
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
Version 21.64.1: Nov 28, 2021 Code refactoring in link insertion. (320070 lines)
Version 21.64: Nov 28, 2021 New module swad_autolink to insert links in texts. (320076 lines) Version 21.64: Nov 28, 2021 New module swad_autolink to insert links in texts. (320076 lines)
Version 21.63: Nov 26, 2021 Fixing of corruption in test prints and match prints. (320010 lines) Version 21.63: Nov 26, 2021 Fixing of corruption in test prints and match prints. (320010 lines)
Version 21.62.3: Nov 25, 2021 Fixed bug in test questions. Reported by Javier Fernández Baldomero and Jesús González Peñalver. (319438 lines) Version 21.62.3: Nov 25, 2021 Fixed bug in test questions. Reported by Javier Fernández Baldomero and Jesús González Peñalver. (319438 lines)