r23996 by craig - Markdown importer: implement support for lists and numbered lists

scribus-commit scribus-commit at lists.scribus.net
Mon Aug 24 20:12:25 UTC 2020


Author: craig
Date: Mon Aug 24 20:12:25 2020
New Revision: 23996

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=23996
Log:
Markdown importer: implement support for lists and numbered lists

Modified:
    trunk/Scribus/scribus/plugins/gettext/markdownim/markdownim.cpp

Modified: trunk/Scribus/scribus/plugins/gettext/markdownim/markdownim.cpp
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=23996&path=/trunk/Scribus/scribus/plugins/gettext/markdownim/markdownim.cpp
==============================================================================
--- trunk/Scribus/scribus/plugins/gettext/markdownim/markdownim.cpp	(original)
+++ trunk/Scribus/scribus/plugins/gettext/markdownim/markdownim.cpp	Mon Aug 24 20:12:25 2020
@@ -19,6 +19,7 @@
 #include <QTextCharFormat>
 #include <QTextDocument>
 #include <QTextFrameFormat>
+#include <QTextList>
 #include <QTextListFormat>
 
 #include "prefsmanager.h"
@@ -91,22 +92,26 @@
 	m_item->itemText.clear();
 	m_item->itemText.setDefaultStyle(defaultParagraphStyle);
 
+	int listStyleCount=1;
+	int listCounter=1;
 	int blockCount = m_importedText.blockCount();
+	QString listStyleName;
 	for (int i = 0; i < blockCount; i++)
 	{
 		QTextBlock curblk = m_importedText.findBlockByNumber(i);
 		if (!curblk.isValid())
 			continue;
+		QTextBlockFormat tbf = curblk.blockFormat();
 		styleApplicationList.clear();
 		currentParagraphStyle = defaultParagraphStyle;
 		if (!m_textOnly)
 		{
-			//Check for and create Heading styles
+			//Headings, find and then create styles
 			int headingLevel = curblk.blockFormat().headingLevel();
 			if (headingLevel > 0)
 			{
-				QString headingName=QString("Heading %1").arg(headingLevel);
-				if (!newParaStyleSet.contains(headingName))
+				QString headingStyleName=QString("Heading %1").arg(headingLevel);
+				if (!newParaStyleSet.contains(headingStyleName))
 				{
 					ParagraphStyle newParaStyle;
 					newParaStyle.setParent(CommonStrings::DefaultParagraphStyle);
@@ -116,15 +121,74 @@
 					QString styleName;
 					if (m_prefixName)
 						styleName=m_item->itemName() + "_";
-					styleName+=headingName;
+					styleName+=headingStyleName;
 					newParaStyle.setName(styleName);
 					newParaStyleSet.create(newParaStyle);
 					currentParagraphStyle = newParaStyle;
 				}
 				else
-					currentParagraphStyle = newParaStyleSet.get(headingName);
-			}
-
+					currentParagraphStyle = newParaStyleSet.get(headingStyleName);
+			}
+
+			//List items
+			if (curblk.textList()!=nullptr)
+			{
+				QTextListFormat tlf = curblk.textList()->format();
+				if (listCounter==1)
+				{
+					listStyleName=QString("List %1").arg(listStyleCount);
+					if (tlf.style() == QTextListFormat::ListDecimal)
+						listStyleName.prepend("Numbered ");
+					if (!newParaStyleSet.contains(listStyleName))
+					{
+						listStyleCount++;
+						ParagraphStyle newParaStyle;
+						newParaStyle.setParent(CommonStrings::DefaultParagraphStyle);
+						newParaStyle.setLineSpacingMode(ParagraphStyle::AutomaticLineSpacing);
+						newParaStyle.setContext(m_item->itemText.defaultStyle().context());
+						switch (tlf.style())
+						{
+							case QTextListFormat::ListDisc:
+								newParaStyle.setBulletStr(QChar(0x2022));
+								newParaStyle.setHasBullet(true);
+								break;
+							case QTextListFormat::ListCircle:
+								newParaStyle.setBulletStr(QChar(0x2022));
+								newParaStyle.setHasBullet(true);
+								break;
+							case QTextListFormat::ListSquare:
+								newParaStyle.setBulletStr(QChar(0x25A0));
+								newParaStyle.setHasBullet(true);
+								break;
+							case QTextListFormat::ListDecimal:
+								newParaStyle.setHasNum(true);
+								break;
+							case QTextListFormat::ListLowerAlpha:
+							case QTextListFormat::ListUpperAlpha:
+							case QTextListFormat::ListLowerRoman:
+							case QTextListFormat::ListUpperRoman:
+							case QTextListFormat::ListStyleUndefined:
+								break;
+						}
+						QString styleName;
+						if (m_prefixName)
+							styleName=m_item->itemName() + "_";
+						styleName+=listStyleName;
+						newParaStyle.setName(styleName);
+						newParaStyleSet.create(newParaStyle);
+						currentParagraphStyle = newParaStyle;
+					}
+				}
+				else
+					currentParagraphStyle = newParaStyleSet.get(listStyleName);
+				if (listCounter++==curblk.textList()->count())
+					listCounter=1;
+			}
+			//Process all fragments of the text block to find different formats within. Create a structure
+			//of where and what style was applied
+			//Strikethrough
+			//Bold
+			//Italic
 			for (QTextBlock::iterator it = curblk.begin(); !(it.atEnd()); ++it)
 			{
 				QTextFragment currentFragment = it.fragment();
@@ -140,15 +204,18 @@
 						QString styleName;
 						if (m_prefixName)
 							styleName=m_item->itemName() + "_";
-						StyleFlag s(cs.effects());
+
+						//Strikethrough
 						if (cf.fontStrikeOut())
 						{
+							StyleFlag s(cs.effects());
 							charFormatFound = true;
 							styleName+="Strikethrough";
 							cs.setName(styleName);
 							s |= ScStyle_Strikethrough;
 							cs.setFeatures(s.featureList());
 						}
+
 						//Bold and Italic
 						bool isBold = cf.fontWeight() == QFont::Bold;
 						bool isItalic = cf.fontItalic();
@@ -164,28 +231,19 @@
 							if (!family.isEmpty())
 							{
 								QStringList slist = PrefsManager::instance().appPrefs.fontPrefs.AvailFonts.fontMap[family];
-								if (isBold)
-								{
-									if (isItalic)
-									{
-										if (slist.contains("Bold Italic"))
-											cs.setFont(PrefsManager::instance().appPrefs.fontPrefs.AvailFonts[family + " Bold Italic"]);
-									}
-									else if (slist.contains("Bold"))
-										cs.setFont(PrefsManager::instance().appPrefs.fontPrefs.AvailFonts[family + " Bold"]);
-								}
-								else
-								{
-									if (isItalic)
-									{
-										if (slist.contains("Italic"))
-											cs.setFont(PrefsManager::instance().appPrefs.fontPrefs.AvailFonts[family + " Italic"]);
-									}
-									else if (slist.contains("Regular"))
-										cs.setFont(PrefsManager::instance().appPrefs.fontPrefs.AvailFonts[family + " Regular"]);
-								}
+								if (isBold && isItalic && slist.contains("Bold Italic"))
+									cs.setFont(PrefsManager::instance().appPrefs.fontPrefs.AvailFonts[family + " Bold Italic"]);
+								if (isBold && !isItalic && slist.contains("Bold"))
+									cs.setFont(PrefsManager::instance().appPrefs.fontPrefs.AvailFonts[family + " Bold"]);
+								if (!isBold && isItalic && slist.contains("Italic"))
+									cs.setFont(PrefsManager::instance().appPrefs.fontPrefs.AvailFonts[family + " Italic"]);
+//								if (!isBold && !isItalic && slist.contains("Regular"))
+//									cs.setFont(PrefsManager::instance().appPrefs.fontPrefs.AvailFonts[family + " Regular"]);
 							}
 						}
+						
+				
+						//If we found a character formatted then record the generated character style
 						if (charFormatFound)
 						{
 							newCharStyleSet.create(cs);
@@ -199,13 +257,14 @@
 				}
 			}
 		}
-
-		ParagraphStyle paraStyle;
-		paraStyle.setParent(currentParagraphStyle.name());
+		//Insert our text and a paragraph separator
 		m_item->itemText.insertChars(m_item->itemText.length(), curblk.text());
 		m_item->itemText.insertChars(m_item->itemText.length(), SpecialChars::PARSEP);
+		//If we are not just inserting the text, apply a paragraph style and the character styles based on the positions we recorded earlier
 		if (!m_textOnly)
 		{
+			ParagraphStyle paraStyle;
+			paraStyle.setParent(currentParagraphStyle.name());
 			m_item->itemText.applyStyle(m_item->itemText.length() - 1, paraStyle);
 			for (int i = 0; i < styleApplicationList.size(); ++i)
 			{




More information about the scribus-commit mailing list