مطالب
حذف تگ‌های زاید دریافتی از متون MS-Word

یکی از مشکلاتی که من همیشه با کاربران عادی دارم بحث انتقال مطالب از Word مایکروسافت به ادیتورهای WYSWING تحت وب است. برای مثال شما سایت پویایی را درست کرده‌اید که کاربران می‌توانند مطالب آنرا ویرایش یا کم و زیاد کنند.
اگر مطلب از ابتدا در این نوع ادیتورها تایپ و آماده شود هیچ مشکلی وجود نخواهد داشت چون خروجی اکثر آنها استاندارد است، اما متاسفانه خروجی وب word بسیار مشکل‌زا است (copy/paste معمولی مطالب آن در یک ادیتور تحت وب) و خصوصا برای نمایش تایپ فارسی در وب اصلا مناسب نیست. یعنی هیچ الزامی وجود ندارد که اندازه فونت‌ها در متن نهایی نمایش داده شده در وب یکسان باشند یا خطوط در هم فرو نروند و یا عدم تناسب اندازه قلم متن صفحه با قلم استفاده شده در CSS‌ سایت (که شکل ناهماهنگ و غیرحرفه‌ای را حاصل خواهد کرد) و امثال آن. اینجاست که کار شما زیر سؤال می‌رود! "این برنامه درست کار نمیکنه! متن من به‌هم ریخته شده و امثال این"
این کاربر عادی عموما یک تایپیست است یا یک منشی که به او گفته شده است شما از امروز موظفید مطالبی را در این سایت قرار دهید. بنابراین این کاربر حتما از word استفاده خواهد کرد (برای پیش نویس مطالب). همچنین عموما هم مرورگر "سازمانی" مورد استفاده، هنوز که هنوز است همان IE6 است (در اکثر شرکت‌ها و خصوصا ادارات) و مهم نیست که الان آخرین نگارش IE یا فایرفاکس و تمام هیاهوهای مربوطه به کجا ختم شده‌اند. حتما باید سایت با IE6 هم سازگار باشد. بنابراین از برنامه IE tester غافل نشوید.
و دست آخر شما هم نمی‌توانید به کاربر عادی ثابت کنید که این خروجی وب word اصلا استاندارد نیست (حتما کار شما است که مشکل دارد نه شرکت معظم مایکروسافت!). یا اینکه به آنها بگوئید اصلا مجاز نیستید در وب همانند یک فایل word از چندین نوع قلم مختلف فارسی غیراستاندارد استفاده کنید چون ممکن است کاربری این نوع قلم مورد استفاده شما را نداشته باشد و نمایش نهایی به هم ریخته‌تر از آنی خواهد بود که شما فکرش را می‌کنید! یا اینکه با استفاده از این روش حجم نهایی صفحه حداقل 50 کیلو بایت بیشتر خواهد شد (بدلیل حجم بالای تگ‌های زاید word) و نباید کاربران دایال آپ را فراموش کرد.
مدتی در اینباره جستجو کردم و نتیجه حاصل این بود که تمامی روش‌ها به یک مورد ختم می‌شود: حذف تگ‌های غیراستاندارد word هنگام دریافت مطلب و پیش از ذخیره سازی آن در دیتابیس
یک سری از ادیتورهای متنی تحت وب مانند FCK editor این قابلیت را به صورت خودکار اضافه کرده‌اند و حتی اگر کاربر متنی را از word در آنها Paste کند پیغامی را در همین رابطه دریافت خواهد کرد (شکل زیر) و البته کاربر می‌تواند گزینه لغو یا خیر را نیز انتخاب کند و دوباره همان وضعیت قبل تکرار خواهد شد. (یا حتی دکمه مخصوص کپی از word را هم به نوار ابزار خود اضافه کرده‌اند)



برای این منظور تابع زیر تهیه شده‌است که من همواره از آن استفاده می‌کنم و تا به امروز مشکل پاسخ پس دادن به کاربران عادی را به این صورت حل کرده‌ام!
این تابع تمامی تگ‌های اضافی و غیراستاندارد word متن دریافتی از یک ادیتور WYSWING را حذف می‌کند و به این صورت متن نهایی نمایش داده شده در سایت، تابع CSS مورد استفاده در سایت خواهد شد و نه حجم بالایی از تگ‌های غیراستاندارد word. (ممکن است کاربر در ابتدا کمی جا بخورد ولی مهم نیست! سایت باید استاندارد نمایشی خودش را از CSS آن دریافت کند و نه از تگ‌های word)

using System.Text.RegularExpressions;
/// <summary>
/// Removes all FONT and SPAN tags, and all Class and Style attributes.
/// Designed to get rid of non-standard Microsoft Word HTML tags.
/// </summary>
public static string CleanMSWordHtml(string html)
{
try
{
// start by completely removing all unwanted tags
html = Regex.Replace(html, @"<[/]?(font|span|xml|del|ins|[ovwxp]:\w )[^>]*?>", "", RegexOptions.IgnoreCase);
// then run another pass over the html (twice), removing unwanted attributes
html = Regex.Replace(html, @"<([^>]*)(?:class|lang|style|size|face|[ovwxp]:\w )=(?:'[^']*'|""[^""]*""|[^\s>] )([^>]*)>", "<$1$2>", RegexOptions.IgnoreCase);
html = Regex.Replace(html, @"<([^>]*)(?:class|lang|style|size|face|[ovwxp]:\w )=(?:'[^']*'|""[^""]*""|[^\s>] )([^>]*)>", "<$1$2>", RegexOptions.IgnoreCase);
return RemoveHTMLComments(html);
}
catch
{
return html;
}
}

public static string RemoveHTMLComments(string html)
{
try
{
Regex _Regex = new Regex("((<!-- )((?!<!-- ).)*( -->))(\r\n)*", RegexOptions.Singleline);
return _Regex.Replace(html, string.Empty);
}
catch
{
return html;
}
}

متد RemoveHTMLComments را عمدا جدا قرار دادم تا مشخص‌تر باشد. پس از تمیزکاری اولیه، ممکن است دسته‌گل‌های تیم مایکروسافت به صورت کامنت باقی بمانند که باید آنها را هم تمیز کرد! :)

نظرات مطالب
DbContext pooling در EF Core 2.0
«... همچنین باید درنظر داشت که استفاده‌ی مجدد از یک Context به معنای حفظ مقادیر فیلدهای private کلاس Context سفارشی شما نیز می‌شود ... »
این مورد سبب می‌شود تا سایر پارامترهای تزریق شده‌ی به context، طول عمر singleton پیدا کنند؛ چون این context دیگر وهله سازی نخواهد شد و وابستگی‌های آن دوباره از IoC Container سیستم، درخواست مجدد نمی‌شوند. به همین جهت در این حالت، تزریق سایر پارامترها را در سازنده‌ی کلاس، ممنوع کرده‌اند تا این اشتباه را مرتکب نشوید.
اما ... می‌توان به وابستگی‌های سیستم در کلاس Context برنامه به نحو دیگری دسترسی یافت:
services.AddEntityFrameworkSqlServer();
services.AddDbContextPool<ApplicationDbContext>((serviceProvider, optionsBuilder) =>
{
   optionsBuilder.UseSqlServer("...");
   optionsBuilder.UseInternalServiceProvider(serviceProvider);
});
کار متد UseInternalServiceProvider افزودن serviceProvider برنامه به لیست سرویس‌های داخلی EF است. از این متد عموما استفاده نمی‌شود، مگر اینکه بخواهید به سرویس‌های برنامه درون context آن دسترسی پیدا کنید.
نکته‌ی مهم دیگر، ذکر صریح متد services.AddEntityFrameworkSqlServer است تا اینبار سرویس‌های EF به صورت مستقیم به serviceProvider برنامه اضافه شوند. زمانیکه UseInternalServiceProvider فراخوانی می‌شود، هنوز serviceProvider برنامه ساخته نشده‌است. به همین جهت نیاز است این متد را نیز دستی فراخوانی کنیم که در حالت متداول نیازی به آن نیست و توسط EF مدیریت می‌شود. 
پس از این تنظیمات ابتدایی، اکنون داخل context برنامه به شکل زیر می‌توان به سرویس‌های مختلف دسترسی یافت:
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.Extensions.DependencyInjection;

var siteSettings = this.GetService<IOptionsSnapshot<SiteSettings>>();
// Or
var siteSettings = this.GetInfrastructure().GetRequiredService<IOptionsSnapshot<SiteSettings>>();
نظرات مطالب
مطلع شدن از خطاهای مدیریت نشده یک برنامه ASP.Net
سلام استاد نصیری
نیما هستم همون مزاحم همیشگی.مقاله جالبی بود. من هم زمانی راجع به این موضوع تحقیق کردم. این روشی که فرمودین یه مشکلی داره و اون هم اینه که اگر میل سرور ما رو مجبور به استفاده از SSLکنه این روش جواب نمیده و باید یه پروایدر برای ارسال میل نوشت.
من نتیجه تحقیقاتم رو اینجا گذاشتم.http://www.p2p.dotnetsource.com/Default.aspx?g=posts&t=7080
افتخار میدین اگر نگاهی بندازین بهش و نظرتون رو بگین.موفق باشید
نظرات اشتراک‌ها
چرا از آنگولار به ری اکت + ری داکس سوئیچ کردم!
توی صحبت هایی که شده، اکثرا بحت تایپ اسکریپت بیان میشه، بلا شک این یک ترانس پایلر بسیار قوی و محبوب هست. ری اکت رو هم میشه با تایپ اسکریت استفاده کرد و منحصر به انگیولار نیست! این موضوع که ری اکت با چی نوشته شده و قراره ساپورتش در آینده چگونه باشه از این مبحث جداست. شما که جدی هستید ری اکت رو با تایپ اسکریپت استفاده کنید!
در ری اکت، شما به کتابخانه‌های غیر و ثالث نیازمند هستید! این در نگاه اول (که اکثر دوستان هم دارند) یک عیب شناخته میشود، در حالی که از دید یک توسعه دهنده فعال یک نقطه مثبت قوی تلقی میشود. برنامه نویسان می‌دانند که از چه چیزی استفاده کنند. در شروع کار با ری اکت مطمئن باشید که در تعدد کتابخانه‌ها گم خواهید شد ولی پس از اندکی صرف زمان، مسیر خود را پیدا خواهید کرد. لطفا لطفا با غیر قابل اعتماد خواندن کتابخانه‌های متن باز، تلاش هایی که سالیان سال است کشیده شده را زیر سوال نبرید.! شما ((( آزاد ))) هستید که از چه کتابخانه ای استفاده کنید ولی اگر انتخاب اشتباهی داشته اید مأیوس نشوید، بجای دست به دامان شرکت‌های غول بشوید جوری دیگری بیاندیشید. انتخاب‌های اشتباه احتمالی خود را روی همه موارد بسط ندهید.
ری اکت جاهای زیادی امتحان شده! ::: نمونه‌های دم دستی مثله ::: سایت فیس بوک، برنامه اینستاگرام که روی گوشی شما نصب است، اسکایب، ایمیل اوتلوک مایکروسافت (که من از این سرویس مدتهاست استفاده میکنم)، سایت هکر رنک و .... و ...   .
--- شاید شعار باشه ولی همه‌ی ما ، نفر به نفر در پیشبرد این علوم و ابزارها دخیل هستیم. اگه همه ری اکتی باشن اشتباهه! و به همین صورت اگه همه انگیولاری باشن.
مطالب
خواندنی‌های 12 تیر

اس کیوال سرور

امنیت

توسعه وب

دات نت فریم ورک

دبلیو سی اف

دبلیو پی اف و سیلور لایت

سایت‌های ایرانی

شیرپوینت

لینوکس

متفرقه

محیط‌های مجتمع توسعه

مرورگرها

مسایل انسانی، اجتماعی و مدیریتی برنامه نویسی

پی اچ پی

نظرات مطالب
تعرفه مصوب سال 1390
بحث برنامه نویس یا توسعه دهنده مثل بحث یک خیاط است. شما به خیاط می‌گید «من یک دست کت و شلوار خوب می‌خوام». این خوب بودن رو اون هست که باید تفسیر کنه. من نمی‌دونم. من خیاط نیستم؛ هرچند از دیدگاه خیاط شاید من به قول شما یک نفر بی اطلاع محض باشم! این وضع، همه جای دنیا هم به همین صورت است.
در کل این نوع حرکات، جهت انتشار حداقل حقوق برنامه نویس یا مصرف کننده بسیار مفید است. خیلی‌ از برنامه نویس‌ها حداقل حقوق خودشون رو نمی‌دونند و بی‌جهت بازار رو خراب می‌کنند. عده‌ای سودجو هم هستند که برای مثال پروژه‌های سورس باز رو با یک لایه فارسی به قیمت‌های گزافی می‌فروشند. روشن شدن یک سری از حداقل‌ها در کل به نفع جامعه است.
مطالب
بلاگ‌ها و مطالب مطالعه شده در هفته قبل (هفته اول آبان)


وبلاگ‌های ایرانی


Visual Studio

  • ویژوال استودیو 2010 و دات نت فریم ورک 4، نگارش CTP برای دریافت!

امنیت اطلاعات

ASP. Net

طراحی وب


اس‌کیوال سرور


به روز رسانی‌ها


ابزارها

سی‌شارپ
  • ویژگی‌های جدید C# 4.0 ، قسمت دوم، پارامترهای پیش فرض (یا آرگومانهای اختیاری). (چیزی شبیه به VB !! بدون نیاز به overloading برای پیاده سازی آن)

دلفی
  • ویدیویی از Delphi Prism . (نگارشی از دلفی که به شکل افزونه‌ای کاملا یکپارچه در VS.Net قابل دسترسی است)

SharePoint

ویندوز

متفرقه


اشتراک‌ها
ثبت نام مایکروسافت بیلد 2020 کاملا رایگانه

به صورت لایو و مجازی برگزار می‌شود در 19 و 20 ماه می‌مطابق با 30 و 31 اردیبهشت. برای ثبت نام می‌توانید به لینک زیر مراجعه کنید.

https://mybuild.microsoft.com/ 

امکان پرسش و پاسخ لایو هم با متخصصین فراهم شده است.

درصورتی که موفق به دیدن لایوها نشوید، رکورد شده آن‌ها نیز قابل مشاهده خواهد بود.

ثبت نام مایکروسافت بیلد 2020 کاملا رایگانه
نظرات مطالب
استفاده از Full text search توسط Entity Framework
البته دستور زیر هم لازم است اضافه شود تا در خط 71 فایل FtsInterceptor  با خطا مواجه نشوید :
static class LanguageExtensions
{
    public static bool In<T>(this T source, params T[] list)
    {
        return (list as IList<T>).Contains(source);
    }
}