এটি এখনও ম্যাকোস দ্বারা কীভাবে করা হয় তা এখনও আমার কাছে পরিষ্কার নয় তবে এর মধ্যে আমি এখানে কী করে শেষ করেছি।
আমি যে সমাধানগুলি পেয়েছি সেগুলি নিম্নলিখিত আকারের ছিল:
- উপলব্ধ সমস্ত ফন্টের একটি তালিকা পান।
- নির্বাচিত অক্ষর রয়েছে এমন ফন্টগুলি সন্ধানের জন্য তালিকার উপরে লুপ করুন।
সমস্ত ফন্ট তালিকাভুক্ত
এই প্রশ্নের হিসাবে , দুটি পন্থা রয়েছে (প্লাস তৃতীয়টি এখানে আমি পেয়েছি ):
system_profiler SPFontsDataTypeআপনি -xmlএক্সএমএলে আউটপুট পেতে যোগ করতে পারেন ,
fc-listযা কোনও প্যাটার্ন গ্রহণ করতে পারে ( :এটি হ'ল খালি প্যাটার্ন যা সমস্ত ফন্টের সাথে মেলে) এবং একটি ফর্ম্যাট স্পেসিফায়ার।
তাত্ক্ষণিকভাবে python-fontconfig, তারপরে import fontconfig; fontconfig.query()হরফ পাথগুলির একটি তালিকা পেতে চালান ।
দুটি পদ্ধতির তুলনা করা (আমি এটি তৃতীয়টি লক্ষ্য করার আগে এটি লিখেছিলাম) আকর্ষণীয়:
গতি: আমার কম্পিউটারে এবং আমার ফন্টগুলির সেটের জন্য, fc-listপ্রথমবারের মতো প্রায় 24 সেকেন্ড এবং তার পরে 0.04 সেকেন্ড সময় system_profilerলাগে , যখন ধারাবাহিকভাবে প্রতিবার প্রায় 3 সেকেন্ড সময় লাগে।
ব্যাপকতা: আমার বর্তমান সিস্টেমে system_profiler702 ফন্টের fc-listতালিকা রয়েছে যখন 770 তালিকাবদ্ধ করে: সমস্ত 702 প্লাস 68 আরও। একদিকে, system_profilerএটি "অফিসিয়াল" উপায় বলে মনে হচ্ছে এবং হরফ ফন্ট বইয়ের সাথে দেখা ফন্টগুলির সাথে মেলে, যা অক্ষর / প্রতীক দর্শকের (প্রশ্ন হিসাবে) "ফন্টের পরিবর্তনে" প্রদর্শিত হবে, টেক্সটএডিট-এ মেনু ইত্যাদি অন্যদিকে, কমপক্ষে কিছু ফন্ট যেটি মিস করে তা হ'ল প্রকৃতভাবে ব্যবহারযোগ্য ফন্ট। এর মধ্যে কেবলমাত্র 5 টি হরফ অন্তর্ভুক্ত নয় /Library/Fonts/{Athelas.ttc,Charter.ttc,Marion.ttc,Seravek.ttc,SuperClarendon.ttc}যার সম্পর্কে আপনি অনলাইনে কিছু বিভ্রান্তিকর পৃষ্ঠা খুঁজে পেতে পারেন (যেমন এটি এবং এটি ), /Library/Fonts/{DIN Alternate Bold.ttf,DIN Condensed Bold.ttf,Iowan Old Style.ttc}এবং 177 নোটো স্যানগুলির 57আমি আমার সিস্টেমে ফন্টগুলি ইনস্টল করেছি। উদাহরণস্বরূপ, আমি নোটো সান ব্রাহ্মী ইনস্টল করেছি তবে আমি ব্রাহ্মী চিঠিটি অনুসন্ধান করার সময় এই ফন্টটি ফন্ট বুক বা "ফন্টের ভেরিয়েশন" তে প্রদর্শিত হয় না, তবে এটি টেক্সটএডিটে ব্যবহৃত হয় (এবং আমারটিতে প্রদর্শিত হয়) ব্রাউজার)। এই অদ্ভুততার কারণ যাই হোক না কেন, আমি খুশি যে আমি পুরো তালিকাটি পেয়ে যেতে পারি fc-list।
সহজলভ্যতা: উভয় পদ্ধতির সাথে আউটপুট পার্সিংয়ের সামান্য বিস্তৃত প্রয়োজন। এর সাথে fc-listআমি ফর্ম্যাটটি নির্দিষ্ট করতে পারি (উদাহরণস্বরূপ fc-list --format="%{family}\n%{file}\n%{lang}\n\n"তবে ক্ষেত্রগুলির নামের জন্য আমি কোনও রেফারেন্স পাইনি!); এর সাহায্যে system_profilerআমি এক্সপিএমএলটির জন্য কেবল গ্রেপ করতে পারি Location:বা এক্সএমএল আউটপুট করতে পারি এবং এক্সএমএলকে পার্স করতে পারি ( xML.etree.ElementTree এর সাথে উদাহরণস্বরূপ , plistlib সহ )।
এই ফন্টটি এই চরিত্রটি কভার করে?
তবে আমরা হরফগুলির তালিকা পাই, তারপরে আমাদের পরীক্ষা করতে হবে একটি নির্দিষ্ট ফন্টের মধ্যে কোনও অক্ষর আবৃত আছে কিনা (নাম বা পথ দিয়ে দেওয়া)। আবার, যেভাবে আমি খুঁজে পেয়েছি:
ফ্রিটাইপ বাইন্ডিংগুলির মধ্যে একটি ব্যবহার করুন । পাইথনের জন্য, ফ্রিটাইপ- পাই রয়েছে তবে কীভাবে এটি ব্যবহার করব তা কয়েক মিনিটের মধ্যে আমি বুঝতে পারি না।
Ttx / fonttools দিয়ে ফন্টের cmap টেবিলটি ফেলে দিন , তারপরে টেবিলের উপরে লুপ করুন। এটি অবশ্যই করা সম্ভব এবং আমি এমন ব্যবহার করেছি অনেক বার ডাম্পিং (এক মাত্র পারেন ttx foo.ttfপেতে foo.ttxXML ফাইল এমনকি মানুষের পাঠযোগ্য), কিন্তু এই ব্যবহার-ক্ষেত্রে জন্য (সমস্ত ফন্ট অনুসন্ধানের), এটা ভাল নয় যেমন লাগে প্রতি ফন্টে সেকেন্ড
এর জন্য লেখা একটি লাইব্রেরি থেকে cmap টেবিলটি দেখুন: use Font::TTF::Fontপার্লে , from fontTools.ttLib import TTFontপাইথনের - এটি এমন হবে:
def has_char(font_path, c):
"""Does font at `font_path` contain the character `c`?"""
from fontTools.ttLib import TTFont
from fontTools.unicode import Unicode
try:
font = TTFont(font_path)
for table in font['cmap'].tables:
for char_code, glyph_name in table.cmap.items():
if char_code == ord(c):
font.close()
return True
except Exception as e:
print('Error while looking at font %s: %s' % (font_path, e))
pass
return False
দুর্ভাগ্যক্রমে এটি ব্যবহার করতে অনেক বেশি ফন্টে ব্যর্থ।
আপনি যদি পাইথন-ফন্টকনফিগ সমাধানটি ব্যবহার করেন তবে এর has_charমতো ব্যবহার রয়েছে:font = fontconfig.FcFont(path); return font.has_char(c)
সারাংশ
আমি এখান থেকে সমাধানটি ব্যবহার করে শেষ করেছি, যা এটিকে ন্যূনতম রাখার জন্য আমি হালকাভাবে আবার লিখেছি:
#!/usr/bin/env python
def find_fonts(c):
"""Finds fonts containing the (Unicode) character c."""
import fontconfig
fonts = fontconfig.query()
for path in sorted(fonts):
font = fontconfig.FcFont(path)
if font.has_char(c):
yield path
if __name__ == '__main__':
import sys
search = sys.argv[1]
char = search.decode('utf-8') if isinstance(search, bytes) else search
for path in find_fonts(char):
print(path)
ব্যবহারের উদাহরণ:
% python3 find_fonts.py 'ಠ'
/Library/Fonts/Arial Unicode.ttf
/Library/Fonts/Kannada MN.ttc
/Library/Fonts/Kannada MN.ttc
/Library/Fonts/Kannada Sangam MN.ttc
/Library/Fonts/Kannada Sangam MN.ttc
/System/Library/Fonts/LastResort.ttf
/Users/shreevatsa/Library/Fonts/Kedage-b.TTF
/Users/shreevatsa/Library/Fonts/Kedage-i.TTF
/Users/shreevatsa/Library/Fonts/Kedage-n.TTF
/Users/shreevatsa/Library/Fonts/Kedage-t.TTF
/Users/shreevatsa/Library/Fonts/NotoSansKannada-Bold.ttf
/Users/shreevatsa/Library/Fonts/NotoSansKannada-Regular.ttf
/Users/shreevatsa/Library/Fonts/NotoSansKannadaUI-Bold.ttf
/Users/shreevatsa/Library/Fonts/NotoSansKannadaUI-Regular.ttf
/Users/shreevatsa/Library/Fonts/NotoSerifKannada-Bold.ttf
/Users/shreevatsa/Library/Fonts/NotoSerifKannada-Regular.ttf
/Users/shreevatsa/Library/Fonts/akshar.ttf
(উভয় সঙ্গে কাজ করে python3এবং python2, যেটা pythonআপনার আছে। আমার কম্পিউটারে 29 সম্পর্কে সেকেন্ড সময় লাগে, হরফ আমি ইনস্টল করা আছে সেট এর জন্য।)