Manual:ContentHandler/tr

ContentHandler özelliği, her şey için vikimetine güvenmek yerine, viki sayfalarındaki gelişigüzel içerik türlerini destekleyen bir mekanizmadır. Vikiveri projesinin bir parçası olarak geliştirilmiştir ve 1.21 sürümünden bu yana MediaWiki çekirdeğinin bir parçasıdır.

ContentHandler mimarisine kanonik genel bakış için, MediaWiki kod belgelerinde ContentHandler adresinde bakın.

Kullanılabilir içerik işleyicilerinin bir listesi için sayfasına bakın.

Hakkında
Bu oldukça radikal değişikliğin ardındaki mantık, tüm içerik için vikimetine güvenmeye zorlanmanın MediaWiki'de pek çok şeyi oldukça hantal hâle getirmesidir. Keyfi sayfa içeriği türleri için yeni takılabilir mimari, umarız:


 * tex veya markdown gibi bazı veya tüm sayfalarda farklı bir biçimlendirme dili kullanın.
 * CSS ve JavaScript sayfaları için özel durumlardan kurtulun.
 * yapılandırılmış yapılandırma verilerini, örn. Gadgets uzantısının MediaWiki:Gadgets-definition veya LanguageConverter MediaWiki:Conversiontable*** sayfalarında ne kullandığı.
 * vikimetin sayfalarına veri "ekleri" sağlayın, ör. coğrafi veriler için (sayfa için bir "çok parçalı" içerik modeli kullanarak, çok parçalı mesaj biçimi kullanılarak e-posta eklerinin uygulanmasına benzer şekilde). (Not: Bu hiçbir zaman gerçekleşmedi ve şimdi ile değiştirildi.)
 * kategorilerin vb. vikimetinin kendisinde tutulmadığı, ancak yine de normal şekilde saklanıp sürümlendirildiği bir sisteme geçiş (yine çok parçalı içerik modeli kullanılarak).
 * Vikiveri için yapılandırılmış verileri sayfa içeriği olarak kolay ve yerel bir şekilde depolayın.

Tasarım fikiri
Buradaki fikir, diğer türden verileri tam olarak vikimetinin şu anda depolandığı şekilde depolamak, ancak MediaWiki'yi her sayfa için ilgilendiği içerik türünden haberdar etmektir. Bu şekilde, her türlü veri bir viki sayfasının içeriği olarak kullanılabilir ve aynen eskisi gibi depolanır ve sürümü oluşturulur. Bunu başarmak için MediaWiki çekirdeğinde aşağıdakiler uygulandı:


 * her sayfanın içerik modelini takip edin. Bu, öncelikle veritabanındaki tablosunda (ayrıca  ve  tablolarında) yapılır ve ,   ve   gibi ilgili çekirdek sınıflar aracılığıyla erişilebilir hâle getirilir. İçerik modeli, ister metin içeren bir dize, ister dizilerin iç içe geçmiş yapısı veya bir PHP nesnesi olsun, içeriğin yerel formunu tanımlar. İçerikle ilgili tüm işlemler kendi yerel formu üzerinde gerçekleştirilir.
 * her revizyonun içerik formatını (serileştirme formatı) takip edin. Bu, öncelikle veritabanındaki tablosunda (ayrıca  tablosunda ancak  tablosunda değil) yapılır ve   gibi ilgili çekirdek sınıflar aracılığıyla erişilebilir hâle getirilir. Serileştirme formatının yalnızca revizyon yüklenirken ve depolanırken geçerli olduğunu, içeriğin serileştirilmiş formunda hiçbir işlem yapılmadığını unutmayın.
 * Not: Düz metin içeriği (vikimetin gibi) söz konusu olduğunda, içeriğin yerel biçimi serileştirilmiş biçimle (yani bir dize) aynıdır. Bununla birlikte, makul bir şekilde, yerel vikimetin formu gelecekte bir çeşit AST veya DOM olabilir.
 * Not: tablosu geçerli revizyon için içerik modelini kaydederken,, içerik modelini ve serileştirme formatını kaydeder. Model ve format teoride revizyondan revizyona değişebilir, ancak bu kafa karıştırıcı olabilir ve anlamlı farklılıklara izin vermez.

Bu, içerik üzerinde herhangi bir işlem gerçekleştirmesi gereken tüm kodun, içeriğin yerel biçiminin farkında olması gerektiği anlamına gelir. Bu bilgi, iki sınıfa dayalı, takılabilir bir işleyici çerçevesi kullanılarak özetlenmiştir:


 * sınıfı, içeriği olduğu gibi temsil eder ve içeriğin yerel formunda gerçekleştirilecek tüm standart işlemler için bir arabirim sağlar. İçeriğin ait olduğu sayfa veya revizyon bilgisi yoktur. İçerik nesneleri genellikle, ancak zorunlu değildir, değişmezdir.
 * Somut İçeriğe erişimi olmayan bir içerik modelinin özellikleri hakkındaki bilgiyi temsil eden  sınıfı. En önemlisi, ContentHandler örnekleri, Content nesneleri için bir fabrika görevi görür ve serileştirme/seriyi kaldırma sağlar. ContentHandler nesneleri, her içerik modeli için bir tane olmak üzere durum bilgisiz tekil nesnelerdir.

ContentHandler ayrıca,  ,   vb. alt sınıfların uygun örneklerini oluşturmak için kullanılır. Bu şekilde, her içerik türü için özelleştirilmiş bir kullanıcı arabirimi, ContentHandler arabirimi aracılığıyla kolayca takılabilir.

Revizyon metnine herhangi bir şekilde erişen tüm kod, bunun yerine Content nesnesi tarafından sağlanan yöntemleri kullanmak için değiştirilmelidir. Revizyon metnine erişim sağlayan temel sınıflar (en önemlisi  ve  ) metin yerine uygun Content nesnesine erişim sağlayacak şekilde uyarlanmıştır.

Geriye dönük uyumluluk
Sayfaların vikimetin içerdiği varsayımı, MediaWiki kod tabanı aracılığıyla yaygındır. Kodun hâlâ bunu varsayan bölümleriyle, özellikle uzantılarla uyumlu kalmak, bu nedenle oldukça önemlidir. İyi bir uyumluluk sağlamanın doğru yolu elbette genel arayüzleri değiştirmemektir. Bu nedenle, revizyon içeriğine erişim sağlayan tüm yöntemler ( vb. gibi) yerinde kalır ve bunun yerine içerik nesnesine erişime izin veren alternatif bir yöntemle tamamlanır (örneğin  ). Metin tabanlı yöntemler artık kullanımdan kaldırılmıştır, ancak vikimetin içeren tüm sayfalar/revizyonlar için tam olarak eskisi gibi çalışacaktır. Bu aynı zamanda eylem API için de geçerlidir.

Bir sayfanın metnini almayı kolaylaştırmak için bir kolaylık yöntemi olan  sağlanmıştır. Vikimetin (aynı zamanda JS ve CSS) gibi düz metin tabanlı içerik modelleri için,  yalnızca metni döndürür, bu nedenle eski metin tabanlı yöntem, bu tür revizyonlar için daha önce olduğu gibi döndürür. However, in case a text-based backwards-compatible method is called on a page/revision that does not contain wikitext (or another flat text content model, such a CSS), the behavior depends on the setting of : ignore makes it return null, fail causes it to raise an exception, and serialize causes it to return the default serialization of the content. The default is ignore, which is probably the most conservative option in most scenarios.

For editing however, non-text content is not supported per default. and the respective handlers in the action API will fail for non-textual content.

Links

 * and  classes :


 * Settings :


 * Extensions using ContentHandler :
 * How to add a new content model with an extension:
 * Basic example: Extension:Markdown
 * The extension
 * — a list of all content models (both in core and extensions)
 * — a list of all content models (both in core and extensions)