Blockly Geliştirici Araçları, blokları kullanarak özel bloklar oluşturmanıza olanak tanır. Temel Blockly ile birlikte gelen alanların yanı sıra eklenti olarak yayınlanan alanları da destekler. Özel bir alan oluşturduysanız bu kılavuzu takip ederek Block Factory'ye bu alan için destek ekleyebilirsiniz. Özel alana 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 taahhüt etmeniz gerekir. Aksi takdirde, gelecekte alanınızı Block Factory'den kaldırmamız gerekebilir.
Blok Fabrikası'nda Geliştirme
Block Factory'nin kaynak kodu, examples/developer-tools
dizinindeki bloklu örnekler deposunda bulunur.
Blok içeren örneklerde Geliştirici Araçları ile ilgili bir değişiklik göndermek için bloklu örneklerde geliştirmeyle ilgili tipik adımları uygulamanız gerekir. Ancak eklentilerle çalışmanın aksine npm
install
öğesini bloklu örneklerin kök düzeyi yerine doğrudan examples/developer-tools
dizininden çalıştırmanız gerekir.
Eklentiyi yükleme
Block Factory'nin, özel alanınızı önizlemede göstermesi için özel alanı yüklemeniz gerekir. Alanınızı, geliştirici araçlarının npm bağımlılığı olarak ekleyin. Ardından, uygulamayı kaydedin veya developer-tools/src/blocks/index.ts
'te gerekli diğer kurulum işlemlerini yapın.
Alan için bir blok oluştur
Block Factory özel bloklar oluşturmak için blokları kullandığından özel alanınızı temsil eden bir bloka ihtiyacınız vardır.
Blok tanımı oluşturma
Alanınız için blok tasarlamanız gerekir. Meta almak istiyorsanız Blok Fabrikası'nı kullanarak bile blok tasarlayabilirsiniz! Blok, kullanıcının alanınızın gerektirdiği ayarları (ör. varsayılan değerler ve ad) yapılandırmasına izin vermelidir. Bu engelleme tanımını developer-tools/src/blocks/fields.ts
öğesine ekleyin ve developer-tools/src/blocks/index.ts
içine aktarın.
Araç kutusuna blok ekle
Daha sonra, bu bloğu kullanıcıların erişebilmesi için araç kutusu tanımına eklemeniz gerekir. Araç kutusu tanımı developer-tools/src/toolbox.ts
içindedir. Blokunuz "Fields" kategorisine
eklenmelidir.
Kod Oluşturucular
Block Factory, Blockly'den aşina olduğunuz Code Generator sistemini kullanarak çalışır. Her blokta, Block Factory tarafından oluşturulan her çıkış türü için bir blok kodu oluşturucu bulunur ve üst bloklar, alt blokların kodunu doğru çıkışta bir araya getirir. Özel bir alan için destek eklemek isterseniz Kod Oluşturucu sınıflarının her biri için blok kodu oluşturucu işlevleri eklemeniz gerekir.
output-generators/fields
dizininde alan blokunuz için bir dosya oluşturun. Bu dosyaya aşağıdaki Oluşturucuların her biri için blok kodu oluşturucuları 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şturma aracının .appendField(new YourFieldConstructor(arg1, arg2), 'userSpecifiedName')
gibi bir kod satırı döndürmesi gerektiği anlamına gelir. Bu kod satırı noktalı virgül içermez çünkü birden fazla alan içeren bir giriş birlikte zincirlenmiş birden fazla appendField
çağrısına sahip olur. Yapıcıdaki 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şturucunun bir örneğini aşağıda bulabilirsiniz:
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 Blok Fabrikası araç kutusunun "Alanlar" kategorisinden sürüklediği açı bloğunda iki alan bulunur:
FIELDNAME
: Kullanıcı, özel bloğundaki alanın adını ayarlayabilirANGLE
: kullanıcı varsayılan açı değerini ayarlayabilir
Bu blok kodu oluşturma aracında, varsayılan açı değerini alıp FieldAngle
oluşturucuya 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 bölümünü oluşturur. Genellikle bu kod aşağıdakileri içeren bir JSON nesnesidir:
type
: Blockly alan kaydındaki alanınızın adına karşılık gelir.name
: Kullanıcı, özel bloğundaki alanın adını ayarlayabilir- alanınızın json başlatma yönteminin gerektirdiği diğer özel özellikleri de değiştirebilirsiniz.
FieldAngle
alanından bir örnek daha:
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 Üstbilgisi Oluşturucu, Blok Fabrikası'nda gösterilen Kod Üstbilgileri çıkışını oluşturur. Bu çıkış, kullanıcının kodu nasıl yüklemek istediğine bağlı olarak esmodule içe aktarma işlemleri ve komut dosyası etiketleri arasında değiştirilebilir. Böylece, aslında her biri için bir tane olmak üzere iki farklı oluşturucu örneği vardır. Her biri için bir blok kodu
oluşturma aracı 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şturucular, alanınız kodda kullanılmadan önce çağrılması gereken bir kod satırı belirtmenizi sağlayan addHeaderLine
adlı bir yönteme sahiptir. Genellikle bu, alanı içe aktarma veya bir komut dosyası etiketi aracılığıyla yükleme gibi işleri ve belki alanı Blockly'nin alan kaydına kaydedecek bir işlevin çağrılmasını içerir.
Bu iki blok kodu oluşturucu için tüm kodun, addHeaderLine
öğesine yapılan çağrılar aracılığıyla eklenmesi gerekir. Bu işlev, özel alan blokunuz bir özel blokta birden çok kez kullanılsa bile her başlık satırının yalnızca bir kez gösterilmesini sağlar. Blok kodu oluşturma aracı boş dize döndürmelidir.
Jeneratör sapı
Son olarak, alan için jeneratör sapını oluşturan jeneratörümüz var. Bu blok kodu oluşturma aracında, kullanıcının kod üreten kodu yazmasına yardımcı olan kod yazacaksınız. Kafanız mı karıştı? Göründüğünden daha kolay.
Özel bir blok için oluşturucu sapı, bloktaki her alanı temsil eden önceden hazırlanmış bir değişken içerir. Kullanıcının tüm bu değişkenleri özel blokunun döndüreceği son kod dizesinde birleştirmek için tamamlaması gereken bir TODO
vardır. Bu, genellikle blok kodu oluşturma aracınızın yapması gereken tek şeyin, bu özel değişkeni oluşturan satırı döndürmek olduğu anlamına gelir. Kullanıcının tuvaline güneş ışınları ekleyecek özel bir blok yaptığını varsayalım. Bloğuya bir açı alanı ekler ve bloka "SUN_DIRECTION"
adını verir. Bu blok için oluşturucu sapı const angle_sun_direction =
block.getFieldValue("SUN_DIRECTION");
satırını içerir. Bu, açı alanı için blok kodu oluşturucumuzun döndürmesi gereken kod satırıdır:
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 elde etmek üzere generator.createVariableName
yöntemini çağırabilir ve alanınızın türünü (angle
, number
vb.) ve kullanıcının alanına adlandırdığı bilgiyi iletebilirsiniz.
Test et
Tüm bu parçaları yazdıktan sonra blockly-samples/examples/developer-tools
dizininde npm start
komutunu çalıştırarak Blok Fabrikası'nı başlatabilmeniz gerekir. Blokunuzu alan kategorisinden sürükleyebilir, bloktaki bir girişe ekleyebilir ve çıkıştaki değişimi izleyebilirsiniz. Blok önizlemesinin düzgün göründüğünden ve çıkış bölümlerinin her biri için kodun doğru olduğundan emin olun.