Fa:Semi-colon value separator
گاهی اوقات نویسهٔ سِمیکالن (semi-colon) یا نقطهویرگول لاتین (یعنی نویسهٔ ;) را در مقدار تگها بهکار میبریم. این کار زمانی لازم میشود که بخواهیم به یک عنصر، یک کلید با چند مقدار بدهیم.
نکتهٔ شایان توجه این که تنها شمار اندکی از نرمافزارهای تخصصی مقدارهای چندتایی جداشده با سمیکالن را پشتیبانی میکنند، تازه آن هم برای چند تگ محدود و نه همهٔ تگها. بیشتر ابزارهای OSM، پرداختگرهای نقشه (map renderer)، taginfo و XAPI این مقدارها را پشتیبانی نمیکنند. برخی از آنها فقط اولین مقدار این سلسلهٔ مقادیر را میخوانند اما اکثرشان کل عبارت (یعنی مقدارها و سمیکالنها) را یک مقدار تکی در نظر میگیرند، بنابراین این مقادیر از نتایج جستجو و خروجی ابزارها میافتد و هیچوقت روی نقشه رسم نمیشود.
نمونههای کاربرد
- برچسب ref=B500;B550 برای تکهای از راه که دو شمارهٔ رفرنس B500 و B550 را میگیرد. این کار را فقط وقتی انجام دهید که یک تکهٔ واحد از راه هر دو مقدار را بگیرد.
توجه: اگر در نقطهای از این تکهٔ راه، یک ref به ref دیگری تغییر میکند، این روش، راهِ درست انجام کار نیست. در این حالت باید در آن نقطه یک گره ایجاد کنید و راه را از آنجا به دو نیم تقسیم کنید.
- برای برخی برچسبهای غیراصلی از گروه properties، دادن چند مقدار مناسب است. مثلا هنگام ثبت یک فروشگاه مربوط به خودرو میتوانید این برچسب را ثبت کنید: service=dealer;tyres;repair. این مورد در صفحهٔ برچسب Tag:shop=car نیز آمده است.
- برای مقدارهای پیچیدهای که نوشتن آنها با زیرکلیدها ممکن نباشد (مخصوصا زمانی که فهرستی نامرتب از اقلام تشکیل بدهند) از سمیکالن استفاده میکنیم: opening_hours=Tu-Fr 08:00-18:00;Mo 09:00-18:00;Sa 09:00-12:00;closed Aug
چهوقت استفاده نکنیم
بهطور کلی تا حد ممکن از مقادیر جداشده با سمیکالن (;) بپرهیزید. اگر راههای بهتری برای نمایش اشیا وجود دارد، از این روش استفاده نکنید و برای آنها پیشنهاده ایجاد نکنید. زیرا استفاده از سمیکالن بهعنوان جداکننده با هدف سادگی برای مشارکتکنندگان (نقشهکشها) و کابران دادهها در تضاد است. برای راحتی مشارکتکنندگان تازهوارد و هر کسی که میخواهد از دادهها استفاده کند (کسانی که نرمافزارهای پرداخت(render) نقشه، جستوجوی نقشه، برنامههای موبایلی مثل «کافههای نزدیک من» و... را تولید میکنند) باید تا حد امکان مقدارهایی را که حاوی نویسههای خاص هستند کاهش دهیم.
بهخصوص، باید تا حد ممکن در برچسبهای «سطح بالا» (یعنی برچسبهایی که چیستی یک عنصر را مشخص میکنند و مهم هستند) از مقادیر جداشده با سمیکالن بپرهیزیم.
در شرایطی که به چندین مقدار نیاز داریم، چند روش جایگزین سمیکالن وجود دارد:
- یکی از مقدارها را انتخاب کنید. مقدار اساسی و چیره را برگزینید و استفاده کنید. مثال: میخواهید جایی را ثبت کنید که هم کافه است و هم بستنیفروشی. خیلی مفیدتر خواهد بود اگر فقط یکی از برچسبهای amenity=cafe یا amenity=ice_cream را انتخاب کنید. (برچسبهای cafe و ice_cream را بررسی کنید و یکی را انتخاب کنید. آیا کافه بودن میچربد یا بستنیفروشی؟). ثبت آن بهشکل amenity=cafe;ice_cream اصلا ایدهٔ خوبی نیست.
- آن عنصر را دو تا کنید. اشیا را به ویژگیهای مجزا از هم تبدیل کنید و هر کدام را جداگانه با برچسب عادی خودش ثبت کنید. مثال: میخواهید کتابخانهای را ثبت کنید که یک کافه هم دارد؟ یک گره برای کافه ایجاد کنید و تگ مناسب به آن بدهید. یک گره هم برای کتابخانه ایجاد کنید و تگ مناسب به آن بدهید. اگر کتابخانه بزرگ است میتوانید آن را با یک محدوده مشخص کنید. ثبت آن بهشکل amenity=library;cafe اصلا ایدهٔ خوبی نیست.
در هر دو مثال بالا، اگر از سمیکالن برای مقدار amenity استفاده کنید، در این صورت این مکان در آن برنامهٔ موبایلی «کافههای نزدیک من» نشان داده نمیشود، حداقل به این زودیها نشان داده نمیشود.
با وجود آنکه تجزیهٔ چنین عبارتهایی بهوسیلهٔ برنامهها کاملا امکانپذیر است (یعنی کلمهها را بر اساس نویسهٔ ; از هم تفکیک کنند) اما بیشتر برنامهها این کار را نمیکنند.
جزئیات دستوری
افزودن یک فاصله
معمولا مقدارهای جداشده با سمیکالن را بدون هیچگونه فاصلهٔ اضافی پشت سر هم مینویسیم (مثال: ref=B500;B550)، اما میتوانیم بعد از هر ; یک فاصله اضافه کنیم (مثال: ref=B500; B550). این کار را مخصوصا هنگام نوشتن ساعتهای کاری انجام میدهیم.
گریز با ';;'
اگر در مقدار یک کلید واقعا خود سمیکالن (;) وجود داشته باشد آن را بهصورت دو تا سمیکالن متوالی (;;) بنویسید. این راهکار با اصطلاح نویسهٔ گریز شناخته میشود که در برنامهنویسی رایانهای و قالببندی دادهها استفاده میشود (سمیکالن اول نقش نویسهٔ گریز را دارد که باعث میشود برنامهها سمیکالن بعدش را بهعنوان جداکننده تفسیر نکنند). این وضعیت تقریباً هیچوقت رخ نمیدهد، اما برای بیپاسخ نماندن کنجکاوی کنجکاوان :) آن را ذکر کردیم. از میان ابزارهای OSM تعداد بسیار اندکی، چنین چیزی را در خودشان پیادهسازی کردهاند.
جداکنندههای پیشین
پیش از اینکه بر سر استفاده از سمیکالن بهعنوان جداکننده به توافق برسیم نویسههای دیگری نیز پیشنهاد شده بود، شامل: "/" (خط اریب)، " " (فاصله), "-" (خط تیره), and "#" (نماد عدد). سمیکالن هماکنون مورد توافق همه است و نرمافزارهای Potlatch و JOSM نیز از آن پشتیبانی میکنند. معادلهای قدیمی را میتوانیم با سمیکالن جایگزین کنیم.
رفتار نرمافزارها
ویرایشگرها
- در Potlatch 1 و Potlatch 2 هنگامی که دو راه تگدار با کلید همنام را ترکیب کنیم، اگر مقدارها متفاوت باشند، بهطور خودکار با استفاده از سمیکالن از هم جدا میشوند و زیر یک کلید قرار میگیرند. در اکثر مواقع با این کار تگگذاری نادرستی بهوجود میآید و لازم است بهصورت دستی آن را به یک مقدار تک تغییر دهیم.
- iD در برخی موارد شما را از ترکیبکردن دو عنصر که برای یک کلید مقدارهای متفاوتی دارند باز میدارد (مثلا دو راه با تگ highway=*) متفاوت. در برخی دیگر از موارد مقدارها را با استفاده از سمیکالن ترکیب میکند (مثلا دو مکان با تگهای leisure=park و leisure=water_park). البته در این ویرایشگر اگر تگی از قبل وجود داشته باشد و دوباره کلید همان تگ را بنویسیم و مقداری به آن بدهیم، بهطور خودکار به انتهای نام کلید جدید شمارندههایی بهصورت
_1
،_2
و... اضافه میشود. - در JOSM از کاربر سوال میشود و فقط اگر صراحتاً گزینهٔ all را انتخاب کند، مقادیر با استفاده از سمیکالن با هم ترکیب میشوند.
پرداختگرها (renderers)
- Mapbox Streets برای هر کدام از برچسبهای name=* یا name:*=* نویسهٔ
;
را با یک em dash (—
) جایگزین میکند. در تگهای اصلی مانند amenity=* یا shop=* فقط اولین مقدار را در نظر میگیرد و بقیهٔ مقادیر را حذف میکند. - MapQuest Open هر کدام از مقادیر جداشده با سمیکالن در برچسب ref=* را روی یک پلاک جداگانه نمایش میدهد.
جایگزینها
اگر میخواهید طرح جدیدی ارائه کنید که احتمالا به جداسازی مقادیر با سمیکالن نیاز خواهد داشت، پیش از این کار، بررسی کنید که آیا با استفاده از فضای نام قابلیت اجرا دارد. در این شیوه از مقادیر دودویی (بله/خیر) در چندین تگ استفاده میشود. مثلاً در یک طرح فرضی برای توصیف انواع کتابها و اقلامی که در یک کتابخانه ارائه میشود، بهجای اینکه اینگونه عمل کنیم:
- amenity = library
- library:stock = books; newspapers; recorded_music
بهتر است که طرحمان را بازنویسی کنیم و مفهوم موردنظرمان را به این شکل بیان کنیم:
- amenity = library
- library:stock:books = yes
- library:stock:newspapers = yes
- library:stock:recorded_music = yes
برچسبهای payment=* و fuel=* مثالهای خوبی از راهکار دوم هستند.
برچسبهای دودویی-مقدار (مانند مثال بالا) را میتوانیم در صورت نیاز بعداً با مقدارهای جدید گسترش دهیم یا حتی زیرفضاهای نام مرتبط و جدید به آن بیفزاییم.