Manual:ContentHandler

From mediawiki.org
Jump to navigation Jump to search
This page is a translated version of the page Manual:ContentHandler and the translation is 100% complete.
Other languages:
English • ‎Türkçe • ‎polski • ‎日本語

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 İçerik işleyicileri 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 Multi-Content Revisions 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 page tablosunda (ayrıca revision ve archive tablolarında) yapılır ve Title, Revision ve WikiPage 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 revision tablosunda (ayrıca archive tablosunda ancak page tablosunda değil) yapılır ve Revision 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: page tablosu geçerli revizyon için içerik modelini kaydederken, revision, 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:

  • Content 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 ContentHandler 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 DifferenceEngine, EditPage, DifferenceEngine 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 Revision ve WikiPage) 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 (Revision::getText() vb. gibi) yerinde kalır ve bunun yerine içerik nesnesine erişime izin veren alternatif bir yöntemle tamamlanır (örneğin Revision::getContent()). 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 ContentHandler::getContentText() sağlanmıştır. Vikimetin (aynı zamanda JS ve CSS) gibi düz metin tabanlı içerik modelleri için, getContentText() 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. Bununla birlikte, vikimetin (veya başka bir düz metin içerik modeli, böyle bir CSS) içermeyen bir sayfa/revizyonda metin tabanlı geriye dönük uyumlu bir yöntem çağrıldığında, davranış $wgContentHandlerTextFallback ayarına bağlıdır: ignore, boş döndürmesini sağlar, fail bir istisna oluşturmasına ve serialize içeriğin varsayılan serileştirmesini döndürmesine neden olur. Varsayılan, çoğu senaryoda muhtemelen en muhafazakar seçenek olan ignore olur.

Ancak düzenleme için metin olmayan içerik varsayılan olarak desteklenmez. EditPage ve eylem API'sindeki ilgili işleyiciler metinsel olmayan içerik için başarısız olacak.

Bağlantılar

Content ve ContentHandler sınıfları
Ayarlar
ContentHandler kullanan uzantılar

Kod yönetimi