[liblouis-liblouisxml] [liblouisutdml] push by john.bo...@xxxxxxxxxxxxxxxxx - big fix for UTDML page formatting on 2012-02-22 03:57 GMT

  • From: liblouisutdml@xxxxxxxxxxxxxx
  • To: liblouis-liblouisxml@xxxxxxxxxxxxx
  • Date: Wed, 22 Feb 2012 03:58:28 +0000

Revision: 431c699d562a
Author:   John Boyer <john.boyer@xxxxxxxxxxxxxxxxx>
Date:     Tue Feb 21 19:56:39 2012
Log:      big fix for UTDML page formatting
http://code.google.com/p/liblouisutdml/source/detail?r=431c699d562a

Modified:
 /liblouisutdml/semantics.c
 /liblouisutdml/transcriber.c

=======================================
--- /liblouisutdml/semantics.c  Wed Feb  8 03:49:55 2012
+++ /liblouisutdml/semantics.c  Tue Feb 21 19:56:39 2012
@@ -1383,6 +1383,7 @@
     return latestEntry->style;
   style = malloc (sizeof (StyleType));
   memset (style, 0, sizeof (StyleType));
+  style->newline_after = 1;
   hashInsert (semanticTable, key, styleEntry, 0, NULL, style);
   return style;
 }
=======================================
--- /liblouisutdml/transcriber.c        Tue Feb 21 05:59:37 2012
+++ /liblouisutdml/transcriber.c        Tue Feb 21 19:56:39 2012
@@ -1403,14 +1403,14 @@
     length = numCells - 4;
   leadingBlanks = (numCells - length) / 2;
   trailingBlanks = numCells - leadingBlanks - length;
-      if (!insertCharacters (blanks, leadingBlanks))
-       return 0;
-      if (!insertWidechars (toCenter, length))
-       return 0;
-      if (!insertCharacters (blanks, trailingBlanks))
-       return 0;
-      if (!insertWidechars (pageNumberString, pageNumberLength))
-       return 0;
+  if (!insertCharacters (blanks, leadingBlanks))
+    return 0;
+  if (!insertWidechars (toCenter, length))
+    return 0;
+  if (!insertCharacters (blanks, trailingBlanks))
+    return 0;
+  if (!insertWidechars (pageNumberString, pageNumberLength))
+    return 0;
   return 1;
 }

@@ -1470,9 +1470,9 @@
            }
        }
       //if (lastLineInStyle && !style->newline_after)
-      {
-      if (!insertCharacters (ud->lineEnd, strlen (ud->lineEnd)))
-       return 0;
+       {
+         if (!insertCharacters (ud->lineEnd, strlen (ud->lineEnd)))
+           return 0;
        }
       if (ud->braille_pages && ud->lines_on_page == ud->lines_per_page)
        {
@@ -1965,7 +1965,8 @@
              if ((breakAt && thisRow[breakAt - 1] != *ud->lit_hyphen)
                  || wordTooLong)
                {
-                 if (!insertDubChars (ud->lit_hyphen, strlen (ud->lit_hyphen)))
+                 if (!insertDubChars
+                     (ud->lit_hyphen, strlen (ud->lit_hyphen)))
                    return 0;
                }
              finishLine ();
@@ -2140,9 +2141,9 @@
        return 0;
       availableCells -= leadingBlanks;
       if ((charactersWritten + availableCells) >= translatedLength)
-      {
-       cellsToWrite = translatedLength - charactersWritten;
-       lastLineInStyle = 1;
+       {
+         cellsToWrite = translatedLength - charactersWritten;
+         lastLineInStyle = 1;
        }
       else
        {
@@ -2948,7 +2949,7 @@
        return 0;
       if (!insertCharacters (ud->lineEnd, strlen (ud->lineEnd)))
        return 0;
-// fix this       write_outbuf ();
+      writeOutbuf ();
       ud->output_encoding = ascii8;
     }
   return 1;
@@ -3274,6 +3275,7 @@
 static char *currentTable;
 static char currentTableName[MAXNAMELEN];
 static int firstPage;
+static unsigned char pageNumberSpaces[4];
 static int postponedStart;
 static int *indices;
 static int *backIndices;
@@ -3311,6 +3313,10 @@
   backBuf = NULL;
   backLength = 0;
   lineWidth = ud->normal_line;
+  pageNumberSpaces[0] = 0xa0;
+  pageNumberSpaces[1] = 0xa0;
+  pageNumberSpaces[2] = 0xa0;
+  pageNumberSpaces[3] = 0;
   return 1;
 }

@@ -3793,25 +3799,6 @@
   brlOnlyNode = xmlAddChild (parentOfBrlOnlyNode, newNode);
   return 1;
 }
-
-static int
-shortBrlOnly (int numSpaces, const widechar * content, int length, int kind)
-{
-  widechar buf[MAXNAMELEN];
-  int k;
-  int kk = 0;
-  for (k = 0; k < numSpaces; k++)
-    if (kind == 0)
-      buf[k] = SPACE;
-    else
-      buf[k] = ' ';
-  for (; k < (numSpaces + length); k++)
-    buf[k] = content[kk++];
-  makeBrlOnlyNode ();
-  makeDotsTextNode (brlOnlyNode, buf, length, kind);
-  backTranslateBlock (parentOfBrlOnlyNode, brlOnlyNode);
-  return 1;
-}

 static int
 checkTextFragment (widechar * text, int length)
@@ -3865,6 +3852,197 @@
     return nearBottom;
   return midPage;
 }
+
+/* Handle and generate short strings that appear only in braille. */
+
+typedef struct
+{
+  widechar origText[MAXNAMELEN];
+  widechar transText[MAXNAMELEN];
+  int origTextLength;
+  int transTextLength;
+  widechar prefixedOrigText[MAXNAMELEN];
+  widechar prefixedTransText[MAXNAMELEN];
+  int prefixedOrigTextLength;
+  int prefixedTransTextLength;
+} ShortBrlOnlyStrings;
+
+static int
+setOrigTextChar (ShortBrlOnlyStrings * sbstr, unsigned char *instr, int
+                length)
+{
+  sbstr->origTextLength = sizeof (sbstr->origText) - 4;
+ utf8_string_to_wc (instr, &length, sbstr->origText, &sbstr->origTextLength);
+  sbstr->transTextLength = 0;
+  sbstr->prefixedOrigTextLength = 0;
+  sbstr->prefixedTransTextLength = 0;
+  return 1;
+}
+
+static int
+setOrigTextWidechar (ShortBrlOnlyStrings * sbstr, widechar * instr,
+                    int length)
+{
+  if (length >= MAXNAMELEN)
+    length = MAXNAMELEN - 4;
+  sbstr->origTextLength = length;
+  memcpy (sbstr->origText, instr, length * CHARSIZE);
+  sbstr->origTextLength = length;
+  sbstr->transTextLength = 0;
+  sbstr->prefixedOrigTextLength = 0;
+  sbstr->prefixedTransTextLength = 0;
+  return 1;
+}
+
+static int
+translateShortBrlOnly (ShortBrlOnlyStrings * sbstr)
+{
+  int translationLength = sbstr->origTextLength;
+  int translatedLength = sizeof (sbstr->transText);
+  int k;
+  if (!lou_translateString (currentTable, sbstr->origText,
+                           &translationLength,
+                           sbstr->transText, &translatedLength, NULL, NULL,
+                           dotsIO))
+    return 0;
+  sbstr->transText[translatedLength] = 0;
+  sbstr->transTextLength = translatedLength;
+  for (k = 0; k < translatedLength; k++)
+    if (sbstr->transText[k] == 160)
+      sbstr->transText[k] = ' ';
+  return 1;
+}
+
+static int
+addBrlOnly (xmlNode * node, ShortBrlOnlyStrings * sbstr)
+{
+  int wcLength = sbstr->origTextLength;
+  xmlChar buf[2 * MAXNAMELEN];
+  int utf8Length = sizeof (buf) - 4;
+  makeDotsTextNode (node, sbstr->prefixedTransText,
+                   sbstr->prefixedTransTextLength, 0);
+  wc_string_to_utf8 (sbstr->prefixedOrigText, &wcLength, buf, &utf8Length);
+  xmlAddPrevSibling (node, xmlNewText (buf));
+  return 1;
+}
+
+static int
+addPrefixes (ShortBrlOnlyStrings * sbstr, widechar dots, widechar
+            character, int prefixHowMany)
+{
+  int k;
+  int kk = 0;
+ for (k = 0; k < prefixHowMany && k < sizeof (sbstr->prefixedTransText); k++)
+    sbstr->prefixedTransText[k] = dots;
+  for (; k < sizeof (sbstr->prefixedTransText); k++)
+    {
+      if (k >= sbstr->transTextLength)
+       break;
+      sbstr->prefixedTransText[k] = sbstr->transText[kk++];
+    }
+  sbstr->prefixedTransTextLength = k;
+  kk = 0;
+ for (k = 0; k < prefixHowMany && k < sizeof (sbstr->prefixedOrigText); k++)
+    sbstr->prefixedOrigText[k] = character;
+  for (; k < sizeof (sbstr->prefixedOrigText); k++)
+    {
+      if (k >= sbstr->origTextLength)
+       break;
+      sbstr->prefixedOrigText[k] = sbstr->origText[kk++];
+    }
+  sbstr->prefixedOrigTextLength = k;
+}
+
+static int utd_fillPage ();
+static int makeNewline (xmlNode * parent, int start);
+static ShortBrlOnlyStrings pageNumber;
+static int
+insertPageNumber (int howMany)
+{
+  addPrefixes (&pageNumber, howMany, SPACE, ' ');
+  if (!addBrlOnly (brlOnlyNode, &pageNumber))
+    return 0;
+  return 1;
+}
+
+static int utd_fillPage ();
+
+static int
+makePageSeparator (xmlChar * printPageNumber, int length)
+{
+  ShortBrlOnlyStrings sb;
+  int k;
+  char setup[MAXNUMLEN];
+  PageStatus curPageStatus = checkPageStatus ();
+  if (!ud->print_pages || !*printPageNumber)
+    return 1;
+  strcpy (setup, " ");
+  if (!(printPageNumber[0] >= '0' && printPageNumber[0] <= '9'))
+    strcat (setup, ud->letsign);
+  strcat (setup, printPageNumber);
+  length = strlen (setup);
+  for (k = 0; k < length; k++)
+    ud->print_page_number[k] = setup[k];
+  setOrigTextChar (&sb, setup, length);
+  translateShortBrlOnly (&sb);
+  if (curPageStatus == topOfPage)
+    return 1;
+  addPrefixes (&sb, HYPHEN, '-', ud->cells_per_line - sb.transTextLength);
+  ud->print_page_number[0] = 'a';
+  if (curPageStatus == nearBottom)
+    {
+      utd_fillPage ();
+      return 1;
+    }
+  makeBrlOnlyNode ();
+  makeNewline (brlOnlyNode, 0);
+  addBrlOnly (brlOnlyNode, &sb);
+  return 1;
+}
+
+static int
+utd_getBraillePageString ()
+{
+  char brlPageString[40];
+  if (!ud->number_braille_pages)
+    {
+      pageNumber.transTextLength = 0;
+      return 1;
+    }
+  switch (ud->cur_brl_page_num_format)
+    {
+    case blank:
+      return 1;
+    default:
+    case normal:
+      sprintf (brlPageString, "%s%d", pageNumberSpaces,
+              ud->braille_page_number);
+      break;
+    case p:
+      sprintf (brlPageString, "%sp%d", pageNumberSpaces,
+              ud->braille_page_number);
+      break;
+    case roman:
+      strcpy (brlPageString, pageNumberSpaces);
+      strcat (brlPageString, ud->letsign);
+      strcat (brlPageString, makeRomanNumber (ud->braille_page_number));
+      break;
+    }
+  setOrigTextChar (&pageNumber, brlPageString, strlen (brlPageString));
+  translateShortBrlOnly (&pageNumber);
+  return 1;
+}
+
+static void
+utd_getPrintPageString ()
+{
+  char printPageString[40];
+  strcpy (printPageString, pageNumberSpaces);
+  strcat (printPageString, ud->print_page_number);
+  setOrigTextChar (&pageNumber, printPageString, strlen (printPageString));
+  translateShortBrlOnly (&pageNumber);
+  ud->print_page_number[0]++;
+}

 static int
 utd_getPageNumber ()
@@ -3873,14 +4051,14 @@
   PageStatus curPageStatus;
   int braillePageNumber = 0;
   int printPageNumber = 0;
-  pageNumberLength = 0;
+  pageNumber.transTextLength = 0;
   curPageStatus = checkPageStatus ();
   if (curPageStatus == midPage)
     return 1;
   if (curPageStatus == topOfPage)
     {
       if (ud->print_pages && ud->print_page_number_at
-         && ud->print_page_number_first[0] != '_')
+         && ud->print_page_number[0] != '_')
        {
          printPageNumber = 1;
        }
@@ -3892,7 +4070,7 @@
   else if (curPageStatus == lastLine)
     {
       if (ud->print_pages && !ud->print_page_number_at
-         && ud->print_page_number_first[0] != '_')
+         && ud->print_page_number[0] != '_')
        {
          printPageNumber = 1;
        }
@@ -3903,44 +4081,53 @@
     }
   if (ud->interpoint && !(ud->braille_page_number & 1))
     braillePageNumber = 0;
-  if (printPageNumber || braillePageNumber)
-    {
-      pageNumberString[pageNumberLength++] = ' ';
-      pageNumberString[pageNumberLength++] = ' ';
-      if (printPageNumber)
-       {
-         pageNumberString[pageNumberLength++] = ' ';
-         getPrintPageString ();
-       }
-      if (braillePageNumber)
-       {
-         pageNumberString[pageNumberLength++] = ' ';
-         getBraillePageString ();
-       }
-    }
+  if (printPageNumber)
+    utd_getPrintPageString ();
+  if (braillePageNumber)
+    utd_getBraillePageString ();
   return 1;
 }
+
+static int
+utd_centerHeadFoot (widechar * toCenter, int length)
+{
+  ShortBrlOnlyStrings sb;
+  int leadingBlanks;
+  int trailingBlanks;
+  int numCells = ud->cells_per_line - pageNumberLength;
+  setOrigTextWidechar (&sb, toCenter, length);
+  translateShortBrlOnly (&sb);
+  if (sb.transTextLength > numCells)
+    sb.transTextLength = numCells - 4;
+  leadingBlanks = (numCells - sb.transTextLength) / 2;
+  trailingBlanks = numCells - leadingBlanks - sb.transTextLength;
+  addPrefixes (&sb, leadingBlanks, SPACE, ' ');
+  addPrefixes (&pageNumber, trailingBlanks, SPACE, ' ');
+  return 1;
+}
+
+/*End of handling and generating braille-only strings*/

 int
-hasAttrValue  (xmlNode *node, char *attrName, char *value)
+hasAttrValue (xmlNode * node, char *attrName, char *value)
 {
   xmlChar *values;
   int k;
   int prevValue = 0;
-  if (node == NULL)
+  if (node == NULL)
     return 0;
   values = xmlGetProp (node, (xmlChar *) attrName);
   if (values == NULL)
     return 0;
   for (k = 0; values[k]; k++)
     if (values[k] == ' ')
-    {
-    values[k] = 0;
-    if (strcmp (&values[prevValue], value)  == 0)
-    return 1;
-    prevValue = k + 1;
-  }
-    if (strcmp (&values[prevValue], value)  == 0)
+      {
+       values[k] = 0;
+       if (strcmp (&values[prevValue], value) == 0)
+         return 1;
+       prevValue = k + 1;
+      }
+  if (strcmp (&values[prevValue], value) == 0)
     return 1;
   return 0;
 }
@@ -3959,10 +4146,10 @@
   while (curPos < translatedLength && curBrlNode != NULL)
     {
       if (hasAttrValue (curBrlNode, "modifiers", "noindex"))
-      {
-      curBrlNode = curBrlNode->_private;
-      continue;
-      }
+       {
+         curBrlNode = curBrlNode->_private;
+         continue;
+       }
       if (translatedBuffer[curPos] == ENDSEGMENT || prevSegment == 0)
        {
          int indexPos = prevSegment;
@@ -3990,58 +4177,6 @@
     }
   return 1;
 }
-
-static int utd_fillPage ();
-static int makeNewline (xmlNode * parent, int start);
-
-static int
-makePageSeparator (xmlChar * printPageNumber, int length)
-{
-  int k;
-  int kk;
-  widechar translatedBuffer[MAXNUMLEN];
-  int translatedLength = MAXNUMLEN;
-  widechar separatorLine[128];
-  char setup[MAXNUMLEN];
-  PageStatus curPageStatus = checkPageStatus ();
-  if (!ud->print_pages || !*printPageNumber)
-    return 1;
-  strcpy (setup, " ");
-  if (!(printPageNumber[0] >= '0' && printPageNumber[0] <= '9'))
-    strcat (setup, ud->letsign);
-  strcat (setup, printPageNumber);
-  length = strlen (setup);
-  translationLength = MAXNUMLEN;
-  utf8_string_to_wc (setup, &length, separatorLine, &translationLength);
-  if (!lou_translateString (ud->main_braille_table,
-                           separatorLine,
-                           &translationLength, ud->print_page_number,
-                           &translatedLength, NULL, NULL, 0))
-    return 0;
-  ud->print_page_number[translatedLength] = 0;
-  if (curPageStatus == topOfPage)
-    return 1;
-  lou_charToDots (ud->main_braille_table,
-                 ud->print_page_number, translatedBuffer,
-                 translatedLength, 0);
-  translatedBuffer[0] = HYPHEN;
-  for (k = 0; k < (ud->cells_per_line - translatedLength); k++)
-    separatorLine[k] = HYPHEN;
-  kk = 0;
-  for (; k < ud->cells_per_line; k++)
-    separatorLine[k] = translatedBuffer[kk++];
-  separatorLine[k] = 0;
-  ud->print_page_number[0] = 'a';
-  if (curPageStatus == nearBottom)
-    {
-      utd_fillPage ();
-      return 1;
-    }
-  makeBrlOnlyNode ();
-  makeNewline (brlOnlyNode, 0);
-  makeDotsTextNode (brlOnlyNode, separatorLine, ud->cells_per_line, 0);
-  return 1;
-}

 static int
 makeNewpage (xmlNode * parent)
@@ -4219,8 +4354,7 @@
        utd_fillPage ();
       else
        if (style->lines_before > 0
-           && prevStyle->lines_after == 0 && curPageStatus !=
-           topOfPage)
+           && prevStyle->lines_after == 0 && curPageStatus != topOfPage)
        {
          if (curPageStatus == nearBottom)
            utd_fillPage ();
@@ -4231,8 +4365,7 @@
   else
     {
       if (style->lines_before > 0 && prevStyle->lines_after == 0
-         && prevStyle->action != document && curPageStatus !=
-         topOfPage)
+         && prevStyle->action != document && curPageStatus != topOfPage)
        {
          if (!utd_makeBlankLines (style->lines_before, 0))
            return 0;
@@ -4311,8 +4444,7 @@
       if (cellsOnLine > 0 && pageNumberLength > 0)
        {
          cellsToWrite = ud->cells_per_line - pageNumberLength - cellsOnLine;
-         if (!shortBrlOnly (cellsToWrite, pageNumberString,
-                            pageNumberLength, 1))
+         if (!insertPageNumber (cellsToWrite))
            return 0;
        }
       else if (curPageStatus == topOfPage)
@@ -4324,8 +4456,7 @@
              if (pageNumberLength)
                {
                  cellsToWrite = ud->cells_per_line - pageNumberLength;
-                 if (!shortBrlOnly
-                     (cellsToWrite, pageNumberString, pageNumberLength, 1))
+                 if (!insertPageNumber (cellsToWrite))
                    return 0;
                }
            }
@@ -4340,8 +4471,7 @@
                {
                  horizLinePos = (ud->cells_per_line -
                                  pageNumberLength) * ud->cell_width;
-                 if (!shortBrlOnly
-                     (horizLinePos, pageNumberString, pageNumberLength, 1))
+                 if (!insertPageNumber (horizLinePos))
                    return 0;
                }
            }
@@ -4495,8 +4625,8 @@
       int lineTooLong = 0;
       availableCells = utd_startLine ();
       for (cellsToWrite = 0; cellsToWrite < availableCells; cellsToWrite++)
-       if ((charactersWritten +
-            cellsToWrite) >= translatedLength
+       if ((charactersWritten + cellsToWrite) >=
+           translatedLength
            || translatedBuffer[charactersWritten + cellsToWrite] == CR)
          break;
       if ((charactersWritten + cellsToWrite) > translatedLength)
@@ -4741,13 +4871,13 @@
       translationLength = ud->translated_length;
       translatedLength = MAX_TRANS_LENGTH;
       if (!lou_translate
-         (ud->edit_table_name, ud->text_buffer,
-          &translationLength, ud->translated_buffer,
-          &translatedLength, NULL, NULL, NULL, NULL, NULL, dotsIO))
-       {
-         lou_logPrint (
-         "edit table '%s' could not be found or contains errors",
-         ud->edit_table_name);
+         (ud->edit_table_name, ud->text_buffer, &translationLength,
+          ud->translated_buffer, &translatedLength, NULL, NULL, NULL,
+          NULL, NULL, dotsIO))
+       {
+         lou_logPrint
+           ("edit table '%s' could not be found or contains errors",
+            ud->edit_table_name);
          ud->edit_table_name = NULL;
          return 0;
        }
@@ -4898,4 +5028,3 @@
     output_xml (ud->doc);
   return 1;
 }
-
For a description of the software, to download it and links to
project pages go to http://www.abilitiessoft.com

Other related posts:

  • » [liblouis-liblouisxml] [liblouisutdml] push by john.bo...@xxxxxxxxxxxxxxxxx - big fix for UTDML page formatting on 2012-02-22 03:57 GMT - liblouisutdml