Block Factory'ye eklenti alanı ekleyin

Blockly Geliştirici Araçları ile blokları kullanarak özel bloklar oluşturabilirsiniz. Temel Blockly ile gelen alanların yanı sıra eklenti olarak yayınlanan alanları da destekler. Özel bir alan oluşturduysanız bu kılavuzu izleyerek Blok Fabrikası'na özel alan desteği ekleyebilirsiniz. Özel alan için destek ekleyebilmeniz için önce npm'de yayınlanması gerekir. Ayrıca, Blockly'deki değişikliklere ayak uydurmak için alanınızı güncellemeyi kabul etmeniz gerekir. Aksi takdirde, gelecekte bu alanı Blok Fabrikası'ndan kaldırmamız gerekebilir.

Blok Fabrikası'nda geliştirme

Blok Fabrikası'nın kaynak kodu, examples/developer-tools dizinindeki blockly-samples deposu içinde yer alır.

blockly-samples'daki Geliştirici Araçları'nda değişiklik göndermek için blockly-samples'da geliştirme yapmayla ilgili standart adımları uygulamanız gerekir. Ancak eklentilerle çalışmanın aksine, npm install dosyasını blockly-samples'ın kök düzeyinde değil, doğrudan examples/developer-tools dizininden çalıştırmanız gerekir.

Eklentiyi yükleme

Blok Fabrikası'nın özel alanınızı önizlemede göstermesi için özel alanın yüklenmesi gerekir. Alanınızı developer-tools'un npm bağımlılığı olarak ekleyin. Ardından, cihazı kaydedin veya developer-tools/src/blocks/index.ts'da gerekli diğer kurulum işlemlerini yapın.

Alan için bir blok oluşturma

Blok Fabrikası, özel bloklar oluşturmak için blokları kullandığından özel alanınızı temsil eden bir bloğa ihtiyacınız vardır.

Blok tanımını oluşturma

Alanınız için bloğu tasarlamanız gerekir. İsterseniz Block Factory'yi kullanarak da tasarlayabilirsiniz. Blok, kullanıcının alanınızın gerektirdiği kurulumu (ör. varsayılan değerler ve ad) yapılandırmasına olanak tanımalıdır. Bu blok tanımını developer-tools/src/blocks/fields.ts'a ekleyin ve developer-tools/src/blocks/index.ts'a aktarın.

Araç kutusuna blok ekleme

Ardından, bu bloğu araç kutusu tanımına ekleyerek kullanıcıların erişebilmesini sağlamanız gerekir. Araç kutusu tanımı developer-tools/src/toolbox.ts konumundadır. Bloğunuz "Alanlar" kategorisine eklenmelidir.

Kod Üreticiler

Blok Fabrikası, Blockly'den zaten bildiğiniz Kod Oluşturucu sistemini kullanarak çalışır. Her blokta, Blok Fabrikası tarafından oluşturulan her çıkış türü için bir blok kodu oluşturucu bulunur. Üst bloklar, alt blokların kodunu doğru çıkışta birleştirir. Özel alan desteği eklemek için CodeGenerator sınıflarının her biri için blok kodu oluşturucu işlevler eklemeniz gerekir.

output-generators/fields dizininde alan engellemeniz için bir dosya oluşturun. Bu dosyaya aşağıdaki her bir Oluşturucu için blok kodu oluşturucularını ekleyeceksiniz. Blok kodu oluşturucu işlevlerinin uygulamaya yüklenmesi için bu dosyayı blocks/index.ts dosyasına aktarın.

JavaScript tanımı

javascriptDefinitionGenerator, özel alanınızı içeren bir blok için JavaScript tanımına dahil edilecek kodu oluşturur. Genellikle bu, blok kodu oluşturucunun .appendField(new YourFieldConstructor(arg1, arg2), 'userSpecifiedName') gibi bir kod satırı döndürmesi gerektiği anlamına gelir. Birden fazla alan içeren bir giriş, appendField ile birbirine bağlanmış birkaç çağrıya sahip olacağından bu kod satırının noktalı virgül içermediğini unutmayın. Oluşturucudaki bağımsız değişkenler, kullanıcının alan bloğunda ayarladığı değerlerden alınır. FieldAngle için bu blok kodu oluşturma aracının bir örneğini aşağıda görebilirsiniz:

javascriptDefinitionGenerator.forBlock['field_angle'] = function (
  block: Blockly.Block,
  generator: JavascriptDefinitionGenerator,
): string {
  const name = generator.quote_(block.getFieldValue('FIELDNAME'));
  const angle = block.getFieldValue('ANGLE');
  return `.appendField(new FieldAngle(${angle}), ${name})`;
};

Kullanıcının Block Factory araç kutusunun "Alanlar" kategorisinden sürüklediği açı bloğunda iki alan bulunur:

  • FIELDNAME: Kullanıcı, özel yapı taşındaki alanın adını ayarlayabilir.
  • ANGLE: Kullanıcı, varsayılan açı değerini ayarlayabilir.

Bu blok kodu oluşturucuda, varsayılan açı değerini alır ve FieldAngle oluşturucusuna tek bağımsız değişken olarak iletiriz. Alan adı her zaman appendField işlevine ikinci bağımsız değişken olarak iletilir.

JSON tanımı

jsonDefinitionGenerator benzerdir ancak bu, JSON blok tanımının alanınıza karşılık gelen kısmını verir. Bu kod genellikle aşağıdakileri içeren bir JSON nesnesidir:

  • type: Blockly alan kaydındaki alanınızın adıyla eşleşir.
  • name: Kullanıcı, özel yapı taşındaki alanın adını ayarlayabilir.
  • Alanınızın JSON başlatma yöntemi için gereken diğer tüm özel özellikler.

FieldAngle ile ilgili başka bir örneği aşağıda görebilirsiniz:

jsonDefinitionGenerator.forBlock['field_angle'] = function (
  block: Blockly.Block,
  generator: JsonDefinitionGenerator,
): string {
  const code = {
    type: 'field_angle',
    name: block.getFieldValue('FIELDNAME'),
    angle: block.getFieldValue('ANGLE'),
  };
  return JSON.stringify(code);
};

Kod başlıkları

Kod Başlığı Oluşturucu, BlockFactory'de gösterilen Kod Başlıkları çıkışını oluşturur. Bu çıkış, kullanıcının kodu yükleme şekline bağlı olarak esmodule içe aktarmaları ve komut dosyası etiketleri arasında değiştirilebilir. Bu nedenle, her durum için bir tane olmak üzere iki farklı oluşturucu örneği vardır. Her biri için bir blok kodu oluşturucu eklemeniz gerekir. FieldAngle için bir örnek:

importHeaderGenerator.forBlock['field_angle'] = function (
  block: Blockly.Block,
  generator: CodeHeaderGenerator,
): string {
  generator.addHeaderLine(
    `import {registerFieldAngle, FieldAngle} from '@blockly/field-angle';`,
  );
  generator.addHeaderLine(`registerFieldAngle();`);
  return '';
};

scriptHeaderGenerator.forBlock['field_angle'] = function (
  block: Blockly.Block,
  generator: CodeHeaderGenerator,
): string {
  generator.addHeaderLine(
    `<script src="https://unpkg.com/@blockly/field-angle"></script>`,
  );
  generator.addHeaderLine(`registerFieldAngle();`);
  return '';
};

Bu oluşturucularda, alanınız kodda kullanılmadan önce çağrılması gereken bir kod satırı belirtmenize olanak tanıyan addHeaderLine adlı bir yöntem bulunur. Genellikle bu işlem, alanı içe aktarma veya bir komut dosyası etiketi aracılığıyla yükleme ve belki de alanı Blockly'nin alan kaydına kaydedecek bir işlevi çağırma gibi çalışmaları içerir.

Bu iki blok kodu oluşturucu için tüm kod, addHeaderLine çağrıları aracılığıyla eklenmelidir. Bu işlev, özel alan bloğunuz bir özel blokta birden fazla kez kullanılsa bile her başlık satırının yalnızca bir kez gösterilmesini sağlar. Blok kodu oluşturucu, boş dize döndürmelidir.

Jeneratör saplaması

Son olarak, alan için jeneratör sapı oluşturan jeneratörümüz var. Bu blok kodu oluşturucuda, kullanıcının kod oluşturmasına yardımcı olan kodlar oluşturan kodlar yazacaksınız. Kafanız karıştı mı? Göründüğünden daha kolaydır.

Özel blok için oluşturucu sapı, bloktaki her alanı temsil eden önceden oluşturulmuş bir değişken içerir. Ardından, kullanıcının özel bloğunun döndüreceği son kod dizesinde tüm bu değişkenleri bir araya getirmek için TODO gerekir. Bu nedenle, blok kodu oluşturucunuzun genellikle yapması gereken tek şey bu özel değişkeni oluşturan satırı döndürmektir. Kullanıcının tuvaline güneş ışınları ekleyecek özel bir blok oluşturduğunu varsayalım. Bloka bir açı alanı ekleyip "SUN_DIRECTION" olarak adlandırır. Bu blok için oluşturulan saplama, const angle_sun_direction = block.getFieldValue("SUN_DIRECTION"); satırını içerir. Açı alanı için blok kodu oluşturucumuzun döndürmesi gereken kod satırı şudur:

generatorStubGenerator.forBlock['field_angle'] = function (
  block: Blockly.Block,
  generator: GeneratorStubGenerator,
): string {
  const name = block.getFieldValue('FIELDNAME');
  const fieldVar = generator.createVariableName('angle', name);
  return `const ${fieldVar} = block.getFieldValue(${generator.quote_(
    name,
  )});\n`;
};

Değişken için standartlaştırılmış bir ad almak üzere generator.createVariableName işlevini çağırabilir ve alanınızın türünü (ör. angle, number vb.) kullanıcının alanına verdiği adla birlikte iletebilirsiniz.

Test etme

Bu parçaların hepsini yazdıktan sonra, npm start komutunu blockly-samples/examples/developer-tools dizininde çalıştırarak BlockFactory'yi başlatabilirsiniz. Blokunuzu alan kategorisinden sürükleyip bir bloktaki girişe ekleyebilir ve çıkışın değişmesini izleyebilirsiniz. Bloğun önizlemesinin doğru göründüğünü ve çıkış bölümlerinin her birine ait kodun doğru olduğunu kontrol edin.