Top Nguyen Blog
Tính thời gian đọc một bài viết

Tính thời gian đọc một bài viết

23 December, 2016
0 Comments
4 mins
384 words

Thông tin tổng thời gian để đọc xong bài viết giúp ích rất nhiều cho đọc giả rằng họ phải tốn bao lâu để đọc và hiểu bài của bạn ở mức cơ bản.

Một bài post của dân lập trình xoay quanh 3 yếu tố cơ bản: Câu từ, hình ảnh và code.

Sau đây Top sẽ giới thiểu cho bạn công thức đơn giản để ước tính thời gian đọc xong một bài viết dựa vào 3 yếu tố trên.

1. Số lượng từ

Trung bình một người trưởng thành có tốc độ đọc 275 từ/phút.

Để có thông tin số lượng từ trong bài viết, bạn có thể split bài viết bằng khoảng trắng rồi lấy số lượng phần tử có được.

int totalWord = contentWithoutHtmlTag.Split(' ').Length

Lưu ý nhớ xóa tất cả các tag html trước khi split.

2. Hình ảnh và Code

Trung bình một người trưởng thành có tốc độ xem 1 hình ảnh là 12 giây và code block  là 30 giây (cho các block code đơn giản và dưới 20 dòng)

Để có thông tin số lượng hình ảnh và block code trong bài viết, bạn có thể thực hiện đếm số lượng tag img và tag pre bằng javascript hoặc có thể dùng C# với Angle Sharp để parse HTML.

var parser = new HtmlParser();
var document = parser.Parse(content);
int totalImg = document.All.Count(m => m.LocalName == "img");
int totalCodeBlock = document.All.Count(m => m.LocalName == "pre");

Mong rằng đọc giả sẽ có nhiều trải nghiệm tốt hơn đến với blog của bạn.

Full code mẫu

/// <summary>
/// Get total time to read the <paramref name="content"/> in minutes
/// </summary>
/// <param name="content"></param>
/// <param name="totalWord"></param>
/// <returns></returns>
public static int GetTimeToReadInMinute(string content, out int totalWord)
{
    string contentWithoutHtml = content.RemoveHTMLTag();
    totalWord = contentWithoutHtml.Split(' ').Length;

    // average reading speed of an adult 275 word per 60s
    int totalTimeToReadInSecond = (int)Math.Ceiling((double)totalWord / 275) * 60;

    var parser = new HtmlParser();
    var document = parser.Parse(content);
    int totalImg = document.All.Count(m => m.LocalName == "img");
    int totalCodeBlock = document.All.Count(m => m.LocalName == "pre");

    // add 12 seconds for each inline image
    totalTimeToReadInSecond += totalImg * 12;

    // add 30 seconds for each code block
    totalTimeToReadInSecond += totalCodeBlock * 30;

    int totalTimeToReadInMinute = (int)Math.Ceiling((double)totalTimeToReadInSecond / 60);

    return totalTimeToReadInMinute;
}

/// <summary>
/// Remove all tag html 
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string RemoveHTMLTag(this string input)
{
    return Regex.Replace(input, "<.*?>", string.Empty);
}

Happy Coding.