Blink তৈরির গল্প: টাফের জন্য একটি ডকুমেন্টেশন স্ক্র্যাপার

প্রোগ্রামিং কন্টেস্টে এমন কিছু অনন্য চ্যালেঞ্জ থাকে যেগুলো সমাধানে সৃজনশীল পদ্ধতির দরকার হয়। আমাদের কম্পিটিটিভ প্রোগ্রামিং প্ল্যাটফর্ম Toph-কে যখন কন্টেস্ট চলাকালে প্রোগ্রামিং ভাষার ডকুমেন্টেশনে অফলাইন অ্যাক্সেস দেওয়ার প্রয়োজন হলো, তখন বিদ্যমান সমাধানগুলো আমাদের নির্দিষ্ট চাহিদা পূরণ করতে পারছিল না। এই প্রয়োজন থেকেই তৈরি হয় Blink — প্রোগ্রামিং ভাষার ডকুমেন্টেশন স্ক্র্যাপ ও মিরর করার জন্য একটি বিশেষায়িত টুল।

Blink: Toph's Documentation Scraper

সমস্যা

কম্পিটিটিভ প্রোগ্রামিং কন্টেস্ট, বিশেষত অন-সাইট ইভেন্টগুলো, কঠোর নেটওয়ার্ক বিধিনিষেধের মধ্যে পরিচালিত হয়। অংশগ্রহণকারীরা সাধারণত শুধু কন্টেস্ট প্ল্যাটফর্ম (toph.co) এবং সংশ্লিষ্ট সার্ভিসগুলোতে অ্যাক্সেস পান। কিন্তু কোড লিখতে হলে প্রতিযোগীদের প্রোগ্রামিং ভাষার রেফারেন্স ও ডকুমেন্টেশন দরকার হয়।

devdocs.io-এর মতো চমৎকার সমাধান থাকলেও সেগুলো টাফের নির্দিষ্ট প্রয়োজনীয়তার সাথে পুরোপুরি মিলছিল না। বিশেষত, devdocs.io-এর জন্য Ruby ব্যাকএন্ড দরকার, যা ডেপ্লয়মেন্ট জটিল করে — আর কিছু বিষয় কনফিগার করার সুযোগও সীমিত।

সমাধান: একটি কাস্টম পদ্ধতি

Blink ডকুমেন্টেশন স্ক্র্যাপিংয়ে একটি লক্ষ্যভিত্তিক পদ্ধতি অনুসরণ করে, বিশেষভাবে কন্টেস্ট পরিবেশের কথা মাথায় রেখে তৈরি। Go দিয়ে নির্মিত এই টুলটি সম্পূর্ণ স্ট্যাটিক সাইট তৈরি করে, যা টাফ কোনো অতিরিক্ত অবকাঠামো ছাড়াই সার্ভ করতে পারে।

আর্কিটেকচার পরিচিতি

Blink একটি পাইপলাইন আর্কিটেকচার অনুসরণ করে, যার তিনটি প্রধান অংশ:

  • ক্রলার
  • প্রসেসিং পাইপলাইন
  • স্ট্যাটিক সাইট জেনারেশন

১. ক্রলার

Blink দুই ধরনের ক্রলার সাপোর্ট করে:

  • ওয়েব ক্রলার: লাইভ ওয়েবসাইট স্ক্র্যাপ করতে Colly ব্যবহার করে
  • ফাইলসিস্টেম ক্রলার: ডাউনলোড করা ডকুমেন্টেশন আর্কাইভ প্রসেস করে (যেমন Python-এর HTML ডকস)

নিচের উদাহরণে একটি বেস URL থেকে শুরু করে নির্দিষ্ট ফিল্টার ও অনুমোদিত ডোমেইনের মধ্যে লিংক অনুসরণ করার জন্য ক্রলার সেটআপ করা হয়েছে:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
return site.New(
	"com.cppreference/c",
	web.New(
		baseURL,
		web.AllowedDomains("en.cppreference.com"),
		web.URLFilters(urlFilters...),
		web.DisallowedURLFilters(disallowedURLFilters...),
		web.DisallowedPaths(disallowedPaths...),
	),
	pipe.New(
		pipe.Filters(

২. প্রসেসিং পাইপলাইন

পাইপলাইন সিস্টেম স্ক্র্যাপ করা পেজগুলোকে পরিষ্কার, স্যানিটাইজড এবং মিনিমাল HTML-এ রূপান্তরিত করে।

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
	web.DisallowedPaths(disallowedPaths...),
),
pipe.New(
	pipe.Filters(
		pipe.DefaultMeta(),  // পেজের শিরোনাম বের করে
		pipe.SanitizeHTML(), // সব link, style ও script এলিমেন্ট সরিয়ে দেয়
		Marks(),             // পেজের মূল বিষয়গুলো বুকমার্ক হিসেবে বের করে
		Meta(),              // পেজ থেকে অতিরিক্ত মেটাডেটা বের করে
		CleanHTML(),         // HTML কন্টেন্ট পরিষ্কার করে
		pipe.Container("#content"),
		pipe.RewriteURLs(    // URL গুলো বেস URL-এর সাপেক্ষে আপেক্ষিক করে
			"com.cppreference/c",
			baseURL,
		).
			WithURLFilters(urlFilters...).
			WithDisallowedURLFilters(disallowedURLFilters...).
			WithDisallowedPaths(disallowedPaths...),
		pipe.CleanClassName().
			WithPreserveClasses(
				"t-dcl-begin",
				"t-dsc-header",
				"t-mark-rev",
				"t-li1",
			),
		pipe.CleanStyle(),
		pipe.SyntaxHighlight(),

		pipe.If(pipe.IsURL(baseURL)). // শর্তসাপেক্ষ পাইপলাইন নিয়ম
			Then(
				Heading("C Programming Language"),
			),
	),
),
site.TrimPathPrefix("/w/c"),
site.Title("C Reference"),

মূল পাইপলাইন ফিল্টারগুলো:

  • HTML স্যানিটাইজেশন: অপ্রয়োজনীয় এলিমেন্ট ও স্ক্রিপ্ট সরিয়ে দেয়
  • কন্টেন্ট এক্সট্র্যাকশন: নির্দিষ্ট পেজ সেকশনে মনোযোগ দেয় (যেমন #content)
  • URL রিরাইটিং: অফলাইন পরিবেশে লিংক কার্যকর রাখে
  • সিনট্যাক্স হাইলাইটিং: Chroma ব্যবহার করে কোড হাইলাইট যোগ করে
  • স্টাইল ক্লিনআপ: গুরুত্বপূর্ণ স্টাইলিং বজায় রেখে অপ্রয়োজনীয় CSS সরিয়ে দেয়

৩. স্ট্যাটিক সাইট জেনারেশন

স্ক্র্যাপার সম্পূর্ণ স্ট্যাটিক সাইট স্ট্রাকচার তৈরি করে। সব জেনারেট করা HTML ফাইলে মেটাডেটার জন্য ফ্রন্টম্যাটার সেকশন থাকে। Blink HTML মিনিফাইও করে যাতে ফাইল আকারে ছোট থাকে।

এছাড়াও এটি একটি site.json ফাইল তৈরি করে, যেখানে সাইট-নির্দিষ্ট মেটাডেটা ও সব এক্সট্র্যাক্ট করা মার্কের ডেটা স্ট্রাকচার থাকে। এই ফাইলটি ক্রলের সময় আবিষ্কৃত রিডাইরেক্টগুলোও ট্র্যাক করে।

বাস্তবায়নের বিবরণ

স্মার্ট কন্টেন্ট প্রসেসিং

Blink বুদ্ধিমান কন্টেন্ট ফিল্টারিং প্রয়োগ করে। যেমন, C ডকুমেন্টেশন স্ক্র্যাপ করার সময় এক্সপেরিমেন্টাল ফিচার ও পুরনো কন্টেন্ট বাদ দেওয়া হয়, কারণ সেগুলো প্রোগ্রামিং কন্টেস্টে প্রাসঙ্গিক নয়।

নমনীয় সার্ভিং

Blink-এ একটি বিল্ট-ইন সার্ভার টুল আছে যা স্ক্র্যাপ করা ডকুমেন্টেশন দ্রুত দেখার সুযোগ দেয় — ডেপ্লয়মেন্টের আগে দ্রুত পরীক্ষা বা নতুন ডকুমেন্টেশন সোর্স ইন্টিগ্রেট করার সময় ডিবাগিংয়ের জন্য।

টুলটি Pico CSS ব্যবহার করে পরিষ্কার, মিনিমাল স্টাইলিংয়ের জন্য, যা ডকুমেন্টেশন কন্টেন্ট থেকে মনোযোগ সরায় না।

ইনক্রিমেন্টাল আপডেট

Blink অপ্রয়োজনীয় কাজ এড়াতে চালাক পদ্ধতি ব্যবহার করে। এটি জেনারেট করা কন্টেন্ট বিদ্যমান ফাইলের সাথে তুলনা করে অপরিবর্তিত পেজ এড়িয়ে যায়।

এতে একটি ফাইল-ভিত্তিক বিল্ট-ইন ক্যাশও আছে, যা ক্রলার ইতোমধ্যে স্ক্র্যাপ করা পেজের জন্য ডকুমেন্টেশন সোর্সে আবার অনুরোধ পাঠানো এড়াতে ব্যবহার করে।

কেন এই পদ্ধতি কাজ করে

কন্টেস্টের জন্য ডকুমেন্টেশন সেটআপ করা সহজ। যেকোনো ওয়েব সার্ভার out/ ডিরেক্টরিতে জেনারেট করা স্ট্যাটিক ফাইল সার্ভ করতে পারে।

টাফ এটি সরাসরি কন্টেস্ট অ্যারেনায় সার্ভ করে:

১. স্ট্যাটিক আউটপুট: কন্টেস্ট চলাকালে কোনো বাহ্যিক ওয়েবসাইট নির্ভরতা নেই ২. সীমিত পরিধি: শুধু প্রয়োজনীয় ডকুমেন্টেশন অন্তর্ভুক্ত ৩. দ্রুত প্রসেসিং: Go-এর পারফরম্যান্স দ্রুত আপডেট সম্ভব করে ৪. পরিষ্কার কন্টেন্ট: অপ্রয়োজনীয় অংশ ও নেভিগেশন জঞ্জাল সরিয়ে দেয় ৫. অফলাইন ফার্স্ট: সম্পূর্ণ ইন্টারনেট সংযোগ ছাড়াও সব কাজ করে

বর্তমান সাপোর্ট

এই ব্লগ পোস্ট লেখার সময় Blink নিম্নলিখিতগুলো প্রসেস করে:

  • C/C++ রেফারেন্স: cppreference.com থেকে
  • Go ডকুমেন্টেশন: টুলচেইনের সাথে প্যাকেজড ডকস থেকে
  • Python ডকুমেন্টেশন: অফিসিয়াল Python ডকস আর্কাইভ থেকে

মডুলার আর্কিটেকচার নতুন সাইট কনফিগারেশন তৈরির মাধ্যমে নতুন ডকুমেন্টেশন সোর্স যোগ করা সহজ করে।

ফলাফল

কন্টেস্ট পরিবেশের একটি নির্দিষ্ট প্রয়োজন থেকে শুরু হয়ে তৈরি হয়েছে একটি নমনীয়, দ্রুত ডকুমেন্টেশন স্ক্র্যাপার। Blink প্রমাণ করে যে একটি নিশ সমস্যার সেরা সমাধান কখনো কখনো বিদ্যমান সমাধানকে মানিয়ে নেওয়ার চেয়ে উদ্দেশ্যমুখী একটি নতুন টুল তৈরি করা।

কম্পিটিটিভ প্রোগ্রামিং আয়োজকদের এবং যে কেউ পরিষ্কার, অফলাইন ডকুমেন্টেশন মিরর চান তাদের জন্য Blink একটি হালকা বিকল্প — যা অপ্রয়োজনীয় জটিলতা ছাড়াই কাজটি সম্পন্ন করে।