Dělal jsem na tom přes 2 dny, původně jsem se chtěl vlézt do 1 dne v pohodě, ale přišlo tolik problémů a komplikací, že jsem rád i za ty 2,25 dny. 1. den jsem odstranil z HTML blogpostu skryté obrázky (skryté obrázky jsem tam dával, aby nebyly vidět v blogpostu, ale ve seznamu článků se takový skrytý obrázek zobrazoval a moje šablona Aurora když nebyl (ne) skrytý obrázek k dispozici, zobrazila zástupný obrázek), pokud nebyly v článku potřeba (to proto aby se mi tyto obrázky nenastahovaly, protože jsem už od začátku měl vše naplánované tak, že si vyexportuji posty z bloggeru, pak všechny posty projdu v mém softu BlogConverter, nahradím odkazy na obrázky v <a href="..."> nebo <img src="..."> v exportovaném souboru za adresy na doméně jepsano.net, tento soubor pak převedu do WordPress export formátu a ten naimportuji na tento blog jepsano.net).
Každopádně, ať už post měl (ne)skrytý obrázek nebo ne, uložil jsem si ho na disk pod názvem blogpostu. Pak jsem naimportoval z exportního souboru WP, přidal ke každému postu, kde jsem jeho obrázek na disku, featured image a myslel jsem že mám hotovo. Ouha, to bylo jen zdání, a začátek mých trablů. 😬
Při procházení některých příspěvků jsem zjistil, že někde mám prázdné ale přesto několika řádkové tagy <pre> – teď nevím přesně co to způsobovalo, ale můj rozum napadá jen jedna věc – prostě že obsah tagu <pre> nebyl HTML zakódovaný. Toto postihlo snad všechny tagy <pre>, nejvíce tedy s XML/HTML obsahem, ale pak i třeba C#, kde jsem pracoval s generikou. Druhý den jsem to všechno upravoval ručně, protože verbose exportní soubor Bloggeru někde chtěl mít HTML entity jako &lt; a někde jako <. 🐛
Takže když jsem třeba < převedl na &lt; tak se mi rozhodilo všechno a tak jsem druhý den strávil tím že jsem třeba vypreparoval šablonu, a všude jinde jsem toto dělal ručně. Večer, v 20h jsem se rozhodl že takhle to nedodělám nikdy a stáhl jsem si znovu čistou šablonu bloggeru. Následující ráno jsem pak v rychlosti napsal kód, který mi s exportem pracoval jako s obyčejným řetězcem, nikoliv jako s HTML pomocí HtmlAgilityPack, protože v něm jsem nemohl nahrazovat, HAP kód různě ku*vil. 🌙
Ještě navíc pořád mě zdržovalo ten 2. den že jsem musel zkompilovat a spustit program, dále kliknout na tlačítko že mám exportní soubor bloggeru, vybrat v nabídce Load, pak kliknout na složku Downloads, vybrat soubor a teprve pak kliknout, aby mi soubor zpracoval. V těch 2 dnech jsem musel řešit i menší problémy a požadavky, jako například aby se mi do exportního souboru WP neukládali posty obsahující v názvu Windows 8 Apps Control, jež všech 44 postů teď bude na mém webu. Prvně ale budu muset si udělat pořádek na svém SSD, protože pokud to neudělám, brzo mi nejspíš doslouží. Zde vidíte kolik mám obsazeného místa na SSD s OS a klasickém HDD s daty:

Taky jsem hned na začátku nedomyslel že potřebuji i odkazy na větší obrázky. Proto jsem to tam přidělával, aby se mi obrázky pod <a href="..."> taky stáhli a atribut href se nahradil, aby odkazoval na můj hosting pro blog. Abych to ukončil, nová cesta se ukázala být nejenom ta nejsnazší, ale i správná, a měl jsem velkou radost, když jsem nauploadoval export se starým blogem(1222 příspěvků) a všechno bylo tak jak to mělo být. Pokud byste se chtěli podívat jak vypadala celá ta metoda kterou jsem blogy konvertoval, dávám Vám ji tady:
public void cmdDownloadAllImages_Executed(object sender, ExecutedRoutedEventArgs e)
{
OpenBlogExport(BlogService.Blogger, @"C:\Users\Radeksunamo\Downloads\jepsano-11-27-2014-tak znovu.xml");
int seriesNumber = 0;
string targetFolder = Path.Combine(FA.GetFolder(AppFolders.Data), fromBlogService + "Images" + seriesNumber.ToString());
while (Directory.Exists(targetFolder))
{
seriesNumber++;
targetFolder = Path.Combine(FA.GetFolder(AppFolders.Data), fromBlogService + "Images" + seriesNumber.ToString());
}
string[] excludeContainingInTitle = new string[] { "Windows 8 Apps Controls"};
int imageNumber = 0;
Directory.CreateDirectory(targetFolder);
WebClient webClient = new WebClient();
//int w8AppsControls = 0;
string diacriticWithSpaces = "";
Dictionary<string, string> htmlEntityToChar = new Dictionary<string, string>();
StringBuilder stringBuilder = new StringBuilder();
foreach (var item in SH.diacritic)
{
stringBuilder.Append(item.ToString() + " ");
}
diacriticWithSpaces = stringBuilder.ToString();
string entityHtmlWithSpaces = HttpUtility.HtmlEncode(diacriticWithSpaces);
string[] chars = SH.Split(diacriticWithSpaces, " ");
string[] entities = SH.Split(entityHtmlWithSpaces, " ");
if (chars.Length != entities.Length)
{
throw new Exception("Nestejny pocet argumentu.");
}
for (int i = 0; i < chars.Length; i++)
{
htmlEntityToChar.Add(entities[i], chars[i]);
}
List<string> allAnchorDomains = new List<string>();
List<string> allImageDomains = new List<string>();
List<string> allAnchorExtensions = new List<string>();
List<string> allImageExtensions = new List<string>();
//-U vsech techto domen budu stahovat pouze jedna lis se o obrazek(tedy bude obsahovat .JPG/.jpg/.Jpg atd. + PNG, GIF, JPEG, BMP
List<string> domainsToReplaceAnchor = new List<string>(new string[] { "3.bp.blogspot.com",
"4.bp.blogspot.com",
"1.bp.blogspot.com",
"2.bp.blogspot.com",
"cl.ly",
"lh5.ggpht.com",
"lh3.ggpht.com",
"lh4.ggpht.com",
"lh6.ggpht.com",
"lh5.googleusercontent.com",
"lh3.googleusercontent.com",
"lh4.googleusercontent.com",
"lh6.googleusercontent.com",
"www.talkandroid.com",
"picasaweb.google.com",
//"sunamoblog.blogspot.com",
//"dl.dropbox.com",
"translate.googleusercontent.com"
});
List<string> domainsToReplaceImage = new List<string>(domainsToReplaceAnchor);
Dictionary<string, string> sampleUriByAnchorExtension = new Dictionary<string, string>();
Dictionary<string, string> sampleUriByImageExtension = new Dictionary<string, string>();
//int poradiObrazku = 0;
//bool zadnaNewLine = true;
//StringBuilder sb = new StringBuilder();
var blogPosts = bv.GetAllPostsButExcludeInTitle(excludeContainingInTitle);
var postCount = bv.Posts.Count;
foreach (BloggerPostModel item in blogPosts)
{
//if (item.Title.Contains())
//{
// if (item.Serie < 130 || item.Serie > 173)
// {
// int ds = 0;
// int dsf = ds;
// }
// Debug.Print(item.Serie.ToString());
// w8AppsControls++;
//}
//if (item.Title.Contains("Testovani CSS rozvrzeni pr"))
//{
//}
//var r1 = HttpUtility.HtmlDecode(item.content.nonVerbose);
//var r2 = HttpUtility.HtmlDecode(r1);
//string cPuvodni = HttpUtility.HtmlDecode(r2);
string originalContent = item.content.nonVerbose;
//string cPuvodniDecoded = HttpUtility.HtmlDecode(HttpUtility.HtmlDecode(HttpUtility.HtmlDecode(cPuvodni)));
List<int> visitedIndexes = new List<int>();
string preStartTag = "<pre class="brush:";
int searchStart = 0;
while (searchStart != -1)
{
int startIndex = originalContent.IndexOf(preStartTag, searchStart);
if(startIndex == -1)
{
searchStart = -1;
break;
}
else
{
searchStart = startIndex + preStartTag.Length;
}
int endIndex = originalContent.IndexOf("</pre", searchStart);
string sub = originalContent.Substring(searchStart + 1, endIndex);
string rep = sub.Replace("<br />", "").Replace("<br/>", "").Replace("<br>", "");
rep = HttpUtility.HtmlDecode(rep);
rep = HttpUtility.HtmlDecode(rep);
originalContent = originalContent.Replace(sub, rep);
}
HtmlParser htmlParser = new HtmlParser();
htmlParser.LoadHtml("<div>" + originalContent + "</div>");
System.Collections.Generic.List<HtmlNode> imgs = htmlParser.ReturnAllTags(htmlParser.DocumentNode, "img");
originalContent = originalContent.Replace("<span id="more-1247"></span>", "");
Dictionary<string, string> alreadyReplacedAttributeValues = new Dictionary<string, string>();
foreach (var item2 in imgs)
{
var src = HtmlHelper.GetValueOfAttribute("src", item2);
//-U obou dvou blogu na Bloggeru mi to vypsalo True
//if (src.Contains(Environment.NewLine))
//{
// zadnaNewLine = false;
//}
if (src.Trim() != "")
{
//bool pridatDoSlovniku = false;
src = src.Replace("<br />", "");
if(!alreadyReplacedAttributeValues.ContainsKey(src))
{
//pridatDoSlovniku = true;
}
else
{
//-Toto by zde nemelo nikdy nastat
continue;
}
Uri uri = null;
try
{
uri = new Uri(src);
}
catch (Exception)
{
Debug.Print("Z adresy " + src + " se nepodarilo vytvorit objekt Uri");
continue;
}
//.Replace("www.", "")
var domainLower = uri.Host.ToLower();
if(!allImageDomains.Contains(domainLower))
{
allImageDomains.Add(domainLower);
}
bool shouldReplaceImageDomain = domainsToReplaceImage.Contains(domainLower);
//domenaKteraNahradit = domenyKtereNahraditImg.Contains(domenaLower);
//domenaKteraNahradit = true;
if (shouldReplaceImageDomain)
{
var lastDotIndex = src.LastIndexOf('.');
var extension = ""; //Path.GetExtension(href);
if (lastDotIndex != -1)
{
int questionMarkIndex = src.LastIndexOf('?');
if (questionMarkIndex != -1 && questionMarkIndex > lastDotIndex)
{
extension = SH.Substring(src, lastDotIndex - 1, questionMarkIndex -1);
}
else
{
extension = src.Substring(lastDotIndex);
}
}
if (extension != "")
{
if(!allImageExtensions.Contains(extension))
{
sampleUriByImageExtension.Add(extension, src);
allImageExtensions.Add(extension);
}
if (domainsToReplaceImage.Contains(domainLower) && SH.ContainsAny(src, ".JPG", ".Jpg", ".jpg", ".PNG", ".Png", ".png", ".JPEG", ".Jpeg", ".jpeg", ".GIF", ".Gif", ".gif", ".BMP", ".Bmp", ".bmp"))
{
string fileNameWithExt = seriesNumber.ToString() + "_" + imageNumber.ToString() + extension;
var http = "http://jepsano.net/i/" + fileNameWithExt;
string contentBeforeReplace = string.Copy(originalContent);
originalContent = originalContent.Replace(src, http);
alreadyReplacedAttributeValues.Add(src, http);
if (contentBeforeReplace != originalContent)
{
//sb.AppendLine(src);
try
{
webClient.DownloadFile(src, Path.Combine(targetFolder, fileNameWithExt));
}
catch (Exception ex)
{
Debug.Print(ex.Message);
}
imageNumber++;
}
}
}
else
{
Debug.Print("Obrazek " + src + " nemel priponu");
}
}
}
//
}
//-Nahradim anchor v odkazech(a'nchors)
imgs = htmlParser.ReturnAllTags(htmlParser.DocumentNode, "a");
foreach (var item2 in imgs)
{
var href = HtmlHelper.GetValueOfAttribute("href", item2);
//-U obou dvou blogu na Bloggeru mi to vypsalo True
//if (src.Contains(Environment.NewLine))
//{
// zadnaNewLine = false;
//}
if (href.Trim() != "")
{
bool addToDictionary = false;
href = href.Replace("<br />", "");
if (!alreadyReplacedAttributeValues.ContainsKey(href))
{
//pridatDoSlovniku = true;
}
else
{
continue;
}
Uri uri = null;
try
{
uri = new Uri(href);
}
catch (Exception)
{
Debug.Print("Z adresy " + href + " se nepodarilo vytvorit objekt Uri");
continue;
}
//.Replace("www.", "")
var domainLower = uri.Host.ToLower();
if(!allAnchorDomains.Contains(domainLower))
{
allAnchorDomains.Add(domainLower);
}
bool nahradit = domainsToReplaceAnchor.Contains(domainLower);
//nahradit = true;
if (nahradit)
{
var lastDotIndex = href.LastIndexOf('.');
var extension = ""; //Path.GetExtension(href);
if (lastDotIndex != -1)
{
int questionMarkIndex = href.LastIndexOf('?');
if (questionMarkIndex != -1 && questionMarkIndex > lastDotIndex)
{
extension = SH.Substring(href, lastDotIndex - 1, questionMarkIndex-1);
}
else
{
extension = href.Substring(lastDotIndex);
}
}
if (extension != "")
{
if (!allAnchorExtensions.Contains(extension))
{
sampleUriByAnchorExtension.Add(extension, href);
allAnchorExtensions.Add(extension);
}
if (domainsToReplaceAnchor.Contains(domainLower) || SH.ContainsAny(href, ".JPG", ".Jpg", ".jpg", ".PNG", ".Png", ".png", ".JPEG", ".Jpeg", ".jpeg", ".GIF", ".Gif", ".gif", ".BMP", ".Bmp", ".bmp"))
{
string fileNameWithExt = seriesNumber.ToString() + "_" + imageNumber.ToString() + extension;
var http = "http://jepsano.net/i/" + fileNameWithExt;
string contentBeforeReplace = string.Copy(originalContent);
originalContent = originalContent.Replace(href, http);
if (contentBeforeReplace != originalContent)
{
//sb.AppendLine(src);
try
{
webClient.DownloadFile(href, Path.Combine(targetFolder, fileNameWithExt));
}
catch (Exception ex)
{
Debug.Print(ex.Message);
}
imageNumber++;
}
}
}
else
{
Debug.Print("Odkaz " + href + " nemel priponu");
}
}
}
//
}
foreach (var item4 in htmlEntityToChar)
{
if (originalContent.Contains(item4.Key))
{
originalContent = originalContent.Replace(item4.Key, item4.Value);
}
if (item.Title.Contains(item4.Key))
{
item.Title = item.Title.Replace(item4.Key, item4.Value);
}
}
//-Odeberu pocatecni a koncovy div
//-.Substring(5, cPuvodni.Length - 11)
item.content.nonVerbose = originalContent;
}
Debug.Print("VSECHNY DOMENY IMG");
foreach (var item in allImageDomains)
{
Debug.Print(""" + item + "",");
}
Debug.Print(Environment.NewLine);
Debug.Print(Environment.NewLine);
Debug.Print("VSECHNY DOMENY ANCHOR");
foreach (var item in allAnchorDomains)
{
Debug.Print(""" + item + "",");
}
Debug.Print(Environment.NewLine);
Debug.Print(Environment.NewLine);
Debug.Print("VSECHNY PRIPONY IMG");
foreach (var item in allImageExtensions)
{
Debug.Print(""" + item + "",");
Debug.Print("Uri: " + sampleUriByImageExtension[item]);
}
Debug.Print(Environment.NewLine);
Debug.Print(Environment.NewLine);
Debug.Print("VSECHNY PRIPONY ANCHOR");
foreach (var item in allAnchorExtensions)
{
Debug.Print(""" + item + "",");
Debug.Print("Uri: " + sampleUriByAnchorExtension[item]);
}
Debug.Print(Environment.NewLine);
Debug.Print(Environment.NewLine);
cmdSaveAllPostsAsBlogServiceExportFile_Executed2(excludeContainingInTitle);
NewStatus("Vsechny obrazky byly stazeny a s nimi byl vytvoren soubor exportu.");
//NewStatus(zadnaNewLine.ToString());
}Teď jdu předělat ty posty Windows 8 Apps Controls na svůj web sunamo.cz a pak oba 2 blogy na bloggeru smažu :).
EDIT den poté (29.11.2014):
Protože jsem zjistil že se mi nezobrazují korektně ukázky kódu, musel jsem to celé znovu měnit, mazat a uploadovat. Ale zatím těch několik stránek s různými jazyky snippetů jedou, takže by to snad mělo jet všechno :).
Taky jsou zaplněné všechny obrázky, od 0 do 1101 u starého blogu a podobně i u nového. Předtím když aplikace narazila na obrázek s chybou 404, nestáhla jej ale počítadlo obrázků bylo inkrementováno.